高查詢和高吞吐量
過濾器緩存
過濾器緩存負責存查詢中使用到的過濾器。
Elasticsearch包含兩種類型的過濾器緩存:節點過濾去緩存(默認)和索引過濾器緩存。
節點過濾器緩存被分配在節點上的所有索引共享,可以配置成使用特定大小的內存,或分配給Elasticsearch總內存的百分比。屬性是indices.cache.filter.size。
索引過濾器緩存基於索引級別,一般來說,應該使用節點級別的過濾器緩存,因為很難預測每個索引最終緩存大小,通常也不知道最終節點會有多少索引。
字段數據緩存和斷路器
字段數據緩存是Elasticsearch緩存的一部分,主要用於當查詢對字段執行排序或切面時。構建字段數據緩存是昂貴的。
允許用於字段數據緩存的內存大小用indices.fielddata.cache.size屬性來控制。這些值是節點級別的。此外,默認情況下,字段數據緩存的大小是無限的。
我們可以控制字段數據緩存的過期時間,默認情況下字段數據緩存是永不過期的。用indices.fielddata.cache.expire屬性來控制。重建字段數據緩存是非常昂貴的,一般情況下,不應該設置過期時間。
斷路器
字段數據斷路器允許估計一個字段加載到緩存所需的內存。利用它,可以拋出異常防止一些字段加載到內存。有兩個屬性來控制其行為,indices.fielddata.break.limit,默認是80%。indices.fielddata.break.overhead,默認是1.03,定義了用來與原始估計相乘的一個常量。
存儲模塊
Elasticsearch中的存儲模塊負責控制如何寫入索引數據。
利用index.store.type屬性,指定使用存儲的類型:

索引緩沖和刷新率
Elasticsearch允許設置最大的內存數。indices.memory.index_buffer_size設置節點上所有索引分片共擁有的最大內存大小。例如20%,Elasticsearch提供最大堆大小20%的內存給索引緩沖。
indices.memory.min_index_buffer_size,默認是4mb,允許每個分片設置最小索引緩沖。
索引刷新率
index.refresh_interval指定在索引搜索器對象刷新頻率,默認是1s,基本意味着數據視圖刷新的頻率。刷新率越低,文檔對搜索操作可視的時間越短和索引操作將會變慢。
當對數據重建索引時,建議在索引階段把index.refresh_interval屬性設為-1。
線程池的配置
Elasticsearch使用多個池來控制線程的處理。
Elasticsearch公開的如下線程池類型:



一些通用的建議來配置高索引和查詢吞吐量的集群
必須給予Elasticsearch足夠的內存,而且是物理內存。一般來說,運行Elasticsearch的JVM進程不應該超過可用內存的50%或60%。另外,把Xms和Xmx參數設置為相同的值以避免JVM堆的大小調整。
- 選擇正確的存儲
除了物理內存以外,應該選擇正確的存儲實現。如果運行64位操作系統,應該選擇mmapfs。如果沒有運行64位系統,UNIX系統選擇niofs,windows系統選擇simplefs。如果可以容忍一個易失的存儲,但希望它非常快,可以選擇memory存儲。 - 索引刷新率
刷新率指定文檔多塊可以對搜索可見。刷新率越快,查詢越慢,索引吞吐量越低。如果允許一個較慢的刷新率,如10s或30s,這使得Elasticsearch承受的壓力更少,因此內部對象重新打開的頻率更低,因此,將有更多的資源用於索引和查詢。 - 優化線程池
強烈建議調整默認線程池,尤其是查詢操作。在性能測試之后,通常看到集群上的查詢不堪重負,這是應該開始拒絕請求。大多數情況下,最好立刻拒絕該請求,而不是放到隊列中並強制程序等待很長時間請求處理。 - 優化合並過程
合並過程很大程度上取決於用例,以及若干因素。查詢多個段跟查詢數量更少的段相比更慢。但是,想查詢數目更少的段,需要更多的代建進行合並。
通常來說,如果想查詢更快,應該以索引中更少的段為目標。如果想索引更快,應該有更多的段。使用並行合並調度器並調整默認調節值,是I/O子系統不會被合並吞沒。 - 字段數據緩存和斷路器
默認情況下,字段數據緩存是無限的。有兩個不同因子可以調節,來確保不會遇到內存不足錯誤。首先,可以限制字段數據緩存的大小。其次是斷路器,通過它配置成加載過多數據時拋出一個異常。 - 索引的內存緩沖區
用於索引緩沖區的可用內存越多(indices.memory.index_buffer_size),Elasticsearch可以在內存總保存的文檔也越多。默認情況下,屬性值是10%,如果需要更高的索引比例,可以提高這個百分比。 - 優化事務日志
Elasticsearch有個內部模塊稱為translog。它是分片上的結構,為預寫日志服務。
默認情況下,Elasticsearch在事務日志中保存最多5000次操作,同時最大不超過200mb。如果想要更高的索引吞吐量,又可以承擔數據對搜索操作不可見的時間更長,就可以提高這個默認值。index.translog.flush_threhold_ops和index.translog.flush_threhold_size(兩者都是索引上的設置,可以通過Elasticsearch API實時更新)。 - 牢記於心
除了上面提到的因素,應該監視Elasticsearch集群並作出相應的反應。
