MongoDB分片需要考慮的事項
限制:
在分片環境中,最大插入速率的限制是:
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可以建立檔案塊來將資料分佈到叢集中多個分片上。
組合片鍵比較好的選擇是一個有限範圍的欄位加一個無限範圍的欄位(遞增或者隨機)。
在分片環境中,最大插入速率的限制是:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MongoDB何時考慮使用分片MongoDB
- 表空間設定考慮事項
- MongoDB分片片鍵選擇參考建議MongoDB
- 規劃5G資料庫時需要考慮的4項要素資料庫
- 確保Web應用程式安全應該考慮哪些事項Web
- MySQL中需要考慮的一些工具MySql
- MongoDB分片MongoDB
- 資料遷移中需要考慮的問題
- 遊戲策劃設計系統時,除了考慮設計目的,還需要考慮什麼?遊戲
- 2.2 資料庫建立之前需考慮的事資料庫
- MongoDB 分片管理MongoDB
- MongoDB之分片MongoDB
- mongodb分片搭建MongoDB
- mongodb分片balanceMongoDB
- 遊戲開服導量,需要考慮的三大需求遊戲
- 程式設計師採用低程式碼開發需要考慮的五件事 – thenewstack程式設計師
- mongodb 分片叢集建立分片集合MongoDB
- MongoDB分片叢集新增分片(自用)MongoDB
- oracle 中並行度的設定需要考慮的因素Oracle並行
- 網站在架構階段所要考慮的事兒網站架構
- 購買低程式碼平臺,必須考慮的關鍵指標和注意事項指標
- mongodb之shard分片MongoDB
- mongodb複製+分片MongoDB
- 選型招聘系統需要考慮的幾個要點
- 資料庫備份策略需要考慮的幾大因素資料庫
- .NET多執行緒操作需要考慮的兩大因素執行緒
- 替代 VMware ,為什麼需要重新考慮您的儲存?
- 伺服器託管需要考慮這些因素伺服器
- 建設智慧城市,需要從哪幾方面考慮?
- 【Mongodb】分片複製集環境新增新的分片MongoDB
- 選擇 NoSQL 資料庫需要考慮的 10 個問題SQL資料庫
- 公交地鐵出行的場景,需要考慮那些測試點
- 【知識分享】多ip伺服器的租用需要考慮哪些伺服器
- 好的精益工廠佈局需要考慮哪些問題?
- 擁抱雲端計算之前需要考慮的9個問題
- 論資料倉儲架構前需要考慮的問題架構
- goldengate 中使用batchsql引數需要額外考慮的地方GoBATSQL
- 重構模式(三)---- 應用 Refactoring 需要考慮的問題模式