MongoDB分片需要考慮的事項

chenfeng發表於2016-09-04
限制:
在分片環境中,最大插入速率的限制是:
1.叢集的分片數目
2.選擇的片鍵
因為MongoDB使用基於片鍵範圍的分塊來分佈資料,片鍵的選擇可以控制MongoDB的資料分佈,並影響系統寫入和查詢的效能。
理想狀態下,片鍵應該具備以下兩個特性:
1.在各個分片之間平衡資料插入。
2.大多數查詢可以路由到滿足需要的分片的子集。

但MongoDB很難滿足下面這些標準:
時間戳
    基於時間戳或者插入時間(也就是ObjectID)的片鍵最終都會變得越來越大,因此資料將插入單個分片。這會導致插入不平衡。
雜湊(Hashs)
    如果片鍵是隨機的,那麼查詢將需要廣播到所有的分片。該查詢就不是可路由的。


下面將詳細討論如何選擇分片和片鍵

選擇1:根據時間分片
儘量使用時間戳,或者使用_id欄位的ObjectID,會將資料平均分佈在各個分片上,這將意味著分片叢集擁有和單個例項相同的吞吐量。
假定頻繁訪問近期資料,那麼大多數讀操作傾向於讀取叢集中相同的分片。


選擇2:根據半隨機鍵來分片
為了將資料更平均的分佈到分片上,可能需要考慮使用一個更隨機的資料碎片,例如可以使用_id欄位的hash值(也就是使用ObjectID作為片鍵)。
儘管這樣會給應用程式需要生成片鍵,會帶來一些額外的複雜性,但這麼做會將寫操作分佈到多個分片上。例如如果有5個分片,就可以提供五倍於單個例項的寫效能。
使用該片鍵,或者任何其他hash值來作為片鍵,有如下缺點:
1.片鍵和片鍵的索引將消耗資料庫額外的儲存空間。
2.查詢(除非它們包含了片鍵本身)必須在所有分片上並行執行,這將導致效能的下降。


選擇3:
如果文件裡某個欄位的值是在文件中平均分佈的,那麼強烈建議考慮使用該鍵作為片鍵。
例如可以考慮使用path欄位,這樣做的好處如下:
1.可以平均分佈各個分片的寫操作
2.讀操作可以是有選擇的,如果查詢選擇指定path欄位,那麼可以定位到單個分片上。
缺點如下:
所有命中一個特定的path的都必須指向同一個檔案塊(trunk),該塊不能被MongoDB切分,因為該塊中的所有文件都有相同的片鍵。如果網站有比較平均的負載,
這可能並不是一個問題。但是如果某一個頁面有一個不成比例的訪問,那麼最終就會導致生成一個很大的檔案塊,該檔案塊不能被切分,並導致分片上的負載無法平衡。


選擇4:綜合使用固有的和合成的鍵來進行分片
MongoDB支援採用組合片鍵,該組合鍵可以綜合選擇2和選擇3的最佳方面。在這些情形下,片鍵形式類似於{pash:1,ssd:1},這裡path是一個經常使用的資料中固有的
鍵,而ssd一個_id欄位的雜湊值。
使用這種型別的片鍵,資料大體上根據固有的鍵來分佈,也就是根據path來分佈,這使得大多數查詢只需要根據path欄位訪問單個或者一組分片。同時如果沒有
足夠多的path值用於分佈,ssd使得MongoDB可以建立檔案塊來將資料分佈到叢集中多個分片上。

組合片鍵比較好的選擇是一個有限範圍的欄位加一個無限範圍的欄位(遞增或者隨機)。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2124453/,如需轉載,請註明出處,否則將追究法律責任。

相關文章