《MongoDB sharding遷移那些事(二)》要點:
本文介紹了MongoDB sharding遷移那些事(二),希望對您有用。如果有疑問,可以聯系我們。
相關主題:非關系型數據庫
歡迎參與《MongoDB sharding遷移那些事(二)》討論,分享您的想法,維易PHP學院為您提供專業教程。
如果不了解 MongoDB Sharded Cluster 原理,請先閱讀(本文資料,都可在這查看:https://yq.aliyun.com/articles/60935)
MongoDB Sharded cluster架構原理
關于MongoDB Sharding,你應該知道的
關于 sharding 遷移,會分3個部門來介紹,本文為第二部門
負載均衡及遷移策略
chunk 遷移流程
Balancer 運維管理
moveChunk 命令
從MongoDB sharding遷移那些事(一) 我們了解到,Chunk 遷移可能是 Balancer 觸發,也可能用戶手動向 mongos 發送moveChunk
命令來觸發.
我們先來近距離了解下mongos 上的 moveChunk 命令,如果是 Balancer 觸發,其邏輯也跟 moveChunk
里類似.
moveChunk的主要參數列表如下
參數 | 含義 |
---|---|
moveChunk | 指定namespace(集合名) |
find | 通過查詢條件來指定要遷移的 chunk |
bound | 通過上下限來指定要遷移的 chunk,上下限必需要跟 chunk 的范圍完全匹配 |
to | 遷移目標 shard 名 |
歸根結底就是要指定『遷移哪個集合的哪個 chunk』,『把這個 chunk 遷移到哪個 shard』,選擇 chunk 時,可以通過 find 或 bound 2種方式來指定(兩者只能選擇一個),mongos 就能計算出要遷移哪個 chunk,并知道 chunk 所在的源 shard.
mongos 接下來會構造根據上述參數,向源 shard 發送一個 moveChunk 命令(mongos 和 shard 都支持 moveChunk
這個命令,但內部的實現邏輯分歧),接下來所有的遷移工作就由源 shard 接受了,等遷移完全結束,向 mongos 反饋執行結果.
遷移步調
Step1: mongos 發送 moveChunk 給源 shard
mongos 接受到用戶發送的遷移 chunk 命令,或者因負載均衡策略必要遷移 chunk,會構建一個 moveChunk
的命令,并發送給源 shard.
Step2:源 shard 通知目標 shard 開始同步 chunk數據
源 shard 收到 mongos 發送的 moveChunk 命令后,會向目標 shard 發送 _recvChunkStart
的命令,通知目標 shard 開始遷移數據(真正的數據遷移由目標shard 主動發起).接下來,源 shard 會記錄該 chunk 在遷移過程中的所有增量修改操作.
Step3: 目標 shard 同步 chunk 數據到當地
目標 shard 接受到 _recvChunkStart
命令后,就會啟動單獨的線程來讀取 chunk 數據并寫到本地,主要步驟包含:
目標 shard 創建集合及索引(如果有需要)
如果遷移的集合在目標 shard 上沒有任何 chunk,則必要先在目標 shard 上創建集 合,并創建跟源 shard 上集合相同的索引
目標 shard 清理臟數據 (如果有需要)
如果目標 shard 上已經存在該 chunk 范圍內的數據,則肯定為某次遷移失敗導致的臟數據,先將這些數據清理掉.
目標 shard 向源 shard 發送 _migrateClone
命令讀取 chunk 范圍內的所有文檔并寫入到當地,即遷移 chunk 全量數據,遷移完后更新狀態為 STEADY(可以理解為全量遷移完成的狀態).
源 shard 會賡續調用查詢目標 shard 上的遷移狀態,看是否為 STEADY 狀態,如果已經是 STEADY 狀態,就會停止源 shard 上的寫操作(通過對集合加互斥寫鎖實現).接下來發送 _recvChunkCommit
告訴目標 shard 不會再有新的寫入了.
目標 shard 的遷移線程不斷向源 shard 發送 _transferMods
命令,讀取遷移過程中的增量修改,并應用到當地,增量遷移完成后,向源確認 _recvChunkCommit
的結果.
源 shard 收到 _recvChunkCommit
的結果,整個數據遷移的步調完成.
Step4:源 shard 更新 config server 元數據
數據遷移完成后,源 shard 就會向 config server 更新 chunk 對應的 shard 信息,同時也會更新 chunk 的版本信息,這樣 mongos 發現當地版本更低就會主動的 reload 元數據,具體機制參考 MongoDB Sharded Cluster 路由策略.
Step5:源 shard 刪除 chunk 數據
chunk 遷移到目標 shard 后,源上的 chunk 就沒有必要再保留了,源 shard 會將 chunk 數據刪除,默認情況下源 shard 會將刪除操作加入到隊列,異步刪除,如果 moveChunk 時,指定了 _waitForDelete 參數為 true,則同步刪除完再返回.
總結
本文粗略的介紹了 chunk 遷移的主要流程,chunk 的遷移會受 Balancer 策略、chunkSize等很多因素影響,第三部門將會介紹遷移相關的運維管理,以便大家更好的管理 MongoDB Sharded Cluster.