白话Elasticsearch64-zen discovery集群发现机制
文章目錄
- 概述
- zen discovery集群發現機制
- (1)ping
- (2)unicast
- (3)master選舉
- (4)集群故障的探查
- (5)集群狀態更新
- (6)不因為master宕機阻塞集群操作
概述
繼續跟中華石杉老師學習ES,第64篇
課程地址: https://www.roncoo.com/view/55
zen discovery集群發現機制
Q: 現在有多臺主機,每臺機器部署一個es進程,每臺機器都啟動一個es進程,你怎么讓多臺機器上的多個es進程,互相發現對方,然后完美的組成一個生產環境的es集群呢??
默認情況下,es進程會綁定在自己的回環地址上,也就是127.0.0.1,然后掃描本機上的9300~9305端口號,嘗試跟那些端口上啟動的其他es進程進行通信,然后組成一個集群。 這對于在本機上搭建es(偽)集群的開發環境是很方便的。
但是對于生產環境下的集群是不行的,需要將每臺es進程綁定在一個非回環的ip地址上,才能跟其他節點進行通信,同時需要使用集群發現機制來跟其他節點上的es node進行通信。
大家還記不記得,我們如果在windows上自己玩兒的話,是不是說,你直接啟動多個es進程,他們自己就會組成一個集群
在生產環境中的多臺機器上部署es集群,就涉及到了es的discovery機制,也就是集群中各個節點互相發現然后組成一個集群的機制,同時discovery機制也負責es集群的master選舉,關于master,一會兒說。
默認情況下,elasticsearch 集群中每個節點都有成為主節點的資格,也都存儲數據,還可以提供查詢服務。這些功能是由兩個屬性控制的。
默認情況下這兩個屬性的值都是true。
還有一個協調節點 coordinate 節點。
node.master:這個屬性表示節點是否具有成為主節點的資格 . 注意:此屬性的值為 true,并不意味著這個節點就是主節點。因為真正的主節點,是由多個具有主節點資格的節點進行選舉產生的。所以,這個屬性只是代表這個節點是不是具有主節點選舉資格。
node.data:這個屬性表示節點是否存儲數據。
master、data 和 client 節點
es是一種peer to peer,也就是p2p點對點的分布式系統架構,不是hadoop生態普遍采用的那種master-slave主從架構的分布式系統。集群中的每個node是直接跟其他節點進行通信的,而不是hadoop生態系統中的那種master-slave分布式系統架構。
幾乎所有的API操作,比如index,delete,search,等等,都不是說client跟master通信,而是client跟任何一個node進行通信,那個node再將請求轉發給對應的node來進行執行。
兩個角色,master node,data node。正常情況下,就只有一個master node。master node的責任就是負責維護整個集群的狀態信息,也就是一些集群元數據信息,同時在node加入集群或者從集群中下線時,重新分配shard,或者是創建或刪除了一個索引。包括每次cluster state如果有改變的化,那么master都會負責將集群狀態同步給所有的node。
master node負責接收所有的cluster state相關的變化信息,然后將這個改變后的最新的cluster state推動給集群中所有的data node,集群中所有的node都有一份完整的cluster state。只不過master node負責維護而已。其他的node,除了master之外的node,就是負責數據的存儲和讀寫的,寫入索引,搜索數據,data node。
cluster.name
如果要讓多個node組成一個es集群,首先第一個要設置的參數,就是cluster.name,多個node的cluster.name如果一樣,才滿足組成一個集群的基本條件。
這個cluster.name的默認值是elasticsearch,在生產環境中,一定要修改這個值,否則可能會導致未知的node無端加入集群,造成集群運行異常。
而es中默認的discovery機制,就是zen discovery機制
zen discovery機制提供了unicast discovery集群發現機制,集群發現時的節點間通信是依賴的transport module,也就是es底層的網絡通信模塊和協議。
es默認配置為使用unicast集群發現機制,以讓經過特殊配置的節點可以組成一個集群,而不是隨便哪個節點都可以組成一個集群。
但是默認配置下,unicast是本機,也就是localhost,因此只能在一臺機器上啟動多個node來組成一個集群。
雖然es還是會提供multicast plugin作為一個發現機制,但是已經不建議在生產環境中使用了。雖然我們可能想要multicast的簡單性,就是所有的node可以再接收到一條multicast ping之后就立即自動加入集群。但是multicast機制有很多的問題,而且很脆弱,比如網絡有輕微的調整,就可能導致節點無法發現對方。
因此現在建議在生產環境中用unicast機制,提供一個es種子node作為中轉路由節點就可以了。
(0)master node、data node、network.host
給集群規劃出專門的master eligible node和data node
master node,master eligible node(master 候選節點),data node
你配置的時候,是配置多個node變成master eligible node,但是只是說,從這些master eligible node選舉一個node出來作為master node,其他master eligible node只是接下來有那個master node故障的時候,接替他的資格,但是還是作為data node去使用的。
一般建議master eligible node給3個即可:node.master: true,node.data: false
剩下的node都設置為data node:node.master: false,node.data: true
但是如果一個小集群,就10個以內的節點,那就所有節點都可以作為master eligible node以及data node即可,超過10個node的集群再單獨拆分master和data node吧
如果你的節點數量小于10個,小集群,那所有的node,就不要做額外的配置了,master eligible node,同時也是data node
默認情況下,es會將自己綁定到127.0.0.1上,對于運行一個單節點的開發模式下的es是ok的。但是為了讓節點間可以互相通信以組成一個集群,需要讓節點綁定到一個ip地址上,非回環的地址,一般會配置:network.host: 192.168.1.10。一旦我們配置了network.host,那么es就會認為我們從開發模式遷移到生產模式,同時會啟用一系列的bootstrap check。
(1)ping
ping是一個node用discovery機制來發現其他node的一個過程
(2)unicast
unicast discovery集群發現機制是要求配置一個主機列表,用來作為gossip(流言式)通信協議的路由器。這些機器如果通過hostname來指定,那么在ping的時候會被解析為ip地址。
unicast discovery機制最重要的兩個配置如下所示:
- hosts:用逗號分割的主機列表
- hosts.resolve_timeout:hostname被DNS解析為ip地址的timeout等待時長
簡單來說,如果要讓多個節點發現對方并且組成一個集群,那么就得有一個中間的公共節點,然后不同的節點就發送請求到這些公共節點,接著通過這些公共節點交換各自的信息,進而讓所有的node感知到其他的node存在,并且進行通信,最后組成一個集群。這就是基于gossip流言式通信協議的unicast集群發現機制。
當一個node與unicast node list中的一個成員通信之后,就會接收到一份完整的集群狀態,這里會列出集群中所有的node。
接著那個node再通過cluster state跟master通信,并且加入集群中。這就意味著,我們的unicast list node是不需要列出集群中的所有節點的。只要提供少數幾個node,比如3個,讓新的node可以連接上即可。
如果我們給集群中分配了幾個節點作為專門的master節點,那么只要列出我們那三個專門的master節點即可。用如下的配置即可:discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]。
幾個比較重要的配置項:
cluster.name node.name network.host discovery.zen.ping.unicast.hosts主要步驟:
(1)已經初步配置好了,各個節點,首先通過network.host綁定到了非回環的ip地址,從而可以跟其他節點通信
(2)通過discovery.zen.ping.unicast.hosts配置了一批unicast中間路由的node
(3)所有node都可以發送ping消息到路由node,再從路由node獲取cluster state回來
(4)接著所有node會選舉出一個master
(5)所有node都會跟master進行通信,然后加入master的集群
(6)要求cluster.name必須一樣,才能組成一個集群
(7)node.name就標識出了每個node我們自己設置的一個名稱
(3)master選舉
在ping發現過程中,為集群選舉出一個master也是很重要的,es集群會自動完成這個操作。這里建議設置discovery.zen.ping_timeout參數(默認是3s),如果因為網絡慢或者擁塞,導致master選舉超時,那么可以增加這個參數,確保集群啟動的穩定性。
在完成一個集群的master選舉之后,每次一個新的node加入集群,都會發送一個join request到master node,可以設置discovery.zen.join_timeout保證node穩定加入集群,增加join的timeout等待時長,如果一次join不上,默認會重試20次。
如果master node被停止了,或者自己宕機了,那么集群中的node會再次進行一次ping過程,并且選舉出一個新的master。如果discovery.zen.master_election.ignore_non_master_pings設置為了true,那么會強制區分master候選節點,如果node的node.master設置為了false,還來發送ping請求參與master選舉,那么這些node會被忽略掉,因為他們沒有資格參與。
discovery.zen.minimum_master_nodes參數用于設置對于一個新選舉的master,要求必須有多少個master候選node去連接那個新選舉的master。而且還用于設置一個集群中必須擁有的master候選node。如果這些要求沒有被滿足,那么master node就會被停止,然后會重新選舉一個新的master。這個參數必須設置為我們的master候選node的quorum數量。一般避免說只有兩個master候選node,因為2的quorum還是2。如果在那個情況下,任何一個master候選節點宕機了,集群就無法正常運作了。
(4)集群故障的探查
es有兩種集群故障探查機制,
- 第一種是通過master進行的,master會ping集群中所有的其他node,確保它們是否是存活著的。
- 第二種,每個node都會去ping master node來確保master node是存活的,否則就會發起一個選舉過程。
有下面三個參數用來配置集群故障的探查過程:
- ping_interval:每隔多長時間會ping一次node,默認是1s
- ping_timeout:每次ping的timeout等待時長是多長時間,默認是30s
- ping_retries:如果一個node被ping多少次都失敗了,就會認為node故障,默認是3次
(5)集群狀態更新
master node是集群中唯一一個可以對cluster state進行更新的node。
master node每次會處理一個集群狀態的更新事件,應用這次狀態更新,然后將更新后的狀態發布到集群中所有的node上去。
每個node都會接收publish message,ack這個message,但是不會應用這個更新。
如果master沒有在discovery.zen.commit_timeout指定的時間內(默認是30s),從至少discovery.zen.minimum_master_nodes個節點獲取ack響應,那么這次cluster state change事件就會被reject,不會應用。
但是一旦在指定時間內,指定數量的node都返回了ack消息,那么cluster state就會被commit,然后一個message會被發送給所有的node。
所有的node接收到那個commit message之后,接著才會將之前接收到的集群狀態應用到自己本地的狀態副本中去。
接著master會等待所有節點再次響應是否更新自己本地副本狀態成功,在一個等待超時時長內,如果接收到了響應,那么就會繼續處理內存queue中保存的下一個更新狀態。discovery.zen.publish_timeout默認是30s,這個超時等待時長是從plublish cluster state開始計算的。
(6)不因為master宕機阻塞集群操作
如果要讓集群正常運轉,那么必須有一個master,還有discovery.zen.minimum_master_nodes指定數量的master候選node,都在運行。discovery.zen.no_master_block可以控制當master當即時,什么樣的操作應該被拒絕。有下面兩個選項:
- all:一旦master宕機,那么所有的操作都會被拒絕
- write:這是默認的選項,所有的寫操作都會被拒絕,但是讀操作是被允許的
總結
以上是生活随笔為你收集整理的白话Elasticsearch64-zen discovery集群发现机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Algorithms_算法思想_递归分治
- 下一篇: 白话Elasticsearch65-最少