1. 程式人生 > >Elasticsearch搜尋引擎第十三篇-叢集如何規劃

Elasticsearch搜尋引擎第十三篇-叢集如何規劃

文章目錄

我們需要多大規模的叢集

在使用ES初始階段,我們應該需要多大規模的ES叢集呢?主要從以下兩個問題入手:

  • 當前的資料量有多大?資料增長情況又是如何?
  • 你的機器配置如何?CPU、記憶體、硬碟容量多大?

推算的依據如下:

  • Elasticsearch的JVM heap大小最大不要超出32G
  • 30G的heap大概能處理的資料量10T
  • 如果一臺機器的記憶體很大,如128G,則可以在一臺機器上執行多個ES節點例項
  • 叢集規劃滿足當前資料規模+適量增長規模即可,後續可按需擴充套件

兩類應用場景:

  • 用於構建業務搜尋功能模組,且多是垂直領域的搜尋,資料量級幾千萬到數十億級別,一般2-4臺機器的規模。
  • 用於大規模資料的實時OLAP(聯機處理分析),經典的如ELK Stack,資料規模可能達到千億或更多,幾十到上百節點的規模。

叢集中的節點角色如何分配

一個節點可以充當一個或多個角色,預設三個角色都有:

  • Master:主節點,負責維護叢集元資料,配置項node.master:true
  • DataNode:資料節點,負責儲存資料,配置項node.data:true
  • CoordinateNode:協調節點,負責接收並轉發請求、查詢合併,如果僅擔任協調節點,將以上兩個配置設為false

分配規則:

  • 小規模叢集,不需嚴格區分
  • 中大規模叢集(十個以上節點),應考慮單獨的角色充當。特別併發查詢量大,查詢的合併量大,可以增加獨立的協調節點。角色分開的好處是分工分開,不互影響。如不會因協調角色負載過高而影響資料節點的能力。

如何避免腦裂問題

腦裂,存在擁有master節點的分散式叢集中。一個叢集中正常情況下有一個master存在,但是如果發生網路中斷、堵塞等情況,導致其他節點無法ping到該master,則叢集會判斷master節點掛了(實際比沒有掛掉),會重新選舉一個master節點,此時叢集會有兩個master節點,稱為腦裂。

官方一個推薦的設定可以儘量避免腦裂:

discovery.zen.minimum_master_nodes=(有master資格的節點數/2)+1

這個引數控制的是,選舉主節點時需要看到最少多少個具有master資格的活節點,才能進行選舉。官方的推薦值是(N/2)+1,其中N是具有master資格的節點的數量。具有master資格的節點配置如下:

node.master:true
node.data:false

常用的做法如下(中大規模叢集):

  • Master和DataNode角色分開,配置奇數個master,如3
  • 單播發現機制,配置master資格節點
    discovery.zen.ping.multicast.enabled: false  
    discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"]  
    
  • 配置選舉發現數,及延長ping master的等待時長
    discovery.zen.ping_timeout: 30(預設值是3秒)
    discovery.zen.minimum_master_nodes: 2
    

索引應該設定多少個分片

分片對應的儲存是體是索引,分片並不是越多越好,分片數指定後不可變,除非重索引。

分片過多的影響:

  • 每個分片本質上就是一個Lucene索引,因此會消耗相應的檔案控制代碼,記憶體和CPU資源。
  • 每個搜尋請求會排程到索引的每個分片中,如果分片分散在不同的節點倒是問題不太,但當分片開始競爭相同的硬體資源時,效能便會逐步下降。
  • ES使用詞頻統計來計算相關性,當然這些統計也會分配到各個分片上。如果在大量分片上只維護了很少的資料,則將導致最終的文件相關性較差。

分片設定的參考原則:

  • ElasticSearch推薦的最大JVM堆空間是30~32G, 所以把你的分片最大容量限制為30GB, 然後再對分片數量做合理估算. 例如, 你認為你的資料能達到200GB, 推薦你最多分配7到8個分片。
  • 在開始階段, 一個好的方案是根據你的節點數量按照1.5~3倍的原則來建立分片. 例如,如果你有3個節點, 則推薦你建立的分片數最多不超過9(3x3)個。當效能下降時,增加節點,ES會平衡分片的放置。
  • 對於基於日期的索引需求, 並且對索引資料的搜尋場景非常少. 也許這些索引量將達到成百上千, 但每個索引的資料量只有1GB甚至更小. 對於這種類似場景, 建議只需要為索引分配1個分片

分片應該設定幾個副本

副本分片時用來備份主分片的,副本數是可以隨時調整的

設定副本分片的原則:

  • 為保證高可用,副本數設定為2即可。要求叢集至少要有3個節點,來分開存放主分片、副本。
  • 如發現併發量大時,查詢效能會下降,可增加副本數,來提升併發查詢能力。