MongoDB 運維 26 分片集羣設計

一,如何用好分片集羣

合理的架構
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. 均衡需要資源,如果資源即將或已經耗盡,均衡也是會很低效率的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章