【MongoDB】在windows平台下mongodb的分區叢集(五),mongodb叢集

來源:互聯網
上載者:User

【MongoDB】在windows平台下mongodb的分區叢集(五),mongodb叢集

本篇接著上面的四篇繼續講述在window平台下mongodb的分區叢集搭建。在分區叢集中也照樣可以建立索引,建立索引的方式與在單獨資料庫中建立索引的方式一樣。因此這不再多說。本篇主要聚焦在分區鍵的選取問題上。

分區鍵通俗來說就是分割海量資料的標記符。 如果更高效的劃分海量資料往往依賴於分區鍵的選擇。 分區鍵選得不好,應用程式就無法利用分區叢集所提供的諸多優勢。在這種情況下,查詢和插入得系能都回顯著下降。

一、低效的分區鍵 1.1 分布差 

BSON對象ID是每個mongodb文檔的預設主鍵。所有的對象ID最重要的組成部分是時間戳記,也就是說對象ID是升序的,遺憾的是升序對於分區鍵來說是很糟糕的。由於分區是基於範圍的。使用升序的分區鍵後,所有最近插入的文檔會落在某個很小的連續範圍內。如果想讓插入負載分不到多個分區上,就不能使用升序分區鍵,應需某些隨機性更強發的的東西。

1.2 缺乏局部性升序分區鍵由明確的方向,完全隨機的分區鍵根部沒有方向。前者無法分散插入,而後者則可能將插入分散太慢。假設分區集合中每個文檔都包含一個MD5,而MD5欄位就是分區鍵。因為MD5隨著文檔的不同而進行變化。所有該分區鍵能確保插入的文檔均勻分布在叢集的分區上。但是有個問題,對於每個分區的MD5欄位索引進行的插入過程中,索引中每個虛擬記憶體分頁都有可能被訪問到。這就意外著有可能所有的索引和資料都裝在記憶體中。從而超出了實體記憶體。
3. 無法拆分的塊  隨機分區鍵和升序分區鍵都不好用,那麼就嘗試一下粗粒度分區鍵。舉個例子,例如使用者Id上傳了100張照片,那麼分區鍵就是使用者ID,第一原因對於每張照片來說具有隨機性,同時可以通過局部性引用來提升效率。但有個問題就是當使用者ID上傳的照片太大時候,以至於不得不分塊。而系統又不能把一個使用者的照片拆分成多個快。
二、理想的分區鍵
通過上面分析,理想的分區鍵應該滿足: 
1. 將插入資料均勻分布到各個分區上2.保證crud操作能夠利用局部性3. 有足夠的粒度進行塊劃分
舉個例子:建立一個網站分析系統,一個不錯的資料模型就是每個網頁每月儲存一個文檔,隨後在那個文檔中保持該月每天的資料,每次訪問某個頁面增加一些計數器欄位。下面是於分區鍵有關的執行個體分析文檔:
{   _id: objectId("34535353245eraf32223sdarwe")  domin:"org.mongod"  url:"download" perid:"2011-12"}
最簡單的分區就是包含每個網頁的網域名稱,隨後是url{domain:1, url:1}所有來自指定域的頁面通常都落在一個分區上,但是一些特殊的域擁有大量頁面,在必要時候仍會被拆分到分區上。

備忘:本篇內容大多引自《MongoDB in action》 Kyle Banker著 




相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.