1. 什麼時候啟用分區?
答: 雖然分區很強大,但是它也需要更多的硬體以及更加複雜的配置。對於採用分區的思路應該是寧可不用也不亂用。但是也要提前做好準備,不要到了快撐不住的時候才開始考慮,因為那個時候能給你思考的時間並不多。如果應用到最後仍是要採用分區的話,那在最開始就要考慮清楚到底是哪些集合會採用分區。以及設計好片鍵。
當滿足如下三個條件其中一個,也可以考慮採用分區:
(一) 資料集大小接近單個節點的儲存容量。
(二) 活躍資料量接近節點最大記憶體容量。
(三) 節點的寫請求速度無法滿足要求。(讀請求速度無法滿足要求的時候可以通過讀寫分離的方式或者replicSet模式)
2. 標準配置:
3個佈建服務執行個體,每一個片都是一個replicSets,至少一個路由執行個體。路由執行個體不佔資源可以跟儲存資料節點布署在同一台機器。
3. 資料分區儲存時預設塊大小64MB。
4. 什麼時候才會遷移資料(只考慮資料量這一方面)
答:(一)在2.2版本之前,當最大資料量的節點的塊數量比最小資料量的節點的塊資料相差值達到8塊,就會發生遷移。
(二)在2.2版本之後,引入了遷移閥值。遷移閥值也是用來形容不同節點之間資料區塊的差值,只不過它會隨著節點的資料區塊大小的增加而增加。
當節點的資料區塊不超過20塊時(所有節點的資料區塊之和),遷移閥值為2。即最大數量的資料區塊與最小數量的資料區塊的差值達到2塊時就發生資料移轉 。
當節點的資料區塊在20-80塊之間,遷移閥值為4。同理。
當節點的資料區塊超過80塊,遷移閥值為8。同理。
(三)當開始遷移資料後,直到任何兩個節點之間的資料區塊的差值不超過2才停止。
5. 片鍵
(一)片鍵是集合的列。且必須每條記錄都存在這一列。不然一條不存在片鍵列的記錄無法分配。
(二)片鍵可以是單列,也可以是多列。
(三)資料的分布是基於片鍵的範圍規化。試想一下,如果以一個timestamp列為片鍵,那麼對於插入而言,總是操作於最後一個資料節點。
(四)片鍵一旦選擇後是不可更改的。如果沒有指定片鍵,系統預設使用ObjectID做片鍵。
6. 如何選擇片鍵
(一)片鍵要有利於分塊。每個塊的片鍵範圍必須是不同的。試想一下,如果片鍵的可能值很少只有幾個。那麼能分成的塊至多就跟片鍵的可能值個數一樣。這樣一來,一個塊的資料量超過預設塊大小64MB後,無法分塊。這樣就影響讀的速度。
(二)片鍵要有利於分散寫請求。不能因為片鍵的分布讓寫操作只操作於某一個節點。試想一下,如果以ObjectID為片鍵,ObjectID是按時間遞增的,所以最新插入的資料的ObjectID肯定是最大的,也因此都會分配到同一個節點中。這時插入操作都操作於某一個節點。這個節點就有可能成為瓶頸。如果大部分寫操作是update,那麼效能影響要少一些。
(三)分鍵要有利於查詢資料。如果查詢條件中有片鍵這個條件,那麼路由就可以根據片鍵條件將查詢直接轉寄到符合片鍵分布的節點然後再進行資料查詢。試想一下,如果查詢條件中不包含片鍵條件,那麼路由就必須將請求轉寄到所有的節點進行資料查詢。