MongoDB shardCollection介紹

      網友投稿 1530 2022-05-30

      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的邏輯要復雜一些

      MongoDB shardCollection介紹

      一開始也是執行run_normal方法,但這種場景下入參newCmdObj是不同的。在創建集合元數據時會先創建一個臨時的集合。等臨時集合創建好后,會把舊集合的數據和索引拷貝過來,然后重命名這個臨時集合。

      至此shardCollection的主要流程解釋完成。

      MongoDB

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Windows系統下使用protobuf:protobuf的簡介、安裝、使用方法之詳細攻略
      下一篇:Typora+PicGo + Gitee(碼云)實現高效markdown圖床
      相關文章
      亚洲狠狠婷婷综合久久蜜芽| 亚洲av无码乱码国产精品| 亚洲av色福利天堂| 亚洲国产精品嫩草影院久久| 亚洲av永久中文无码精品综合| 在线综合亚洲中文精品| 亚洲国产成人va在线观看网址| 亚洲精品福利网泷泽萝拉| 亚洲视频精品在线观看| 久久精品国产精品亚洲毛片| 亚洲第一页在线观看| 亚洲人成免费网站| 国产成人精品亚洲2020| 国产精品亚洲专区在线观看 | 久久精品国产亚洲AV忘忧草18| 亚洲欧洲国产成人精品| 亚洲国产成+人+综合| 亚洲中文字幕人成乱码| 亚洲午夜福利在线视频| 亚洲经典千人经典日产| 朝桐光亚洲专区在线中文字幕 | 久久精品国产亚洲av瑜伽| 国产亚洲高清在线精品不卡| 亚洲人成网站色在线入口| 国产亚洲精品无码拍拍拍色欲| 亚洲人成网站在线播放vr| 久久精品亚洲综合专区| 亚洲精品韩国美女在线| 亚洲av成人综合网| 亚洲精品宾馆在线精品酒店 | www.亚洲精品| 国产国拍亚洲精品福利| 亚洲成av人影院| 精品亚洲aⅴ在线观看| 亚洲av片不卡无码久久| 中文日韩亚洲欧美制服| 国产亚洲福利精品一区二区| 国产午夜亚洲精品午夜鲁丝片| 亚洲国产精品国自产拍AV| 91亚洲国产在人线播放午夜| 中文字幕亚洲男人的天堂网络|