MongoDB shardCollection介紹
1.????特性概述
對于mongodb分片集群來說,在默認情況下一個集合的數據都是存儲在一個shard上。如果一個集合的數據量非常大,就會導致不同shard之間的業務負載有很大差異,這種情況顯然是不合理的。所以大多數情況下都應該對集合開啟分片,也就是執行shardCollection,這個命令的作用就是開啟集合在不同shard之間的自動均衡。
2.????命令原理
shardCollection命令的基本要素是指定集合(namespace)和片鍵(key);片鍵是集合文檔中的一個字段,片鍵字段所對應的值就是collection切分為不同chunk的依據。shard概念及片鍵選擇建議請參考https://docs.mongodb.com/manual/sharding/
3.????約束
l??如果是新集合,選擇片鍵后,mongo會在片鍵上創建索引。
l??一個集合不能同時選擇多個片鍵。
l??不能update片鍵對應字段。
l??如果集合不為空,則在shardCollection之前需要在對應片鍵上提前創好索引。
l??分片集合不能在片鍵以外的字段創建唯一索引。
l??選擇片鍵時不能有片鍵以外的字段存在唯一索引。
4.????處理邏輯
shardCollection命令在mongos上執行,命令入口cluster_shard_collection_cmd.cpp:
1)????????cluster_shard_collection_cmd.cpp的run方法:
可以看到命令內部有一個是否retry的判斷,后面部分判斷和rollback的邏輯都是為了命令重試的場景
因為創建片鍵的限制比較多,所以校驗邏輯也會比較長。除了命令入參的合法性校驗以外的核心就是usefulIndex校驗。因為對于有數據的集合,在片鍵上有合法索引才能shardCollection。上面是入參校驗。涉及到的兩個知識點:collation參考?http://www.mongoing.com/archives/3912,?view參考?http://www.mongoing.com/archives/3502。
合法索引校驗。校驗完成后會調用harding_catalog_client_impl.cpp的shardCollection方法。
2)????????sharding_catalog_client_impl.cpp的shardCollection方法:
該方法主要用來:
l??獲取集合的分布式鎖,防止shardCollection過程中集合被刪除或重復調用shardCollection。
l??在config.changelog中寫入記錄shardCollection.start。
l??調用config的shard_collection.cpp的run方法。
3)????????shard_collection.cpp的run方法:
該方法有兩個主要分支,如果是新集合直接走run_normal方法,如果不是新集合走shardCollectionExist2方法。
l??先看run_normal方法的實現:
主要工作是創建集合和索引的元數據
對于hash分片的新集合有一個特殊處理,這種場景會先算出一批拆分點,并同時創出一批chunk(numShards-1)。拆分原理是把hash值的范圍進行均分(-MIN long, +MAX long),long類型是64位,所以hash的最大值是2^64,這樣做的好處是可以一開始就保證數據的均勻分布,減少遷移。如果不符合該條件則調用_create_one_chunk方法創建一個chunk。
l??接著看shardCollectionExist2方法的實現:
可以發現對有數據集合執行shardCollection的邏輯要復雜一些
一開始也是執行run_normal方法,但這種場景下入參newCmdObj是不同的。在創建集合元數據時會先創建一個臨時的集合。等臨時集合創建好后,會把舊集合的數據和索引拷貝過來,然后重命名這個臨時集合。
至此shardCollection的主要流程解釋完成。
MongoDB
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。