Elasticsearch:深入集群優化
為打造一個高查詢和高索引吞吐量、高穩定性的 Elasticsearch 集群,相信以下幾點配置優化都很重要。
1、設置Java堆大小
-Xmx和-Xms設置成同樣的值,例如16G
不宜超過物理內存的一半,比如伺服器是32G,Heap大小可以設置為16G,官方說了,不要設置太大超過32G,可能導致長GC。
2、索引日常維護
日常維護也是一個很重要的工作,不僅僅可以釋放內存、節省磁碟空間,還可以加快檢索速率1)刪除過期索引
2)關閉日常沒有搜索的索引
3)不更新的索引可以進行強制合併3、Index刷寫速率配置
調整索引刷新頻率,但是不能太小。太小會造成索引頻繁刷新,新的數據寫進去就慢了,索引速度也並不一定就快。可以提高提吐量:
index.refresh_interval:15s
4、可以分開配置主節點和數據節點
儘可能保持高可用,設置 node.master和node.data,這樣大家職責清楚,要麼接受主節點(只接受請求和管理節點)和數據節點(只存儲數據)
例如在: elasticsearch.yml配置數據節點
node.master: false
node.data: true
5、主節點選取的配置:防止腦裂
所謂腦裂問題(類似於精神分裂),就是同一個集群中的不同節點,對於集群的狀態有了不一樣的理解。集群如果6個節點,故障恢復後,有時候可能會形成2個--3節點的集群,導致不能正常工作。
可能導致的原因:
1.)網路:由於是內網通信,網路通信問題造成某些節點認為master死掉,而另選master的可能性較小;進而檢查Ganglia集群監控,也沒有發現異常的內網流量,故此原因可以排除。
2.)節點負載:由於master節點與data節點都是混合在一起的,所以當工作節點的負載較大(確實也較大)時,導致對應的ES實例停止響應,而這台伺服器如果正充當著master節點的身份,那麼一部分節點就會認為這個master節點失效了,故重新選舉新的節點,這時就出現了腦裂;同時由於data節點上ES進程佔用的內存較大,較大規模的內存回收操作也能造成ES進程失去響應。所以,這個原因的可能性應該是最大的。
解決方法:
discovery.zen.minimum_master_nodes屬性,連接節點的最小數目
設置為所有可用節點個數加1的50%(如果6個節點數量, 官方的推薦值是(N/2)+1,就是4),將只會有一個4節點的集群。另外2個無法組成一個集群,只能等待重新連接會到集群。
6、配置單播和多播
使用單播時,總是設置discovery.zen.ping.multicast.enabled為false。
7、節點ping設置,更多等待時間設置
discovery.zen.fd.ping_interval:該屬性默認為1s(1秒鐘),指定了節點互相ping的時間間隔。
? discovery.zen.fd.ping_timeout:該屬性默認為30s(30秒鐘),指定了節點發送ping信息後等待響應的時間,超過此時間則認為對方節點無響應。
? discovery.zen.fd.ping_retries:該屬性默認為3,指定了重試次數,超過此次數則認為對方節點已停止工作。
希望對大家有幫助,謝謝。
推薦閱讀:
※MongoDB 實現全文檢索的最佳解決方案是什麼?
※Solr,Lucene 優化有哪些相關經驗可分享?
TAG:Elasticsearch | Solr | 全文检索 |