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