1. 什么是副本集
副本集就是mongoDB副本所組成的一個集群。
同期原理是,寫操作發生在主庫,從庫同步主庫的OpLog日志。
集群中沒有特定的主庫,主庫是選舉產生,如果主庫down了,會再選舉出一台主庫。
mongoDB也可以配置成主從模式,但,官方已經不建議使用主從模式了,替代方案是采用副本集的模式。
副本集有以下特點:
1. 最小構成是:primary,secondary,arbiter,一般部署是:primary,2 secondary。
2. 成員數應該為奇數,如果為偶數的情況下添加arbiter,arbiter不保存數據,只投票。
3. 最大50 members,但是只能有 7 voting members,其他是non-voting members。
2. 配置副本集
本次實驗,配置的是1主2從的副本集。
test166:27017,test167:27017,test167:27018
關於mongoDB的安裝和使用,請參考mongoDB系列之(一):10分鍾玩轉mongoDB
2.1 創建副本集
在3台服務器上啟動mongoDB,指定副本集的名字為rs0
test166上啟動第一個mongoDB
# mongod --dbpath /var/lib/mongo --replSet rs0
test167上啟動第二個mongoDB
# mongod --dbpath /var/lib/mongo --replSet rs0
test167上啟動第三個mongoDB,指定端口為27018
# mkdir -p /data/mongo # mongod --dbpath /data/mongo --port 27018 --replSet rs0
也可以在設定文件中指定,然后啟動
# vi /etc/mongod.conf replication: replSetName: rs0
# systemctl start mongod
2.2 配置副本集
在任意一台上連接mongodb,初始化
# mongo > use admin > rs.initiate()
確認設定
rs0:PRIMARY> rs.conf()
添加成員到副本集
先在/etc/hosts設定hostname
添加第一個從庫,test167:27017
rs0:PRIMARY> rs.add('test167:27017')
添加第二個從庫,test167:27018
可以通過priority來調整主庫,選舉的時候,priority大的優先被選舉為主庫
rs0:PRIMARY> rs.add({host: "test167:27018", priority: 5})
確認設定
rs0:PRIMARY> rs.conf()
查看狀態
rs0:SECONDARY> rs.status()
移除從庫
先關閉從庫的mongoDB,然后在主庫上移除從庫
rs0:PRIMARY> rs.remove('test166:27019')
2.3 同期動作確認
在主庫上插入一條記錄
> db.user.insert({"username":"test","age":12,"sex":"m"})
在從庫上查看數據已經同期
rs0:SECONDARY> db.getMongo().setReadPref('secondaryPreferred') rs0:SECONDARY> use new2 rs0:SECONDARY> db.user.find()
2.4 Failover動作
副本集heartbeat ping 2秒一次,10秒沒有回應認為down了。
Priority最高的被選舉為主庫,Priority 0的不能升為主。
Optime最高的從庫才能被選為主庫。
主庫需要能連到其他從庫,1主2從的情況下,down掉2台的情況下,不會選舉出主庫。
關閉主庫
> use admin > db.shutdownServer()
在從庫上查看副本集狀態,可以看到一個從庫升級為主庫
rs0:SECONDARY> rs.status()
啟動關閉的前主庫,查看副本集狀態,看到主庫降為從庫,前主庫成為主庫
rs0:SECONDARY> rs.status()
備注:因為是使用OpLog日志同期,前主庫down掉的時間內,在1主1從構成下發生的數據更新,前主庫啟動后,會同期過來
3. 讀寫分離
主庫,從庫都支持讀操作。但是,默認情況讀也是從主庫來讀。
從庫可以通過設置ReadPreference打開支持讀操作,ReadPreference有幾種模式:
Primary #從主的讀,默認
primaryPreferred #基本上從主的讀,主不可用時,從從的讀
secondary #從從的讀
secondaryPreferred #基本上從從的讀,從不可用時,從主的讀
nearest #從網絡延遲最小的讀
基本上常用的是,Primary,secondary,nearest
副本集的設定中可以通過Tag把成員歸類,通過下面方法指定讀的類型:
1,程序連接的時候,指定讀的類型ReadPreference
2,用mongo命令連接,只對當前連接有效
rs0:SECONDARY> db.getMongo().setReadPref('secondaryPreferred')
4. 特殊成員類型
Secondary還有一些特殊的成員類型:
Priority 0 #不能升為主,可以用於多數據中心場景
Hidden #對客戶端來說是不可見的,一般用作備份或統計報告用
Delayed #數據比副集晚,一般用作 rolling backup 或歷史快照
5. 后記
本次介紹了副本集的配置,下次將會介紹分片(Sharding)。