1.集群的目的
實(shí)現(xiàn)高可用性。那么集群是如何實(shí)現(xiàn)高可用性的呢
主要原因有兩個(gè)
1)當(dāng)主節(jié)點(diǎn)掛掉的時(shí)候,如果此時(shí)任何一個(gè)secondary的數(shù)據(jù)沒有從primary復(fù)制完(即secondary和primary數(shù)據(jù)不同步)會(huì)發(fā)生回滾,如果其中一個(gè)secondary已經(jīng)完成了數(shù)據(jù)復(fù)制在primary掛掉之前,并且和其他secondary通信良好,不會(huì)發(fā)生數(shù)據(jù)回滾,因?yàn)?code>secondary之間可以通過heartbeat讀取oplog
mongodb會(huì)對(duì)回滾的數(shù)據(jù)進(jìn)行一個(gè)收集,回滾的數(shù)據(jù)會(huì)被保存在/dbPath/rollback目錄下一個(gè)叫<database>.<collection>.<timestamp>的bson文件下,對(duì)這些回滾數(shù)據(jù)的處理需要人為干涉,DBA可以通過bsondump查看記錄回滾數(shù)據(jù)的back文件
MongoDB會(huì)努力去避免回滾,數(shù)據(jù)回滾的主要原因是網(wǎng)絡(luò)分區(qū)。將write concern從默認(rèn)的{w:1}改為{w:majority},只有secondary復(fù)制完primary的數(shù)據(jù)時(shí),才會(huì)返回給客戶端寫成功的提示(nInsert或者objectId)來避免回滾的發(fā)生。
PayAttention:由于客戶端的write concern為local或available,在數(shù)據(jù)回滾前,客戶端還能讀取到回滾數(shù)據(jù)
回滾的數(shù)據(jù)大小是受限的,最多為300兆,超過300兆,log會(huì)出現(xiàn)
[replica set sync] replSet syncThread: 13410 replSet too much data to roll back
超過300兆時(shí),直接保存數(shù)據(jù)或強(qiáng)制成員執(zhí)行初始同步。要強(qiáng)制執(zhí)行初始同步,請(qǐng)通過刪除需要較大回滾的成員的dbPath目錄的內(nèi)容來同步集中的“當(dāng)前”成員。
2)自動(dòng)故障轉(zhuǎn)移。即當(dāng)主節(jié)點(diǎn)掛掉的時(shí)候自動(dòng)選舉出一個(gè)主節(jié)點(diǎn),不需要人為干預(yù),而在mysql中就需要人為干預(yù)
2.集群的架構(gòu)
存在arbiter

不存在arbiter

集群中都存在主節(jié)點(diǎn)和副節(jié)點(diǎn)
arbiter一般會(huì)出現(xiàn)在集群數(shù)量為偶數(shù)的情形下,這樣可以保證能夠重新選舉出主節(jié)點(diǎn)
3.集群的好處
1)數(shù)據(jù)可恢復(fù)
2)異步復(fù)制
發(fā)生在從主節(jié)點(diǎn)更新數(shù)據(jù)到副節(jié)點(diǎn)時(shí),副節(jié)點(diǎn)更新數(shù)據(jù)時(shí),客戶端仍能從這個(gè)節(jié)點(diǎn)讀取數(shù)據(jù)。
優(yōu)點(diǎn):提高讀取效率
缺點(diǎn):可能讀取不到當(dāng)前最新數(shù)據(jù)
3)自動(dòng)故障轉(zhuǎn)移
自動(dòng)故障轉(zhuǎn)移說簡(jiǎn)單一點(diǎn)就是當(dāng)主節(jié)點(diǎn)掛掉的時(shí)候(10s鐘不和副節(jié)點(diǎn)進(jìn)行通信時(shí)),就會(huì)重新選舉出一個(gè)主節(jié)點(diǎn)。重新選舉一個(gè)主節(jié)點(diǎn)分為兩步:a.申明當(dāng)前主節(jié)點(diǎn)不可用 b.選舉出新的主節(jié)點(diǎn)
在選舉過程中,集群中沒有主節(jié)點(diǎn),,客戶端只能讀不能寫。在mongodb3.2中進(jìn)行了優(yōu)化,縮短了選舉時(shí)間
4)提高讀效率
如果客戶端有多個(gè)讀請(qǐng)求,可以將多個(gè)請(qǐng)求發(fā)送給不同的節(jié)點(diǎn)
5)讀可選
可以選擇從主節(jié)點(diǎn)讀取數(shù)據(jù) ,也可以副節(jié)點(diǎn)讀取數(shù)據(jù)
4.集群中的成員
1)Replica Set Primary
有且僅有一個(gè)
既能讀又能寫,并且只有primary才能寫
默認(rèn)應(yīng)用從primary讀取數(shù)據(jù)
主節(jié)點(diǎn)在有些情況下可以變成為副節(jié)點(diǎn)
If a majority of the replica set is inaccessible or unavailable to
the current primary, the primary will step down and become a
不是很懂這描述的到底是怎樣的一種特殊情況
secondary.
2)Replica Set Secondary
在一個(gè)集群中可以有多個(gè)secondary
只能讀不能寫
如果想從secondary讀取數(shù)據(jù),需要做額外的配置
如果主節(jié)點(diǎn)掛掉了通過選舉可以成為主節(jié)點(diǎn)
secondary的配置
a.priority:0
如果一個(gè)secondary的配置文件中設(shè)置priority:0,則這個(gè)節(jié)點(diǎn)不能被選舉成為主節(jié)點(diǎn),并且不能觸發(fā)選舉,但是可以參與選舉
b.hidden:true
如果一個(gè)secondary的配置文件中設(shè)置hidden:true,則這個(gè)secondary對(duì)客戶端是不可見的,并且一定配置了priority:0
客戶端的讀請(qǐng)求不會(huì)被分發(fā)給hidden:true的節(jié)點(diǎn),利用這個(gè)特性可以使這個(gè)節(jié)點(diǎn)專門用來數(shù)據(jù)備份或者報(bào)告,因?yàn)槠鋞raffic相對(duì)較少和其他secondary相比
關(guān)于備份:如果使用MMAPv1/WiredTiger存儲(chǔ)引擎,備份時(shí)可以使用db.fsyncLock()和db.fsyncUnLock()操作停止隱藏成員,在備份期間刷新所有寫入并鎖定mongod實(shí)例,這樣能夠保證那個(gè)時(shí)間點(diǎn)鎖住的數(shù)據(jù)一定是最新的
c.slaveDelay:time
通過配置slaveDelay:time可以使當(dāng)前節(jié)點(diǎn)數(shù)據(jù)是晚于或早于主節(jié)點(diǎn)數(shù)據(jù)的一個(gè)快照,并且一定配置了priority:0和hidden:true
應(yīng)用:作為rolling back,當(dāng)人為操作失誤,比如刪除數(shù)據(jù)庫、集合,不成功的應(yīng)用升級(jí),可以通過這個(gè)備份進(jìn)行恢復(fù)
配置文件:
{
"_id" : <num>,
"host" : <hostname:port>,
"priority" : 0,
"slaveDelay" : <seconds>,
"hidden" : true
}
3)Replica Set Arbiter
不存放數(shù)據(jù),僅僅是用來重新選舉主節(jié)點(diǎn),并且永遠(yuǎn)只能是arbiter,不可能成為主節(jié)點(diǎn)或者副節(jié)點(diǎn)
安全:當(dāng)使用授權(quán)認(rèn)證時(shí),arbiter和其他節(jié)點(diǎn)通過交換進(jìn)行認(rèn)證,因?yàn)閍rbiter不存儲(chǔ)數(shù)據(jù),所以是通過localhost進(jìn)行認(rèn)證的
默認(rèn)具有priority:0的配置
5.Oplog
Oplog(operations log)作用:保持主節(jié)點(diǎn)上(primary)的回滾記錄,回滾記錄個(gè)人理解就是改變數(shù)據(jù)庫數(shù)據(jù)的操作,比如插入、刪除、更新等,副節(jié)點(diǎn)通過讀取Oplog異步達(dá)到和主節(jié)點(diǎn)同步
為了便于復(fù)制,所有secondary可以通過Heartbeat(ping)發(fā)送給其他成員,這樣可以從其他secondary讀取Oplog
終于知道了架構(gòu)中Heartbeat的作用

Oplog默認(rèn)大小足夠用了
如果已經(jīng)啟動(dòng)了一個(gè)副集群,可以以管理員的身份運(yùn)行replSetResizeOplog動(dòng)態(tài)的設(shè)置Oplog的大小,并且不會(huì)重啟mongo實(shí)例。如果mongo實(shí)例未創(chuàng)建oplog,則可以通過oplogSizeMB指定oplog的大小
如何查看oplog的狀態(tài):rs.printReplicationInfo()
6.影響選舉結(jié)果的因素
1)復(fù)制選舉協(xié)議
mongodb3.2版本中,引入復(fù)制協(xié)議版本,減少故障自動(dòng)轉(zhuǎn)移時(shí)間并且加速檢測(cè)多個(gè)同時(shí)發(fā)生的基本事件(???)
2)heartbeats
3)副節(jié)點(diǎn)的優(yōu)先級(jí)(member priority)
4)loss of a data center
5)network partition
6)vetoes in elections