mongodb副本集即客戶端連接到整個副本集,不關心具體哪一臺機器是否掛掉。主服務器負責整個副本集的讀寫,副本集定期同步數據備份,一旦主節(jié)點掛掉,副本節(jié)點就會選舉一個新的主服務器,這一切對于應用服務器不需要關心。副本集中的副本節(jié)點在主節(jié)點掛掉后通過心跳機制檢測到后,就會在集群內發(fā)起主節(jié)點的選舉機制,自動選舉一位新的主服務器。選舉還有個前提條件,參與選舉的節(jié)點數量必須大于副本集總節(jié)點數量的一半,如果已經小于一半了所有節(jié)點保持只讀狀態(tài)。因此,官方推薦我們的副本集機器數量至少為3個:一個主節(jié)點,兩個副本節(jié)點。當然,mongodb副本集中可以有很多類型的節(jié)點,其中有一個仲裁節(jié)點,即當參與選舉的節(jié)點無法選出主節(jié)點時仲裁節(jié)點充當仲裁的作用。仲裁節(jié)點不存儲數據,只是仲裁。所以,我們的副本集可以設置為:1主+1從+1仲裁。
那么我們準備3臺服務器:192.168.198.224(主),192.168.198.225(從),192.168.198.226(仲裁)。
1、分別在每臺機器上下載解壓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、分別在每臺機器上創(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、分別在每臺機器上配置config文件
vim etc/mongod.conf
為了啟動方便,我們可以將mongodb的啟動配置項直接在配置文件中:
dbpath = /usr/local/mongodb/data/db? ? ? ? # 指定數據庫路徑
logpath = /usr/local/mongodb/log/mongod.log? ? ? ? ? # 指定mongodb日志文件
logappend = true ? ? ? ?# 使用追加的方式寫日志
port = 27017 ? ? ? ? ? ? ? #設置端口號為27017
fork = true ? ? ? ? ? ? ? ? ? #設置以守護進程的方式啟動mongod
replSet = myrs ? ? ? ? ? ?#設置副本集的名字為myrs,同一副本集群的replSet名稱必需相同
4、分別在每臺機器上啟動副本集
cd /usr/local/mongodb
./bin/mongod -f ./etc/mongod.conf ? ?#指定以mongod.conf配置啟動mongod
5、初始化副本集
登錄任意一臺機器的mongodb后臺管理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)報錯,那么我們需要檢查三臺服務器的防火墻27017端口是否開放。 如果沒有問題,我們可以查看集群節(jié)點:
rs.status();
至此,整個副本集已經搭建成功了。
那么,我們可以測試一下副本集的基本功能:
1、測試副本集的數據復制功能
此時在我的機器上192.168.198.224是主節(jié)點,我們用mongo來登錄shell。
cd /usr/local/mongodb
./bin/mongo
use test? #創(chuàng)建test數據庫
db.testdb.insert({"name":"yaya"}); ? ? ? #插入數據
我們用副本節(jié)點登錄shell,我這里是192.168.198.225:
cd /usr/local/mongodb
./bin/mongo
use test
show tables
此時會報錯:
[thread1] Error: listCollections failed: {
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
}?
因為mongodb默認是從主節(jié)點讀寫數據的,副本節(jié)點上不允許讀,需要設置副本節(jié)點可以讀。
myrs:SECONDARY> db.getMongo().setSlaveOk();
此時就可以讀取數據了:
repset:SECONDARY> db.testdb.find();
控制臺輸出:{ "_id" : ObjectId("59676d711881041abab44477"), "name" : "yaya" }
所以,數據復制的功能是可用的。
2、測試副本集的故障轉移功能
將主節(jié)點192.168.198.224的mongod進程殺死:
myrs:PRIMARY> use admin
myrs:PRIMARY> db.shutdownServer()
此時可以看到,192.168.198.225原本是副節(jié)點,此時自動轉換為主節(jié)點。可以通過rs.status()來查看。