1. 程式人生 > >ElasticSearch優化方式

ElasticSearch優化方式

  1. ES每個分片是一個Lucence例項,所以分片數量不應過多。但是分片數一旦設定好就不能修改,如果設定過少等資料量上去後不能擴容,這時可以考慮增加索引庫的方式來增加分片數。比如一個索引庫設定20個分片,增加一個索引庫就等於增加了20個分片。應用程式如何知道增加了索引庫呢?這時需要用到ES的別名功能,將一個別名對映到多個實際的索引庫,而應用程式使用別名即可,別名對映的實際索引庫可以動態修改而對應用程式透明。
  2. 可以從這幾個方面來觀測ES的效能指標:
    • cpu消耗
    • 記憶體消耗
    • 磁碟io和網路io
    • jvm的gc情況
    • es的各個執行緒池和佇列的負荷
  3. Elasticsearch 需要使用大量的堆記憶體, 而 Lucene 則需要消耗大量非堆記憶體 (off-heap)。推薦給 ES 設定本機記憶體的一半, 如32G 記憶體的機器上, 設定 -Xmx16g -Xms16g ,剩下的記憶體給 Lucene 。
  4. 如果不需要對分詞字串做聚合計算(例如,不需要 fielddata )可以考慮降低堆記憶體。堆記憶體越小,Elasticsearch(更快的 GC)和 Lucene(更多的記憶體用於快取)的效能越好。
  5. 針對io高的優化方式:
    • 儘量保證一個分片只落在一個硬碟上面,這樣不用跨磁碟讀寫
    • 檢查mapping,es預設會將所有欄位寫入_all欄位,如果實際業務不需要可以關閉,減少儲存空間
    • 同樣的,如果不需要儲存原始資料,可以關閉_source,或者只設置某些必要欄位的store屬性 store:true
    • 查詢時只返回必要的資料
    • 採用_doc排序可以依賴lucence內部id排序,提高排序速度
  6. 注意防止腦裂:
    • discovery.zen.minimum_master_nodes > = ( master 候選節點個數 / 2) + 1 
  7. 如果有節點掛掉,不要急於恢復叢集導致分片資料的大量複製和傳輸,應儘量等節點自己恢復:
    • gateway.recover_after_nodes: 8 # 等待叢集至少存在 8 個節點 後才能進行資料恢復
      gateway.expected_nodes: 10
      gateway.recover_after_time: 5m # 等待 5 分鐘,或者 10 個節點上線後,才進行資料恢復,這取決於哪個條件先達到
  8. 升級的過程因為需要關閉節點再重啟,這時也要防止es自動恢復的操作:
    • 可能的話,停止索引新的資料
    • 禁止分片分配,這樣es不會自動平衡缺失的分片:
      • PUT /_cluster/settings
            {
                "transient" : {
                    "cluster.routing.allocation.enable" : "none"
                }
            }
    • 這時關閉節點,升級好後再加入叢集,然後重啟分片分配即可:
      • "cluster.routing.allocation.enable" : "all"
  9. 可以考慮在ES前面加一個kafka之類的訊息快取,防止資料量的瞬間暴增對es