mongodb副本集即客戶端連接到整個(gè)副本集缤削,不關(guān)心具體哪一臺(tái)機(jī)器是否掛掉瘦棋。主服務(wù)器負(fù)責(zé)整個(gè)副本集的讀寫(xiě)猖闪,副本集定期同步數(shù)據(jù)備份鲜棠,一旦主節(jié)點(diǎn)掛掉,副本節(jié)點(diǎn)就會(huì)選舉一個(gè)新的主服務(wù)器萧朝,這一切對(duì)于應(yīng)用服務(wù)器不需要關(guān)心岔留。副本集中的副本節(jié)點(diǎn)在主節(jié)點(diǎn)掛掉后通過(guò)心跳機(jī)制檢測(cè)到后夏哭,就會(huì)在集群內(nèi)發(fā)起主節(jié)點(diǎn)的選舉機(jī)制检柬,自動(dòng)選舉一位新的主服務(wù)器。選舉還有個(gè)前提條件,參與選舉的節(jié)點(diǎn)數(shù)量必須大于副本集總節(jié)點(diǎn)數(shù)量的一半何址,如果已經(jīng)小于一半了所有節(jié)點(diǎn)保持只讀狀態(tài)里逆。因此,官方推薦我們的副本集機(jī)器數(shù)量至少為3個(gè):一個(gè)主節(jié)點(diǎn)用爪,兩個(gè)副本節(jié)點(diǎn)原押。當(dāng)然,mongodb副本集中可以有很多類型的節(jié)點(diǎn)偎血,其中有一個(gè)仲裁節(jié)點(diǎn)诸衔,即當(dāng)參與選舉的節(jié)點(diǎn)無(wú)法選出主節(jié)點(diǎn)時(shí)仲裁節(jié)點(diǎn)充當(dāng)仲裁的作用。仲裁節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù)颇玷,只是仲裁笨农。所以,我們的副本集可以設(shè)置為:1主+1從+1仲裁帖渠。
那么我們準(zhǔn)備3臺(tái)服務(wù)器:192.168.198.224(主)谒亦,192.168.198.225(從),192.168.198.226(仲裁)空郊。
1份招、分別在每臺(tái)機(jī)器上下載解壓mongodb安裝包
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.4.6.tgz
tar -zxvf mongodb-linux-x86_64-amazon-3.4.6.tgz
mv mongodb-linux-x86_64-amazon-3.4.6/ /usr/local/mongodb
2、分別在每臺(tái)機(jī)器上創(chuàng)建mongodb的data狞甚、log以及配置目錄
cd /usr/local/mongodb
mkdir -p data/db
mkdir log
touch log/mongod.log
mkdir etc
touch etc/mongod.conf
3锁摔、分別在每臺(tái)機(jī)器上配置config文件
vim etc/mongod.conf
為了啟動(dòng)方便,我們可以將mongodb的啟動(dòng)配置項(xiàng)直接在配置文件中:
dbpath = /usr/local/mongodb/data/db? ? ? ? # 指定數(shù)據(jù)庫(kù)路徑
logpath = /usr/local/mongodb/log/mongod.log? ? ? ? ? # 指定mongodb日志文件
logappend = true ? ? ? ?# 使用追加的方式寫(xiě)日志
port = 27017 ? ? ? ? ? ? ? #設(shè)置端口號(hào)為27017
fork = true ? ? ? ? ? ? ? ? ? #設(shè)置以守護(hù)進(jìn)程的方式啟動(dòng)mongod
replSet = myrs ? ? ? ? ? ?#設(shè)置副本集的名字為myrs哼审,同一副本集群的replSet名稱必需相同
4鄙漏、分別在每臺(tái)機(jī)器上啟動(dòng)副本集
cd /usr/local/mongodb
./bin/mongod -f ./etc/mongod.conf ? ?#指定以mongod.conf配置啟動(dòng)mongod
5、初始化副本集
登錄任意一臺(tái)機(jī)器的mongodb后臺(tái)管理shell:
cd /usr/local/mongodb
./bin/mongo
use admin
config = {
"_id":"myrs",
"members":[
? {"_id":0,"host":"192.168.198.224:27017"},
? {"_id":1,"host":"192.168.198.225:27017"},
? {"_id":2,"host":"192.168.198.226:27017",arbiterOnly:true}
]
}
rs.initiate(config); ? #初始化配置
注意:如果執(zhí)行rs.initiate(config)報(bào)錯(cuò)棺蛛,那么我們需要檢查三臺(tái)服務(wù)器的防火墻27017端口是否開(kāi)放怔蚌。 如果沒(méi)有問(wèn)題,我們可以查看集群節(jié)點(diǎn):
rs.status();
至此旁赊,整個(gè)副本集已經(jīng)搭建成功了桦踊。
那么,我們可以測(cè)試一下副本集的基本功能:
1终畅、測(cè)試副本集的數(shù)據(jù)復(fù)制功能
此時(shí)在我的機(jī)器上192.168.198.224是主節(jié)點(diǎn)籍胯,我們用mongo來(lái)登錄shell。
cd /usr/local/mongodb
./bin/mongo
use test? #創(chuàng)建test數(shù)據(jù)庫(kù)
db.testdb.insert({"name":"yaya"}); ? ? ? #插入數(shù)據(jù)
我們用副本節(jié)點(diǎn)登錄shell离福,我這里是192.168.198.225:
cd /usr/local/mongodb
./bin/mongo
use test
show tables
此時(shí)會(huì)報(bào)錯(cuò):
[thread1] Error: listCollections failed: {
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
}?
因?yàn)閙ongodb默認(rèn)是從主節(jié)點(diǎn)讀寫(xiě)數(shù)據(jù)的杖狼,副本節(jié)點(diǎn)上不允許讀,需要設(shè)置副本節(jié)點(diǎn)可以讀妖爷。
myrs:SECONDARY> db.getMongo().setSlaveOk();
此時(shí)就可以讀取數(shù)據(jù)了:
repset:SECONDARY> db.testdb.find();
控制臺(tái)輸出:{ "_id" : ObjectId("59676d711881041abab44477"), "name" : "yaya" }
所以蝶涩,數(shù)據(jù)復(fù)制的功能是可用的。
2、測(cè)試副本集的故障轉(zhuǎn)移功能
將主節(jié)點(diǎn)192.168.198.224的mongod進(jìn)程殺死:
myrs:PRIMARY> use admin
myrs:PRIMARY> db.shutdownServer()
此時(shí)可以看到绿聘,192.168.198.225原本是副節(jié)點(diǎn)嗽上,此時(shí)自動(dòng)轉(zhuǎn)換為主節(jié)點(diǎn)∠ㄈ粒可以通過(guò)rs.status()來(lái)查看兽愤。