elasticsearch叢集管理指南
一、叢集規劃
搭建一個叢集我們需要考慮如下幾個問題:
1. 我們需要多大規模的叢集?
2. 叢集中的節點角色如何分配?
3. 如何避免腦裂問題?
4. 索引應該設定多少個分片?
5. 分片應該設定幾個副本?
下面我們就來分析和回答這幾個問題
1、我們需要多大規模的叢集?
需要從以下兩個方面考慮:
1.1 當前的資料量有多大?資料增長情況如何?
1.2 你的機器配置如何?cpu、多大記憶體、多大硬碟容量?
推算的依據:
ES JVM heap 最大可以設定32G 。
30G heap 大概能處理的資料量 10 T。如果記憶體很大如128G,可在一臺機器上執行多個ES節點例項。
備註:叢集規劃滿足當前資料規模+適量增長規模即可,後續可按需擴充套件。
兩類應用場景:
A. 用於構建業務搜尋功能模組,且多是垂直領域的搜尋。資料量級幾千萬到數十億級別。一般2-4臺機器的規模。
B. 用於大規模資料的實時OLAP(聯機處理分析),經典的如ELK Stack,資料規模可能達到千億或更多。幾十到上百節點的規模。
2、叢集中的節點角色如何分配?
2.1 節點角色:
Master
node.master: true 節點可以作為主節點
DataNode
node.data: true 預設是資料節點。
Coordinate node 協調節點
如果僅擔任協調節點,將上兩個配置設為false。
說明:
一個節點可以充當一個或多個角色,預設三個角色都有
協調節點:一個節點只作為接收請求、轉發請求到其他節點、彙總各個節點返回資料等功能的節點。就叫協調節點
2.2 如何分配:
A. 小規模叢集,不需嚴格區分。
B. 中大規模叢集(十個以上節點),應考慮單獨的角色充當。特別併發查詢量大,查詢的合併量大,可以增加獨立的協調節點。角色分開的好處是分工分開,不互影響。如不會因協調角色負載過高而影響資料節點的能力。
3、如何避免腦裂問題?
3.1 腦裂問題:
一個叢集中只有一個A主節點,A主節點因為需要處理的東西太多或者網路過於繁忙,從而導致其他從節點ping不通A主節點,這樣其他從節點就會認為A主節點不可用了,就會重新選出一個新的主節點B。過了一會A主節點恢復正常了,這樣就出現了兩個主節點,導致一部分資料來源於A主節點,另外一部分資料來源於B主節點,出現數據不一致問題,這就是腦裂
3.2 儘量避免腦裂,需要新增最小數量的主節點配置:
discovery.zen.minimum_master_nodes: (有master資格節點數/2) + 1
這個引數控制的是,選舉主節點時需要看到最少多少個具有master資格的活節點,才能進行選舉。官方的推薦值是(N/2)+1,其中N是具有master資格的節點的數量。
3.3 常用做法(中大規模叢集):
1. Master 和 dataNode 角色分開,配置奇數個master,如3
2. 單播發現機制,配置master資格節點:
discovery.zen.ping.multicast.enabled: false —— 關閉多播發現機制,預設是關閉的
discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"] —— 配置單播發現的主節點ip地址,其他從節點要加入進來,就得去詢問單播發現機制裡面配置的主節點我要加入到叢集裡面了,主節點同意以後才能加入,然後主節點再通知叢集中的其他節點有新節點加入
3. 配置選舉發現數,及延長ping master的等待時長
discovery.zen.ping_timeout: 30(預設值是3秒)——其他節點ping主節點多久時間沒有響應就認為主節點不可用了
discovery.zen.minimum_master_nodes: 2 —— 選舉主節點時需要看到最少多少個具有master資格的活節點,才能進行選舉
4、索引應該設定多少個分片?
說明:分片數指定後不可變,除非重索引。
思考:
分片對應的儲存實體是什麼?
儲存的實體是索引
分片是不是越多越好?
不是
分片多有什麼影響?
分片多浪費儲存空間、佔用資源、影響效能
4.1 分片過多的影響:
每個分片本質上就是一個Lucene索引, 因此會消耗相應的檔案控制代碼, 記憶體和CPU資源。
每個搜尋請求會排程到索引的每個分片中. 如果分片分散在不同的節點倒是問題不太. 但當分片開始競爭相同的硬體資源時, 效能便會逐步下降。
ES使用詞頻統計來計算相關性. 當然這些統計也會分配到各個分片上. 如果在大量分片上只維護了很少的資料, 則將導致最終的文件相關性較差。
4.2 分片設定的可參考原則:
ElasticSearch推薦的最大JVM堆空間是30~32G, 所以把你的分片最大容量限制為30GB, 然後再對分片數量做合理估算. 例如, 你認為你的資料能達到200GB, 推薦你最多分配7到8個分片。
在開始階段, 一個好的方案是根據你的節點數量按照1.5~3倍的原則來建立分片. 例如,如果你有3個節點, 則推薦你建立的分片數最多不超過9(3x3)個。當效能下降時,增加節點,ES會平衡分片的放置。
對於基於日期的索引需求, 並且對索引資料的搜尋場景非常少. 也許這些索引量將達到成百上千, 但每個索引的資料量只有1GB甚至更小. 對於這種類似場景, 建議只需要為索引分配1個分片。如日誌管理就是一個日期的索引需求,日期索引會很多,但每個索引存放的日誌資料量就很少。
5、分片應該設定幾個副本?
說明:副本數是可以隨時調整的!
思考:
副本的用途是什麼?
備份資料保證高可用資料不丟失,高併發的時候參與資料查詢
針對它的用途,我們該如何設定它的副本數?
一般一個分片有1-2個副本即可保證高可用
叢集規模沒變的情況下副本過多會有什麼影響?
副本多浪費儲存空間、佔用資源、影響效能
5.1 副本設定基本原則:
為保證高可用,副本數設定為2即可。要求叢集至少要有3個節點,來分開存放主分片、副本。
如發現併發量大時,查詢效能會下降,可增加副本數,來提升併發查詢能力。
注意:新增副本時主節點會自動協調,然後拷貝資料到新增的副本節點
二、叢集搭建
1. 準備3臺虛擬機器:
192.168.152.128 、192.168.152.129、192.168.152.130
2. 在3臺虛擬機器裡面都安裝好elasticsearch
安裝教程參考我之前寫的文章的ES的安裝和配置部分:
https://www.cnblogs.com/leeSmall/p/9189078.html
3. 修改3臺虛擬機器下ES的配置,使得它們組成一個叢集
進入elasticsearch的config目錄,修改elasticsearch.yml的配置
3.1. IP訪問限制、預設埠修改9200
這裡有兩個需要提醒下,第一個就是IP訪問限制,第二個就是es例項的預設埠號9200。IP訪問限制可以限定具體的IP訪問伺服器,這有一定的安全過濾作用。
# Set the bind address to a specific IP (IPv4 or IPv6): # network.host: 192.168.152.128
如果設定成0.0.0.0則是不限制任何IP訪問。一般在生產的伺服器可能會限定幾臺IP,通常用於管理使用。
預設的埠9200在一般情況下也有點風險,可以將預設的埠修改成另外一個,這還有一個原因就是怕開發人員誤操作,連線上叢集。當然,如果你的公司網路隔離做的很好也無所謂。
# # Set a custom port for HTTP: # http.port: 9200 transport.tcp.port: 9300
這裡的9300是叢集內部通訊使用的埠,這個也可以修改掉。因為連線叢集的方式有兩種,通過扮演叢集node也是可以進入叢集的,所以還是安全起見,修改掉預設的埠。
說明:記得修改安裝了ES的3臺虛擬機器(三個節點)的相同配置,要不然節點之間無法建立連線工作,也會報錯。
3.2 叢集發現IP列表、node、cluster名稱
緊接著修改叢集節點IP地址,這樣可以讓叢集在規定的幾個節點之間工作。elasticsearch,預設是使用自動發現IP機制。就是在當前網段內,只要能被自動感知到的IP就能自動加入到叢集中。這有好處也有壞處。好處就是自動化了,當你的es叢集需要雲化的時候就會非常方便。但是也會帶來一些不穩定的情況,如,master的選舉問題、資料複製問題。
導致master選舉的因素之一就是叢集有節點進入。當資料複製發生的時候也會影響叢集,因為要做資料平衡複製和冗餘。這裡面可以獨立master叢集,剔除master叢集的資料節點能力。
固定列表的IP發現有兩種配置方式,一種是互相依賴發現,一種是全量發現。各有優勢吧,我是使用的依賴發現來做的。這有個很重要的參考標準,就是你的叢集擴充套件速度有多快。因為這有個問題就是,當全量發現的時候,如果是初始化叢集會有很大的問題,就是master全域性會很長,然後節點之間的啟動速度各不一樣。所以我採用了靠譜點的依賴發現。
你需要在192.168.152.128的elasticsearch中配置成:
# --------------------------------- Discovery ---------------------------------- # # Pass an initial list of hosts to perform discovery when new node is started: # The default list of hosts is ["127.0.0.1", "[::1]"] # discovery.zen.ping.unicast.hosts: [ "192.168.152.129:9300","192.168.152.130:9300" ]
讓他去發現129,130的機器,以此內推,完成剩下的129和130機器的配置。
然後你需要配置下叢集名稱,就是你當前節點所在叢集的名稱,這有助於你規劃你的叢集。叢集中的所有節點的叢集名稱必須一樣,只有叢集名稱一樣才能組成一個邏輯叢集。
# ---------------------------------- Cluster ----------------------------------- # # Use a descriptive name for your cluster: # cluster.name: mycluster
配置你當前節點的名稱
# # ------------------------------------ Node ------------------------------------ # # Use a descriptive name for the node: # node.name: node-1
以此類推,完成另外兩個節點的配置。cluster.name的名稱必須保持一樣。然後分別設定node.name。
說明:
這裡搭建的是一個簡單的叢集,沒有做叢集節點角色的區分,所以3個節點預設的角色有主節點、資料節點、協調節點
選舉ES主節點的邏輯:
選舉的大概邏輯,它會根據分片的資料的前後新鮮程度來作為選舉的一個重要邏輯。(日誌、資料、時間都會作為叢集master全域性的重要指標)
因為考慮到資料一致性問題,當然是用最新的資料節點作為master,然後進行新資料的複製和重新整理其他node。
三、叢集管理
1. 監控API
http://localhost:9200/_cat
GET /_cat /_cat/health /_cat/nodes /_cat/master /_cat/indices /_cat/allocation /_cat/shards /_cat/shards/{index} /_cat/thread_pool /_cat/segments /_cat/segments/{index}
2. x-pack
為叢集提供安全防護、監控、告警、報告等功能的收費元件;
部分免費:https://www.elastic.co/subscriptions
6.3開始已開源,並併入了elasticsearch核心中。
官網安裝介紹:
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/installing-xpack-es.html
參考文章:
叢集搭建一:https://www.cnblogs.com/wangiqngpei557/p/5967377.html
叢集搭建二:https://www.cnblogs.com/jstarseven/p/6803054.html 這一篇文章寫得比較詳細,同時還總結了搭建過程中遇到的問題,搭建ES叢集的話強烈推薦