操作場景
對于DDS分(fen)片(pian)集(ji)(ji)群實例(li),如果(guo)某個(ge)集(ji)(ji)合的存(cun)儲(chu)量很高,建議對該(gai)集(ji)(ji)合設置(zhi)數據分(fen)片(pian)。分(fen)片(pian)是將數據按(an)照某種(zhong)方(fang)式(shi)拆分(fen),將其分(fen)散存(cun)放(fang)在不同的機(ji)器(qi)上,以充分(fen)利用各分(fen)片(pian)節點的存(cun)儲(chu)空(kong)間和(he)計算性能。
操作步驟
下面以數據庫mytable,集(ji)合mycoll,字段(duan)“name”為分片鍵(jian)舉(ju)例說(shuo)明。
1.通過mongo shell登錄分片集群實例。
2.對(dui)集合所屬的數據庫啟用分片功能(neng)。
- 方式一
sh.enableSharding("")
示例:
sh.enableSharding("mytable")
- 方式二
use admin
db.runCommand({enablesharding:""})
3.對集合(he)進行分片。
- 方式一
sh.shardCollection(".",{"": })
示例:
sh.shardCollection("mytable.mycoll",{"name":"hashed"})
- 方式二
use admin
db.runCommand({shardcollection:".",key:{"keyname": }})
表 參數說明
| 參數 | 說明 |
|---|---|
| 數據庫名稱。 | |
| 集合名稱。 | |
| 分片鍵。DDS集群根據該值進行數據分片,請結合具體業務選擇合適的分片鍵。 | |
| 基于分片鍵的范圍查詢的排序方式。· 1:表示索引升序。· -1:表示索引降序。· hashed:表示使用Hash分片,通常能將寫入均衡分布到各個分片節點。數據分布策略詳情請參見選擇合適的數據分布策略。 |
更多信息,請參見。
4.查(cha)看數據(ju)(ju)庫在各分片(pian)節(jie)點的(de)數據(ju)(ju)存儲情況(kuang)。
sh.status()
示例:

選擇合適的分片鍵
分(fen)(fen)片(pian)集(ji)(ji)群中(zhong)數據的(de)(de)分(fen)(fen)片(pian)以集(ji)(ji)合為基礎單位,集(ji)(ji)合中(zhong)的(de)(de)數據通過分(fen)(fen)片(pian)鍵(jian)被分(fen)(fen)成多(duo)個(ge)部分(fen)(fen)。分(fen)(fen)片(pian)鍵(jian)是在集(ji)(ji)合中(zhong)選(xuan)擇的(de)(de)一個(ge)合適的(de)(de)字(zi)段,數據拆(chai)分(fen)(fen)時以該分(fen)(fen)片(pian)鍵(jian)的(de)(de)值為依據均衡地(di)分(fen)(fen)布到所有分(fen)(fen)片(pian)中(zhong)。如果(guo)您沒有選(xuan)擇到合適的(de)(de)的(de)(de)分(fen)(fen)片(pian)鍵(jian),可能會(hui)降低集(ji)(ji)群的(de)(de)使用性能,出現執行(xing)分(fen)(fen)片(pian)語(yu)句時執行(xing)過程卡住的(de)(de)問題。
說明:
分(fen)片鍵一(yi)旦設置(zhi)后(hou)不(bu)能(neng)再(zai)更改。如果未選取到(dao)合(he)適(shi)的(de)(de)分(fen)片鍵,需要使用正確的(de)(de)分(fen)片策(ce)略,將(jiang)數(shu)據遷移到(dao)新的(de)(de)集(ji)合(he)后(hou)重新執行分(fen)片。
合適的分(fen)片鍵具(ju)有以下特點:
- 所有的插入、更新以及刪除操作,將會均勻分發到集群中的所有分片中。
- key的分布足夠離散。
- 盡量避免scatter-gather查詢。
如果(guo)所(suo)選分片(pian)(pian)鍵不具(ju)備(bei)以上所(suo)有特點,將會影(ying)響集群的(de)讀寫(xie)擴展性。例如,通(tong)過find()操作讀取的(de)工作量在分片(pian)(pian)中非均勻(yun)(yun)分布,最終會產生查詢(xun)熱(re)分片(pian)(pian)。同樣(yang),如果(guo)寫(xie)工作量(插(cha)入、更新和修改)在分片(pian)(pian)中非均勻(yun)(yun)分布,最終會產生寫(xie)熱(re)分片(pian)(pian),嚴重限制分片(pian)(pian)的(de)優勢。因此,您(nin)(nin)需要根(gen)據應用讀寫(xie)狀(zhuang)態(tai)(重讀取還是重寫(xie)入)、經常查詢(xun)及寫(xie)入的(de)數據等業務需求,調整您(nin)(nin)的(de)分片(pian)(pian)鍵。
您可(ke)以(yi)通過以(yi)下幾個維(wei)度(du),判斷所選分片(pian)鍵是否能夠(gou)滿足業務需求。
- 片鍵基數
片(pian)鍵(jian)基(ji)數(shu)是(shi)指劃分(fen)(fen)(fen)數(shu)據(ju)(ju)塊的能力。例如,要記錄某個學(xue)(xue)校的學(xue)(xue)生(sheng)(sheng)信(xin)息,由(you)于學(xue)(xue)生(sheng)(sheng)的年齡比較集中(zhong),如果選擇年齡作為分(fen)(fen)(fen)片(pian)鍵(jian),同(tong)一個數(shu)據(ju)(ju)段(duan)中(zhong)將存儲很多(duo)同(tong)齡學(xue)(xue)生(sheng)(sheng)的數(shu)據(ju)(ju),影響集群的性能以(yi)及可(ke)管理性。由(you)于學(xue)(xue)生(sheng)(sheng)的學(xue)(xue)號唯一,如果選擇學(xue)(xue)號作為分(fen)(fen)(fen)片(pian)鍵(jian),分(fen)(fen)(fen)片(pian)基(ji)數(shu)較大,有利于數(shu)據(ju)(ju)的均勻分(fen)(fen)(fen)布。
- 寫分布
若用戶業(ye)務在同(tong)(tong)一(yi)時間段(duan)有大量寫(xie)操作,則(ze)希望這些寫(xie)操作能(neng)夠均勻分(fen)(fen)布(bu)到各(ge)個分(fen)(fen)片(pian)上。如果數據(ju)(ju)分(fen)(fen)布(bu)策略為(wei)范(fan)圍分(fen)(fen)片(pian),并以一(yi)個單調遞(di)增的值作為(wei)分(fen)(fen)片(pian)鍵(jian)(jian),此時,大量寫(xie)入(ru)的數據(ju)(ju)同(tong)(tong)樣(yang)是片(pian)鍵(jian)(jian)字段(duan)遞(di)增,數據(ju)(ju)將寫(xie)入(ru)同(tong)(tong)一(yi)個分(fen)(fen)片(pian)。
- 讀分發
若用(yong)戶業務在同一時間段(duan)有(you)大量讀(du)操作,則希望這些讀(du)操作能夠均勻分(fen)(fen)布到各個分(fen)(fen)片(pian)上,以充分(fen)(fen)利用(yong)各分(fen)(fen)片(pian)節點的計算性能。
- 定向讀
mongos查(cha)(cha)(cha)(cha)(cha)詢(xun)(xun)路由器可(ke)以執(zhi)行(xing)定(ding)向查(cha)(cha)(cha)(cha)(cha)詢(xun)(xun)(只(zhi)查(cha)(cha)(cha)(cha)(cha)詢(xun)(xun)一個(ge)分(fen)(fen)片)或(huo)scatter/gather查(cha)(cha)(cha)(cha)(cha)詢(xun)(xun)(查(cha)(cha)(cha)(cha)(cha)詢(xun)(xun)所有分(fen)(fen)片)。只(zhi)有查(cha)(cha)(cha)(cha)(cha)詢(xun)(xun)中(zhong)存在分(fen)(fen)片鍵,mongos才能定(ding)位到(dao)單一分(fen)(fen)片,因(yin)此,您(nin)需要選擇(ze)在業務運行(xing)時可(ke)用(yong)于(yu)普遍查(cha)(cha)(cha)(cha)(cha)詢(xun)(xun)的分(fen)(fen)片鍵。如果您(nin)選擇(ze)合成(cheng)的分(fen)(fen)片鍵,將無(wu)法(fa)在定(ding)向查(cha)(cha)(cha)(cha)(cha)詢(xun)(xun)中(zhong)使用(yong)該片鍵,所有的查(cha)(cha)(cha)(cha)(cha)詢(xun)(xun)方式將變成(cheng)scatter/gather查(cha)(cha)(cha)(cha)(cha)詢(xun)(xun),從(cong)而限制擴展(zhan)讀數據的能力。
選擇合適的數據分布策略
分(fen)片集群支持將單個集合的數據分(fen)散(san)存儲(chu)在多(duo)個分(fen)片上,用戶可以根據集合內文檔的分(fen)片鍵來分(fen)布數據。
目前(qian),主(zhu)要支持(chi)兩種數據分(fen)布(bu)策略,即范圍分(fen)片(Range based sharding)和Hash分(fen)片(Hash based sharding)。
下面分別(bie)介紹(shao)這兩種數據分布策略以及各自的優缺點。
- 范圍分片
基于(yu)范圍進(jin)(jin)行(xing)分片(pian)(pian),即集群按照分片(pian)(pian)鍵(jian)的(de)(de)范圍把數據分成不同部分。假(jia)設有一(yi)(yi)個(ge)數字分片(pian)(pian)鍵(jian),為(wei)(wei)一(yi)(yi)條從負無窮到正無窮的(de)(de)直線,每(mei)一(yi)(yi)個(ge)片(pian)(pian)鍵(jian)的(de)(de)值(zhi)均在直線上進(jin)(jin)行(xing)標記(ji)。可(ke)以(yi)理解為(wei)(wei)將該直線劃分為(wei)(wei)更短的(de)(de)不重疊的(de)(de)片(pian)(pian)段,并稱之為(wei)(wei)數據塊,每(mei)個(ge)數據塊包含了分片(pian)(pian)鍵(jian)在一(yi)(yi)定的(de)(de)范圍內的(de)(de)數據。
圖 數據分布示意圖

如上(shang)(shang)圖所示,x表(biao)示范(fan)圍(wei)分(fen)片的(de)片鍵,x的(de)取值范(fan)圍(wei)為(wei)[minKey,maxKey],且(qie)為(wei)整型。將整個(ge)取值范(fan)圍(wei)劃(hua)分(fen)為(wei)多個(ge)chunk,每(mei)個(ge)chunk(通(tong)常(chang)配置為(wei)64MB)包(bao)含(han)其中(zhong)一(yi)小段的(de)數(shu)據。其中(zhong),chunk1包(bao)含(han)x值在(zai)(zai)[minKey, -75]中(zhong)的(de)所有文檔,每(mei)個(ge)chunk的(de)數(shu)據都存儲(chu)(chu)在(zai)(zai)同(tong)一(yi)個(ge)分(fen)片上(shang)(shang),每(mei)個(ge)分(fen)片可以存儲(chu)(chu)多個(ge)chunk,并且(qie)chunk存儲(chu)(chu)在(zai)(zai)分(fen)片中(zhong)的(de)數(shu)據會存儲(chu)(chu)在(zai)(zai)config服(fu)務(wu)器中(zhong),mongos也會根據各分(fen)片上(shang)(shang)的(de)chunk的(de)數(shu)據自動執(zhi)行(xing)負載均衡。
范(fan)(fan)圍(wei)(wei)分(fen)片能夠很(hen)好的(de)(de)滿足范(fan)(fan)圍(wei)(wei)查詢的(de)(de)需(xu)求(qiu),例(li)如(ru),查詢x的(de)(de)取值在[-60,20]中的(de)(de)文(wen)檔(dang),僅需(xu)mongos將請(qing)求(qiu)路由到chunk2。
范圍分(fen)(fen)片的缺點在(zai)于,如果分(fen)(fen)片鍵有明顯遞(di)增(或(huo)遞(di)減)趨(qu)勢,新插入(ru)的文檔(dang)很大程(cheng)度上(shang)會分(fen)(fen)布到(dao)同(tong)一(yi)個(ge)chunk,從而無法擴展寫(xie)的能力。例(li)如,使用“_id”作為分(fen)(fen)片鍵,集群自(zi)動生成id的高位值將是遞(di)增的時(shi)間(jian)戳。
- Hash分片
根(gen)據用戶的(de)分片(pian)鍵(jian)值計算出Hash值(長(chang)度64bit且為(wei)整型),再按照范(fan)圍(wei)分片(pian)策(ce)略,根(gen)據Hash值將文檔分布到不同的(de)chunk中。基于(yu)Hash分片(pian)主(zhu)要的(de)優勢為(wei)保證數(shu)(shu)據在(zai)各(ge)節(jie)點上(shang)分布基本均勻,具有“相近”片(pian)鍵(jian)的(de)文檔很可能不會存儲在(zai)同一個數(shu)(shu)據塊中,數(shu)(shu)據的(de)分離(li)性更(geng)高。
圖 數據分布示意圖

Hash分片與范圍分片互補(bu),能將(jiang)文(wen)檔隨機分散到各(ge)個(ge)chunk,充分擴展寫能力,彌補(bu)范圍分片的不足。但所有的范圍查詢要分發到后端所有的分片,才能獲取滿(man)足條件(jian)的文(wen)檔,查詢效率低(di)。