(2)MongoDB副本集自动故障转移原理(含客户端)
前文我們搭建MongoDB三成員副本集,了解集群基本特性,今天我們圍繞下圖聊一聊背后的細(xì)節(jié)。
默認(rèn)搭建的副本集均在主節(jié)點讀寫,輔助節(jié)點冗余部署,形成高可用和備份,具備自動故障轉(zhuǎn)移能力。
集群心跳?;?/p>
集群每個節(jié)點以周期性向其他成員發(fā)出心跳命令?replSetHeartbeat?來獲取狀態(tài),
根據(jù)應(yīng)答消息來更新節(jié)點的狀態(tài),根據(jù)最終狀態(tài)確定是否重選主節(jié)點。
默認(rèn)心跳周期 heartbeatIntervalMillis= 2000ms;
認(rèn)定Primary節(jié)點失聯(lián)的閾值?electionTimeoutMillis=10s
異步復(fù)制
輔助節(jié)點復(fù)制主節(jié)點的oplog,并將改變應(yīng)用到數(shù)據(jù)集,從而保持與主節(jié)點數(shù)據(jù)同步。
這里有三個知識點:
oplog是一個特殊的封頂集合capped collection, 主節(jié)點上的operation log會記錄在主節(jié)點的oplog中,輔助節(jié)點異步拷貝這些操作,這樣所有的節(jié)點的都包含operatin log的一個副本:local.oplog.rs集合
每次異步復(fù)制觸發(fā)的時機(jī)是在心跳?;铍A段,所有的輔助節(jié)點都會在ping階段從其他成員插入oplog文檔。
oplog中的每個操作都是冥等的:無論是一次還是多次應(yīng)用到目標(biāo)數(shù)據(jù)集,oplog操作會產(chǎn)生相同的結(jié)果
刪除和插入操作
若多次應(yīng)用刪除操作,后續(xù)刪除操作無效果;
若多次應(yīng)用插入操作,因為每次操作均包含包含_id值,因此它也不會插入文檔的第二個副本(因為_id必須是唯一的)。
當(dāng)有新節(jié)點加入集群,該節(jié)點會啟動另一種同步復(fù)制:initial sync, 將所有數(shù)據(jù)從某副本集成員完全拷貝, 復(fù)制完成,會過渡為輔助節(jié)點。
選舉主節(jié)點
集群會因為各種事件觸發(fā)選舉主節(jié)點
在集群中添加新節(jié)點
初始化replica set集群
執(zhí)行人工運(yùn)維命令(rs.stepDown()? rs.reconfig())維護(hù)集群
輔助節(jié)點與主節(jié)點失聯(lián)時間超過默認(rèn)10s
自動故障轉(zhuǎn)移說的是最后一種情況:
默認(rèn)情況下,輔助節(jié)點A與主節(jié)點心跳失聯(lián)超過10s,A節(jié)點標(biāo)記主節(jié)點不可用;
之后與其他輔助節(jié)點心跳?;?#xff0c;溝通各自信息(節(jié)點的票數(shù)、節(jié)點優(yōu)先級、PingMs等因素)確立出新主節(jié)點。
在發(fā)生故障轉(zhuǎn)移時,集群不能再執(zhí)行寫入操作;若客戶端配置在輔助節(jié)點讀取(read preference),則集群可繼續(xù)提供讀取能力。
你的應(yīng)用程序可用重試邏輯應(yīng)對自動故障轉(zhuǎn)移和后續(xù)的重選。
從MongoDB3.6版本開始,MongoDB Driver可偵測主節(jié)點的失聯(lián),并執(zhí)行一次重試操作。
tip
適配MongoDB4.2的Driver默認(rèn)會重試寫入操作;
適配Mongodb4.0-3.6的Driver需顯式在連接字符串包含retryWrites = true,以確保主節(jié)點失聯(lián)時能重試寫入操作。
連接副本集的配置字符串,其中rs0是集群配置文件中 replSetName。
mongodb://account:passward@mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017?replicaSet=rs0OK, 以上便是MongoDB副本集心跳?;?、異步復(fù)制、自動故障轉(zhuǎn)移的背景知識。
留一個作業(yè)?
客戶端連接MongoDB副本集的連接字符串,是一個很普通的IP數(shù)組,并未體現(xiàn)主副節(jié)點,客戶端是怎么區(qū)分主副節(jié)點,并向主節(jié)點發(fā)出寫入指令;更何況副本集主副節(jié)點會變化,客戶端如何感知?
點擊下方空白區(qū)域查看答案
▼
「Client? Monitoring」?
所有符合MongoDB官方規(guī)范的Driver都會實現(xiàn)Service Discovery和Monitoring,連接副本集的字符串IP實際是種子成員,Driver會準(zhǔn)實時發(fā)起指令檢測集群狀態(tài)(heartbeatFrequencyMS約定了Driver的檢查間隔),
這與我們在輔助節(jié)點觀察到的日志是相呼應(yīng)的:
+?https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.rst#heartbeatfrequencyms
+?https://docs.mongodb.com/manual/reference/connection-string/#urioption.heartbeatFrequencyMS
▼
往期精彩回顧
▼
(1)解鎖MongoDB replica set核心姿勢
ASP.NET Core跨平臺技術(shù)內(nèi)幕
實例解讀Docker Swarm
快到碗里來
!
你點的每個贊,我都認(rèn)真當(dāng)成了喜歡
總結(jié)
以上是生活随笔為你收集整理的(2)MongoDB副本集自动故障转移原理(含客户端)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器应用服务为何卡顿?原来是内存耗尽惹
- 下一篇: BeetleX.Redis基础操作和对象