您好,登錄后才能下訂單哦!
本文轉自張友東的文章,文章鏈接:
http://www.mongoing.com/archives/2369
正好解釋了我的問題,所以轉發記錄下
Mongodb復制集里的Secondary會從Primary上同步數據,以保持副本集所有節點的數據保持一致,數據同步主要包含2個過程:
先通過init sync同步全量數據,再通過replication不斷重放Primary上的oplog同步增量數據。
Secondary啟動后,如果滿足以下條件之一,會先進行initial sync
initial sync結束后,Secondary會建立到Primary上local.oplog.rs的tailable cursor,不斷從Primary上獲取新寫入的oplog,并應用到自身。
Tailable cursor每次會獲取到一批oplog,Secondary采用多線程重放oplog以提高效率,通過將oplog按照所屬的namespace進行分組,劃分到多個線程里,保證同一個namespace的所有操作都由一個線程來replay,以保證統一namespace的操作時序跟primary上保持一致(如果引擎支持文檔鎖,只需保證同一個文檔的操作時序與primary一致即可)。
1. 副本集初始化
初始化選出Primary后,此時Secondary上無有效數據,oplog是空的,會先進行initial sync,然后不斷的應用新的oplog
2. 新成員加入
因新成員上無有效數據,oplog是空的,會先進行initial sync,然后不斷的應用新的oplog
3. 有數據的節點加入
有數據的節點加入有如下情況:
此時,如果該節點最新的oplog時間戳,比所有節點最舊的oplog時間戳還要小,該節點將找不到同步源,會一直處于RECOVERING而不能服務;反之,如果能找到同步源,則直接進入replication階段,不斷的應用新的oplog。
因oplog太舊而處于RECOVERING的節點目前無法自動恢復,需人工介入處理(故設置合理的oplog大小非常重要),最簡單的方式是發送resync命令,讓該節點重新進行initial sync。
張友東,就職于阿里云飛天技術部,主要關注分布式存儲、Nosql等技術領域,參與 TFS(淘寶分布式文件系統)、 AliCloudDB for Redis等項目的開發工作,歡迎交流
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。