1. 程式人生 > >elasticsearch-cluster on kubernetes

elasticsearch-cluster on kubernetes

1.elasticsearch叢集基礎

預設情況下,elasticsearch叢集中每個節點都有成為主節點的資格,也都儲存資料,還可以提供查詢服務。這些功能是由兩個屬性控制的:node.masternode.data

  • node.master:這個屬性表示節點是否具有成為主節點的資格。
    注意:此屬性的值為true,並不意味著這個節點就是主節點。因為真正的主節點,是由多個具有主節點資格的節點進行選舉產生的。所以,這個屬性只是代表這個節點是不是具有主節點選舉資格。
  • node.data:這個屬性表示節點是否儲存資料。

這兩個屬性可以有四種組合:

  • 混合節點:node.master: true
    node.data: true這種組合表示這個節點既有成為主節點的資格,又儲存資料,還會處理客戶端的請求。這個時候如果某個節點被選舉成為了真正的主節點,那麼他還要儲存資料,這樣對於這個節點的壓力就比較大了。elasticsearch預設每個節點都是這樣的配置,在測試環境下這樣做沒問題。實際工作中建議不要這樣設定,這樣相當於主節點和資料節點的角色混合到一塊了。
  • data節點:node.master: falsenode.data: true這種組合表示這個節點沒有成為主節點的資格,也就不參與選舉,只會儲存資料。這個節點我們稱為data(資料)節點。在叢集中需要單獨設定幾個這樣的節點負責儲存資料。後期提供儲存和查詢服務。
  • master節點:node.master: truenode.data: false這種組合表示這個節點不會儲存資料,有成為主節點的資格,可以參與選舉,有可能成為真正的主節點。這個節點我們稱為master節點。
  • client節點:node.master: falsenode.data: false這種組合表示這個節點既不會成為主節點,也不會儲存資料,這個節點的意義是作為一個client(客戶端)節點,主要是針對海量請求的時候可以進行負載均衡。

預設情況下這兩個屬性的值都是true,即每個節點都有成為主節點的資格,也會儲存資料,還會處理客戶端的請求。在生產環境下,如果不修改elasticsearch節點的角色資訊,在高資料量,高併發的場景下叢集容易出現腦裂等問題。Elasticsearc的最佳實踐推薦一個elasticsearch叢集進行如下設定:

  1. 建議叢集中設定3臺以上的節點作為master【node.master: true node.data: false】節點(普通伺服器即可,CPU、記憶體消耗一般),這些節點只負責成為主節點,維護整個叢集的狀態。
    master節點主要功能是維護元資料,管理叢集各個節點的狀態,資料的匯入和查詢都不會走master節點,所以master節點的壓力相對較小,因此master節點的記憶體分配也可以相對少些;但是master節點是最重要的,如果master節點掛了或者發生腦裂了,你的元資料就會發生混亂,那樣你叢集裡的全部資料可能會發生丟失,所以一定要保證master節點的穩定性。
  2. 再根據資料量設定一批data【node.master: false node.data: true】節點(主要消耗磁碟,記憶體),這些節點只負責儲存資料,後期提供建立索引和查詢索引的服務。
    data節點是負責資料的查詢和匯入的,它的壓力會比較大,它需要分配多點的記憶體,選擇伺服器的時候最好選擇配置較高的機器(大記憶體,雙路CPU,SSD…);data node要是壞了,可能會丟失一小份資料。
  3. 如果使用者請求比較頻繁,data節點的壓力也會比較大所以在叢集中建議再設定一批client【node.master: false node.data: true】節點(普通伺服器即可,如果要進行分組聚合操作的話,建議這個節點記憶體也分配多一點),這些節點只負責處理使用者請求,實現請求轉發,負載均衡等功能。
    client節點是作為任務分發用的,它裡面也會存元資料,但是它不會對元資料做任何修改。client node存在的好處是可以分擔下data node的一部分壓力;為什麼client node能分擔data node的一部分壓力?因為es的查詢是兩層匯聚的結果,第一層是在data node上做查詢結果匯聚,然後把結果發給client node,client node接收到data node發來的結果後再做第二次的匯聚,然後把最終的查詢結果返回給使用者;所以我們看到,client node幫忙把第二層的匯聚工作處理了,自然分擔了data node的壓力。

2.部署

這篇文章介紹在k8s上部署3個master例項、2個client例項和2個data例項的高可用elasticsearch叢集環境。

2.1注意:

1.Elasticsearch pod需要用privileged模式執行init-container來設定一些引數,這需要kubelet的啟動時加入如下引數:--allow-privileged,否則init-container會啟動失敗。
2.ES_JAVA_OPTS預設設定為-Xms256m -Xmx256m,可能會有些小,可以根據需要在yaml檔案中進行修改。
3.cpu數量預設設定為1,可以根據需要修改resources.limits.cpu引數,但一定要是整數。

2.2yaml檔案

3.參考