1、副本集/復(fù)制集:
mongo副本集/復(fù)制集是mongo高可用性特征之一,是有自動(dòng)故障恢復(fù)功能的主要集群。由一個(gè)Primary節(jié)點(diǎn)和一個(gè)或多個(gè)Secondary節(jié)點(diǎn)組成。
復(fù)制集
復(fù)制是在多臺(tái)服務(wù)器之間同步數(shù)據(jù)的過程,由一組Mongod實(shí)例(進(jìn)程)組成,包含一個(gè)Primary節(jié)點(diǎn)和多個(gè)Secondary節(jié)點(diǎn)
Mongodb Driver(客戶端)的所有數(shù)據(jù)都寫入Primary,Secondary從Primary同步寫入的數(shù)據(jù)
通過上述方式來保持復(fù)制集內(nèi)所有成員存儲(chǔ)相同的數(shù)據(jù)集,提供數(shù)據(jù)的高可用
復(fù)制的目的
Failover (故障轉(zhuǎn)移,故障切換,故障恢復(fù))
Redundancy(數(shù)據(jù)冗余)
避免單點(diǎn),用于災(zāi)難時(shí)恢復(fù),報(bào)表處理,提升數(shù)據(jù)可用性
讀寫分離,分擔(dān)讀壓力
對(duì)用戶透明的系統(tǒng)維護(hù)升級(jí)
復(fù)制集的原理
主節(jié)點(diǎn)記錄所有的變更到oplog日志
輔助節(jié)點(diǎn)(Secondary)復(fù)制主節(jié)點(diǎn)的oplog日志并且將這些日志在輔助節(jié)點(diǎn)進(jìn)行重放(做)
各個(gè)節(jié)點(diǎn)之間會(huì)定期發(fā)送心跳信息,一旦主節(jié)點(diǎn)宕機(jī),則觸發(fā)選舉一個(gè)新的主節(jié)點(diǎn),剩余的輔助節(jié)點(diǎn)指向新的主
10s內(nèi)各輔助節(jié)點(diǎn)無法感知主節(jié)點(diǎn)的存在,則開始觸發(fā)選舉
通常1分鐘內(nèi)完成主輔助節(jié)點(diǎn)切換,10-30s內(nèi)感知主節(jié)點(diǎn)故障,10-30s內(nèi)完成選舉及切換
復(fù)制≠備份
用戶恢復(fù)數(shù)據(jù),防止數(shù)據(jù)丟失,實(shí)現(xiàn)災(zāi)難恢復(fù)
人為誤操作導(dǎo)致數(shù)據(jù)刪除,程序Bug導(dǎo)致數(shù)據(jù)損壞等
Primary
首要復(fù)制節(jié)點(diǎn),由選舉產(chǎn)生,提供讀寫服務(wù)的節(jié)點(diǎn),產(chǎn)生oplog日志
Secondary
備用(輔助)復(fù)制節(jié)點(diǎn),Secondary可以提供讀服務(wù),增加Secondary節(jié)點(diǎn)可以提供復(fù)制集的讀服務(wù)能力
在故障時(shí),備用節(jié)點(diǎn)可以根據(jù)設(shè)定的優(yōu)先級(jí)別提升為首要節(jié)點(diǎn)。提升了復(fù)制集的可用性
Arbiter
Arbiter節(jié)點(diǎn)只參與投票,不能被選為Primary,并且不從Primary同步數(shù)據(jù)
Arbiter本身不存儲(chǔ)數(shù)據(jù),是非常輕量級(jí)的服務(wù)。
當(dāng)復(fù)制集成員為偶數(shù)時(shí),最好加入一個(gè)Arbiter節(jié)點(diǎn),以提升復(fù)制集可用性
2、環(huán)境搭建:
Mongodb版本3.0以上, 三臺(tái)服務(wù)器均為64位
三臺(tái)服務(wù)器 ? ?-------- ?Primary(Centos7)、 Secondary(Centos7)、 Secondary(Debian8);架設(shè)IP分別為 192.168.1.1、1.2、 1.3
三臺(tái)服務(wù)器關(guān)閉防火墻 ? ?-------- systemctl ?stop firewalld.service
三臺(tái)服務(wù)器修改mongo配置文件 ? ?-------- ?vi ?/etc/mongod.conf?
? ? ? ? 偵聽地址除了 localhost 外再加上服務(wù)器IP; 設(shè)置復(fù)制集名字(RepliSetName)。

開啟mongod服務(wù): mongod
三臺(tái)服務(wù)器mongo各自初始化: rs.initiate()
Primary上副本集配置:
rsconf(配置名稱,可隨意取)={_id:"副本集名",member:[{_id:0,host:"IP:port",priority:2},{_id:1,host:"IP:port",priority:1},{_id:2,host:"IP:port",priority:1}]}
在初始化:rs.initiate(變量名,如下面的config)

Secondary上配置:
rs.slaveOk() ? ?#承認(rèn)自己是Secondary
三臺(tái)服務(wù)器上互相添加副本集成員:
rs.add("IP:port"), 如在Primary上 rs.add("192.168.1.2:27017"), rs.add("192.168.1.3:27017")
查看狀態(tài)
rs.status()
3、rs(replication set) 常用命令:
初始化副本集 ?---- ?rs.initiate()
mongo查看狀態(tài) ---- rs.status()
初始化副本集配置
rsconf = {_id: "rs0",
members: [{
_id: 0,
host: ":27017"}]}
rs.initiate( rsconf )
驗(yàn)證副本集配置 ?---- ?rs.config()
增加副本集成員 ?---- ?rs.add("Ip:port")
移除副本集成員 ?---- ?rs.remove("IP:port") ? ?#此步驟在Primary上操作
改變成員變量的優(yōu)先級(jí)
cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 1
cfg.members[2].priority = 2
rs.reconfig(cfg)
配置延遲副本集
cfg = rs.conf()
cfg.members[0].priority = 0
cfg.members[0].hidden = true
cfg.members[0].slaveDelay = 3600
rs.reconfig(cfg)
# ?07/03/2017