叢集寫效能優化

CrazyZard發表於2020-03-04
  • 寫效能優化的目標:增大寫吞吐量(Events Per Second),越高越好
  • 客戶端:多執行緒,批量寫
    • 可以通過效能測試,確定最佳文件數量
    • 多執行緒:需要觀察是否有 HTTP 429 返回,實現 Retry 以及執行緒數量的自動調節
  • 伺服器端:單個效能問題,往往是多個因素造成的。需要先分解問題,在單個節點上進行調整並 且結合測試,儘可能壓榨硬體資源,以達到最高吞吐量
    • 使用更好的硬體。觀察 CPU / IO Block
    • 執行緒切換 / 堆疊狀況
  • 降低 IO 操作
    • 使用 ES 自動生成的文件 Id / 一些相關的 ES 配置,如 Refresh Interval
  • 降低 CPU 和儲存開銷
    • 減少不必要分詞 / 避免不需要的 doc_values /文件的欄位儘量保證相同的順序,可以提高文件的壓縮率
  • 儘可能做到寫入和分片的均衡負載,實現水平擴充套件
    • Shard Filtering / Write Load Balancer
  • 調整 Bulk 執行緒池和佇列
  • ES 的預設設定,已經綜合考慮了資料可靠性,搜尋的實時性質,寫入速度,一般不要盲目修改
  • 一切優化,都要基於高質量的資料建模
  • 只需要聚合不需要搜尋, Index 設定成 false
  • 不需要算分, Norms 設定成 false
  • 不要對字串使用預設的 dynamic mapping。欄位 數量過多,會對效能產生比較大的影響
  • Index_options 控制在建立倒排索引時,哪些內容 會被新增到倒排索引中。優化這些設定,一定程度 可以節約 CPU
  • 關閉 _source,減少 IO 操作;(適合指標型資料)

叢集寫效能優化

  • 如果需要追求極致的寫入速度,可以犧牲資料可靠性及搜尋實時性以換取效能
    • 犧牲可靠性:將副本分片設定為 0,寫入完畢再調整回去
    • 犧牲搜尋實時性:增加 Refresh Interval 的時間
    • 犧牲可靠性:修改 Translog 的配置
  • Refresh
    • 將文件先儲存在 Index buffer 中, 以 refresh_interval 為間隔時間,定期清空 buffer,生成 segment,藉助檔案系統快取的特性,先將segment 放在檔案系統快取中,並開放查詢,以提升搜尋的實時性
  • Translog
    • Segment 沒有寫入磁碟,即便發生了當機,重啟後,資料也能恢復,預設配置是每次請求都會落盤
  • Flush
    • 刪除舊的 translog 檔案
    • 生成 Segment 並寫入磁碟 / 更新 commit point 並寫入磁碟。 ES 自動完成,可優化點不多
  • 降低 Refresh 的頻率
    • 增加 refresh_interval 的數值。預設為 1s ,如果設定成 -1 ,會禁止自動 refresh
      • 避免過於頻繁的 refresh,而生成過多的 segment 檔案
      • 但是會降低搜尋的實時性
    • 增大靜態配置引數 indices.memory.index_buffer_size
      • 預設是 10%, 會導致自動觸發 refresh
  • 降低寫磁碟的頻率,但是會降低容災能力
      - `Index.translog.durability`:預設是 request,每個請求都落盤。設定成 async,非同步寫入
      - `Index.translog.sync_interval` 設定為 60s,每分鐘執行一次
      - `Index.translog.flush_threshod_size`: 預設 512 mb,可以適當調大。 當 translog 超過該值,會觸發 flush
  • 副本在寫入時設為 0,完成後再增加
  • 合理設定主分片數,確保均勻分配在所有資料節點上
    • Index.routing.allocation.total_share_per_node: 限定每個索引在每個節點上可分配的分片數(replicas and primaries)
    • 5 個節點的叢集。 索引有 5 個主分片,1 個副本,應該如何設定?
      • (5+5) / 5 = 2
      • 生產環境中要適當調大這個數字,避免有節點下線時,分片無法正常遷移
  • 客戶端
      - 單個 bulk 請求體的資料量不要太大,官方建議大約5-15mb
      - 寫入端的 bulk 請求超時需要足夠長,建議60s 以上
      - 寫入端儘量將資料輪詢打到不同節點。
  • 伺服器端
    • 索引建立屬於計算密集型任務,應該使用固定大小的執行緒池來配置。來不及處理的放入佇列,執行緒數應該 配置成 CPU 核心數 +1 ,避免過多的上下文切換
    • 佇列大小可以適當增加,不要過大,否則佔用的記憶體會成為 GC 的負擔

叢集寫效能優化

本作品採用《CC 協議》,轉載必須註明作者和本文連結

快樂就是解決一個又一個的問題!

相關文章