一,如何用好分片集羣
合理的架構
1. 是否需要分片
2. 需要多少分片
3. 數據的分佈規則
正確的姿勢
1. 選擇需要分片的表
2. 選擇正確的片鍵
3. 使用合適的均衡策略
足夠的資源
1. CPU
2. RAM
3. 存儲
二,合理的機構--分片大小
1. 分片的基本標準
1.1 關於數據: 數據量不超過3TB,儘可能保持在2TB 一個片
1.2 關於索引: 常用索引必須容納進內存
按照以上標準初步確定分片後,還需要考慮業務壓力,隨着壓力增大,CPU,RAM, 磁盤中任何一項出現瓶頸,都可以通過添加更多分片來解決
三,合理的架構--需要多少個分片
A= 所需存儲總量/ 單服務器可掛載容量 (8TB/2TB=4)
B= 工作集大小/ 單服務器內存容量 (400GB/ 256G*0.6)=3
C= 併發量總數/ 單服務器併發量*0.7 (30000/(9000*0.7)=6
分片數量= max(A,B,C)=6
四,合理的架構--其他需求
考慮分片的分佈
1. 是否需要跨機房分佈分片
2. 是否需要容災
3. 高可用的需求如何
五,正確的姿勢
各種概念由小到大:
1. 片鍵shard key : 文檔中的一個字段
2. 文檔doc : 包含shard key 的一行數據
3. 塊chunk: 包含n 個文檔
4. 分片shard: 包含n個chunk
5. 集羣cluster: 包含n個分片
六,正確姿勢--選擇合適片鍵
影響片鍵效率的主要因素
1.取值基數
2. 取值分佈
3. 分散寫,集中讀
4. 被儘可能多的業務場景用到
5. 避免單調遞增或遞減的片鍵
七,正確的姿勢--選擇基數大的片鍵
對於小基數的片鍵:
1.因爲備選值有限,那麼塊的總數量有限;
2.隨着數據增多,塊的大小會越來越大;
3.太大的塊,會導致水平擴展時移動塊會非常困難
例如:存儲一個高中的師生數據,以年齡(假設年齡範圍爲15-65歲)作爲片鍵,那麼:
15<= 年齡 <=65,且只爲整數
最多隻會有51個chunk
結論:取值基數要大
八,正確的姿勢-選擇分佈均勻的片鍵
對於分佈不均勻的片鍵
1. 造成某些塊的數據量急劇增大
2. 這些塊壓力隨之增大
3. 數據均衡以chunk 爲單位,所以系統無能爲力
例如:存儲一個高中的師生數據,以年齡(假設年齡範圍爲15-65歲)作爲片鍵,那麼:
15<= 年齡 <=65,且只爲整數
大部分的年齡範圍爲15-18歲(學生)
15,16,17,18四個chunk 的數據量,訪問壓力遠大於其他chunk
結論:取值分佈應儘可能均勻
九,正確的姿勢--定向性好
考慮: 4個分配的集羣,你洗完讀某條特定的數據
如果你用片鍵作爲條件查詢,mongos 可以直接定位到具體分分片
如果你不用片鍵,mongos 需要把查詢發到4個分片
等最後一個分片響應,mongos 才能響應應用端
結論: 對主要查詢要具有定向能力
十,一個Email 系統的片鍵例子
{
_id: ObjectId(),
user: 123,
time: Date(),
subject: "...",
recipients:[],
body: '...",
attchments:[]
}
片鍵 : {_id:1} | 片鍵:{_id: "hashed"} | 片鍵:{user_id: 1} | 片鍵:{user_id: 1,time:1} | |
基數 | √ | √ | X | √ |
寫分佈 | X | √ | √ | √ |
定向查詢 | X | X | √ | √ |
十一,足夠的資源
1.mongos 與config 通常消耗很少的資源,可以選擇低規則虛擬機;
資源的重點在於shard 服務器:
1.需要足以容納熱數據索引的內存;
2.正確創建索引後CPU 通常不會成爲瓶頸,除非設計非常多的計算
3.磁盤儘量選用ssd
最後,實際測試是最好的檢驗,來看你的資源配置是否完備
2.即使項目初期已經具備足夠的資源,仍然需要考慮何時的時候擴展
建議監控各項資源使用情況,無論那一項達到60%以上則開始考慮擴容
1. 擴展需要新的資源,申請新的資源需要時間
2. 擴展後數據需要均衡,均衡需要時間,應保證新數據入庫速度慢於均衡速度
3. 均衡需要資源,如果資源即將或已經耗盡,均衡也是會很低效率的