MongoDB的chunk詳解
更新時(shí)間:2026-05-05 01:32:18
MongoDB中,在使用到分片的時(shí)候,常常會(huì )用到chunk的概念,chunk是指一個(gè)集合數據中的(de)子集,也可以簡(jiǎn)單理解成一個(gè)數據塊,每個(gè)chunk都(???)是基于片鍵的范圍取值,區間是左閉右開(kāi)。例如,我們的片鍵是姓名的第二個(gè)字母,包含了A-Z這26中可能,理想情況下,劃分為26個(gè)chunk,其中每個(gè)字母開(kāi)頭的姓名記錄即為一個(gè)chunk。
在數據寫(xiě)入的時(shí)候,mongos根據片鍵shard key的值來(lái)寫(xiě)入對應的( ???)chunk中,chunk可以表示的??最小范圍是單個(gè)唯一的shard key的值,只包含具體的單個(gè)片鍵值文檔的chunk不能被分割,這個(gè)也比較容易理解,如果某個(gè)chunk只包含一個(gè)片鍵的值,如果對它進(jìn)行分割,則代表一個(gè)(′?`*)片鍵值映射了2個(gè)chunk,下次遇到這個(gè)片鍵的文檔時(shí),mongos就不知(???)道應該存放在哪個(gè)chunk當中了。
chunk的大小如何確定???
在MongoD(′?`)B中,chunk的默認大小是64??MB,可以增加或者減少c??hunk的大小。
chunk的大小不宜過(guò)小,如果chunk過(guò)小,好處是可以讓數據更加均勻的分布,但是會(huì )導致??chunk之間頻繁的遷移,有一定的??性能開(kāi)銷(xiāo);同樣的(de),chunk的大??小不宜過(guò)大,過(guò)大的chunk size會(huì )導致數據分( ?° ?? ?°)布不均勻,
chunk??的分( ?ヮ?)裂
當某個(gè)chunk的值達到了chunk所能??表示的最大值的時(shí)候,這個(gè)時(shí)候chunk不能無(wú)限增長(cháng),需要通過(guò)分割的方法來(lái)減少chunk的大小,例如一個(gè)64MB的chunk分割成2個(gè)32MB的chunk,這樣雖然增加了chunk的數量,但是帶來(lái)的收益是單(′_ゝ`)個(gè)chunk的縮小。
chunk的遷移
在分片+復制集的架構中,當某個(gè)服務(wù)器上的數據記錄不停的增多,它上面分割的chunk就會(huì )變多,當集群中每個(gè)服務(wù)器上的chunk數量嚴重失衡的時(shí)候,mongodb會(huì )自動(dòng)進(jìn)行chunk的遷移工作,這個(gè)自動(dòng)遷移的工作,是通過(guò)balancer(′_`)來(lái)進(jìn)行的。如果balancer發(fā)現各個(gè)shard之間的chunk數差異超過(guò)了提前規定的(de)閾值,則會(huì )進(jìn)行chunk的遷移工作,如下:
也??就是從上面的狀態(tài)變成下面的狀態(tài)。每個(gè)小塊代表一個(gè)chunk。
Mong?oDB自動(dòng)觸發(fā)遷移的閾值表如下:
chunk數量: <20,遷移閾???值:2
chunk數量:20~79,遷移閾值:4
chunk數量: >(′?_?`)80,遷移閾值:8??
chunk的遷移一般使??用鎖來(lái)實(shí)現,從MongoDB3.4版本起,chunk的遷移分為7個(gè)步驟:
1、balancer進(jìn)程將moveChunk的命令發(fā)送到源shard中
2、源shard使用內部?moveChunk命令開(kāi)始移動(dòng),遷移過(guò)程中,該chunk的操作依舊在源shard上進(jìn)行,源shard依舊負責該chunk的寫(xiě)入操作
3、目標shard開(kāi)始創(chuàng )建所需??索引
4、目標shard開(kāi)始請求chunk中的文檔并開(kāi)始接收數據的復制
5、接收完源s??hard的最后一個(gè)文檔之后,目標shard啟動(dòng)一個(gè)同步進(jìn)程,這個(gè)進(jìn)程會(huì )拉取遷移期間的日志,將遷移期間對該chunk的操作更新到目標chunk中。
6、當完全同步時(shí),(′?`)源shard連接到config數據庫并更新chu??nk的位置元數據。
7、完成數據更新后,一旦在源shard上沒(méi)有對該chunk的操作,源sh??ard會(huì )異步刪除(???)chunk。當然,用戶(hù)可以設置_w(°ロ°) !aitforDelete參數??為true,讓源shard在chunk遷移完成后同步刪除chunk數據
通常情況下,chunk遷移由下面三種場(chǎng)景??觸發(fā):
1、多個(gè)shard上分布不均勻
2、用戶(hù)調用removeShard之后,被移除的s??hard上的chunk就要被(bei)遷移到其他的shard上
3、MongoDB的shard tag功能,可??以對(dui)shard或者shard key range打標簽,系統會(huì )自動(dòng)將對應的range的數據遷移到擁有相同tag的shard上。
文章來(lái)(??ヮ?)?*:???源:腳本之家??
來(lái)源地址:https://www.jb51.net/article/209833.htm

