SERVER-17397: Dropping a Database or Collection in a Sharded Cluster may not fully succeed 是 MongoDB 里老大難的問題,庫或集合刪除操做若是沒有徹底執行成功,再新建相同名字的集合,可能致使讀到老版本數據的問題。mongodb
MongoDB sharding 分片原理參考 MongoDB Sharded cluster架構原理數據庫
總的來講,當用戶對集合執行開啓分片以後,集合分片的元數據會保存在 config server 的 config 集合裏架構
config.collections
記錄集合分片的元數據,根據哪一個 shardKey 分片,集合是否已經被刪除等元數據config.chunks
,記錄各個 chunk(shardKey的某一段範圍)對應的 shard 信息,用於路由請求注:3.2+都是按上述流程操做,刪除 Database 過程相似,還須要再額外操做 config.databases 集合,但本質上存在的問題相似阿里雲
上述動做須要操做 config server 以及 全部的 shard,若是中間有步驟失敗(一些很老的版本,並非按照上述步驟執行,並且執行過程當中可能沒有嚴格檢查返回的錯誤碼,即便返回成功實際上內部可能執行失敗),最終致使集合的部分數據仍然殘留,沒有徹底清理乾淨。url
若是這個集合名字從新被使用,再次調用 shardCollection 產生新的分片元數據,可能致使spa
MongoDB sharding 刪除集合/數據庫涉及到多個節點進行操做,這些動做沒法作到原子性,可能致使一個集合最終處於某種中間狀態;複用該集合可能致使一寫數據一致性問題。code
搶阿里雲新用戶專屬優惠權益,致電95187-1 !
server
閱讀原文blog
本文爲雲棲社區原創內容,未經容許不得轉載。路由