Elasticsearch 技術(shù)分析(六): 自動(dòng)發(fā)現(xiàn)機(jī)制 - Zen Discoveryedit
1|0發(fā)現(xiàn)方式
Zen discovery是內(nèi)建的、默認(rèn)的、用于Elasticsearch的發(fā)現(xiàn)模塊。它提供了單播和基于文件的發(fā)現(xiàn),可以通過插件擴(kuò)展到支持云環(huán)境和其他形式的發(fā)現(xiàn)。
Zen Discovery 是與其他模塊集成的,例如,節(jié)點(diǎn)之間的所有通信都使用?transport?模塊完成。某個(gè)節(jié)點(diǎn)通過?發(fā)現(xiàn)機(jī)制?找到其他節(jié)點(diǎn)是使用?Ping?的方式實(shí)現(xiàn)的。
Zen Discovery 使用種子節(jié)點(diǎn)(seed nodes)列表來開始發(fā)現(xiàn)過程。在啟動(dòng)時(shí),或者在選舉新主節(jié)點(diǎn)的時(shí)候,Elasticsearch 會(huì)嘗試連接到其列表中的每個(gè)種子節(jié)點(diǎn),并與他們進(jìn)行類似'閑聊'的對(duì)話,以查找其他節(jié)點(diǎn)并構(gòu)建集群的完整成員圖。
默認(rèn)情況下,有兩種方法可用于配置種子節(jié)點(diǎn)列表:單播和基于文件。建議種子節(jié)點(diǎn)列表主要由集群中那些 Master-eligible 的節(jié)點(diǎn)組成。
Master-eligible:node.master設(shè)置為?true(默認(rèn))的節(jié)點(diǎn),使其有資格被選為控制集群的主節(jié)點(diǎn)。
1|1單播
單播發(fā)現(xiàn) 配置靜態(tài)主機(jī)列表以用作種子節(jié)點(diǎn)。 可以將這些主機(jī)指定為?主機(jī)名?或?IP地址。 指定為主機(jī)名的主機(jī)在每輪?ping?操作期間解析為 IP 地址。 請(qǐng)注意,如果您處于 DNS 解析隨時(shí)間變化的環(huán)境中,則可能需要調(diào)整?JVM安全設(shè)置。
可以在 elasticsearch.yml 配置文件中使用discovery.zen.ping.unicast.hosts靜態(tài)設(shè)置設(shè)置主機(jī)列表。
discovery.zen.ping.unicast.hosts:["host1", "host2"]
具體的值是一個(gè)主機(jī)數(shù)組或逗號(hào)分隔的字符串。每個(gè)值應(yīng)采用host:port或host的形式(其中port默認(rèn)為設(shè)置transport.profiles.default.port,如果未設(shè)置則返回transport.tcp.port)。 請(qǐng)注意,必須將IPv6主機(jī)置于括號(hào)內(nèi)。 此設(shè)置的默認(rèn)值為127.0.0.1,[:: 1]。
另外,discovery.zen.ping.unicast.resolve_timeout?配置在每輪ping操作中等待DNS查找的時(shí)間。需要指定時(shí)間單位,默認(rèn)為5秒。
單播發(fā)現(xiàn)(unicast discovery)應(yīng)用?transport?模塊實(shí)現(xiàn)發(fā)現(xiàn)(discovery)。
1|2基于文件
除了靜態(tài)discovery.zen.ping.unicast.hosts?設(shè)置提供的主機(jī)之外,還可以通過外部文件提供主機(jī)列表。Elasticsearch在更改時(shí)會(huì)重新加載此文件,以便種子節(jié)點(diǎn)列表可以動(dòng)態(tài)更改,而無需重新啟動(dòng)每個(gè)節(jié)點(diǎn)。例如,這為在Docker容器中運(yùn)行的Elasticsearch實(shí)例提供了一種方便的機(jī)制,可以動(dòng)態(tài)提供一個(gè)IP地址列表,以便在節(jié)點(diǎn)啟動(dòng)時(shí)無法知道這些IP地址時(shí)連接到Zen discovery。
要啟用基于文件的發(fā)現(xiàn),請(qǐng)file按如下方式配置hosts提供程序:
discovery.zen.hosts_provider:file
然后以$ES_PATH_CONF/unicast_hosts.txt下面描述的格式創(chuàng)建文件。每當(dāng)對(duì)unicast_hosts.txt文件進(jìn)行更改時(shí),Elasticsearch都會(huì)選擇新的更改,并使用新的主機(jī)列表。
請(qǐng)注意,基于文件的發(fā)現(xiàn)插件會(huì)增強(qiáng)單播主機(jī)列表?elasticsearch.yml:如果存在有效的單播主機(jī)條目,?discovery.zen.ping.unicast.hosts則除了提供的那些之外,還將使用它們 unicast_hosts.txt。
該discovery.zen.ping.unicast.resolve_timeout設(shè)置還適用于通過基于文件的發(fā)現(xiàn)由地址指定的節(jié)點(diǎn)的DNS查找。同樣需要指定時(shí)間單位,默認(rèn)為5秒。
該文件的格式是每行指定一個(gè)節(jié)點(diǎn)條目。每個(gè)節(jié)點(diǎn)條目由主機(jī)(主機(jī)名或IP地址)和可選的傳輸端口號(hào)組成。如果指定了端口號(hào),必須在主機(jī)(在同一行)之后使用“:”分割。如果未指定端口號(hào),則使用默認(rèn)值9300。
例如,這是 unicast_hosts.txt 具有四個(gè)參與單播發(fā)現(xiàn)的節(jié)點(diǎn)的集群的示例,其中一些節(jié)點(diǎn)未在默認(rèn)端口上運(yùn)行:
10.10.10.510.10.10.6:930510.10.10.5:10005#anIPv6address[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:9301
允許使用主機(jī)名而不是IP地址(類似于?discovery.zen.ping.unicast.hosts)。必須在括號(hào)中指定IPv6地址,并在括號(hào)后面添加端口。
也可以為此文件添加注釋,所有注釋必須在每行的開頭顯示_#_(即注釋不能在一行中間開始)。
2|0選舉主節(jié)點(diǎn)
作為 ping 過程的一部分,一個(gè)集群的主節(jié)點(diǎn)需要是被選舉或者加入進(jìn)來的(即選舉主節(jié)點(diǎn)也會(huì)執(zhí)行ping,其他的操作也會(huì)執(zhí)行ping)。這個(gè)過程是自動(dòng)執(zhí)行的。通過配置discovery.zen.ping_timeout來控制節(jié)點(diǎn)加入某個(gè)集群或者開始選舉的響應(yīng)時(shí)間(默認(rèn)3s)。
在這段時(shí)間內(nèi)有3個(gè) ping 會(huì)發(fā)出。如果超時(shí),重新啟動(dòng) ping 程序。在網(wǎng)絡(luò)緩慢時(shí),3秒時(shí)間可能不夠,這種情況下,需要慎重增加超時(shí)時(shí)間,增加超時(shí)時(shí)間會(huì)減慢選舉進(jìn)程。
一旦節(jié)點(diǎn)決定加入一個(gè)存在的集群,它會(huì)發(fā)出一個(gè)加入請(qǐng)求給主節(jié)點(diǎn),這個(gè)請(qǐng)求的超時(shí)時(shí)間由discovery.zen.join_time控制,默認(rèn)是 ping 超時(shí)時(shí)間(discovery.zen.ping_timeout)的20倍。
當(dāng)主節(jié)點(diǎn)停止或者出現(xiàn)問題,集群中的節(jié)點(diǎn)會(huì)重新 ping 并選舉一個(gè)新節(jié)點(diǎn)。有時(shí)一個(gè)節(jié)點(diǎn)也許會(huì)錯(cuò)誤的認(rèn)為主節(jié)點(diǎn)已死,所以這種 ping 操作也可以作為部分網(wǎng)絡(luò)故障的保護(hù)性措施。在這種情況下,節(jié)點(diǎn)將只從其他節(jié)點(diǎn)監(jiān)聽有關(guān)當(dāng)前活動(dòng)主節(jié)點(diǎn)的信息。
如果discovery.zen.master_election.ignore_non_master_pings設(shè)置為true時(shí)(默認(rèn)值為false),node.master為false的節(jié)點(diǎn)不參加主節(jié)點(diǎn)的選舉,同時(shí)選票也不包含這種節(jié)點(diǎn)。
通過設(shè)置node.master為false,可以將節(jié)點(diǎn)設(shè)置為非備選主節(jié)點(diǎn),永遠(yuǎn)沒有機(jī)會(huì)成為主節(jié)點(diǎn)。
discovery.zen.minimum_master_nodes設(shè)置了最少有多少個(gè)備選主節(jié)點(diǎn)參加選舉,同時(shí)也設(shè)置了一個(gè)主節(jié)點(diǎn)需要控制最少多少個(gè)備選主節(jié)點(diǎn)才能繼續(xù)保持主節(jié)點(diǎn)身份。如果控制的備選主節(jié)點(diǎn)少于discovery.zen.minimum_master_nodes個(gè),那么當(dāng)前主節(jié)點(diǎn)下臺(tái),重新開始選舉。
discovery.zen.minimum_master_nodes必須設(shè)置一個(gè)恰當(dāng)?shù)膫溥x主節(jié)點(diǎn)值(quonum,一般設(shè)置 為備選主節(jié)點(diǎn)數(shù)/2+1),盡量避免只有兩個(gè)備選主節(jié)點(diǎn),因?yàn)閮蓚€(gè)備選主節(jié)點(diǎn)quonum應(yīng)該為2,那么如果一個(gè)節(jié)點(diǎn)出現(xiàn)問題,另一個(gè)節(jié)點(diǎn)的同意人數(shù)最多只能為1,永遠(yuǎn)也不能選舉出新的主節(jié)點(diǎn),這時(shí)就發(fā)生了腦裂現(xiàn)象。
3|0集群故障檢測(cè)
有兩個(gè)故障檢測(cè)進(jìn)程在集群的生命周期中一直運(yùn)行。一個(gè)是主節(jié)點(diǎn)的,ping集群中所有的其他節(jié)點(diǎn),檢查他們是否活著。另一種是每個(gè)節(jié)點(diǎn)都ping主節(jié)點(diǎn),確認(rèn)主節(jié)點(diǎn)是否仍在運(yùn)行或者是否需要重新啟動(dòng)選舉程序。
使用discovery.zen.fd前綴設(shè)置來控制故障檢測(cè)過程,配置如下:
配置描述
discovery.zen.fd.ping_interval節(jié)點(diǎn)多久ping一次,默認(rèn)1s
discovery.zen.fd.ping_timeout等待響應(yīng)時(shí)間,默認(rèn)30s
discovery.zen.fd.ping_retries失敗或超時(shí)后重試的次數(shù),默認(rèn)3
4|0集群狀態(tài)更新
主節(jié)點(diǎn)是唯一一個(gè)能夠更新集群狀態(tài)的節(jié)點(diǎn)。主節(jié)點(diǎn)一次處理一個(gè)群集狀態(tài)更新,應(yīng)用所需的更改并將更新的群集狀態(tài)發(fā)布到群集中的所有其他節(jié)點(diǎn)。當(dāng)其他節(jié)點(diǎn)接收到狀態(tài)時(shí),先確認(rèn)收到消息,但是不應(yīng)用最新狀態(tài)。如果主節(jié)點(diǎn)在規(guī)定時(shí)間(discovery.zen.commit_timeout?,默認(rèn)30s)內(nèi)沒有收到大多數(shù)節(jié)點(diǎn)(discovery.zen.minimum_master_nodes)的確認(rèn),集群狀態(tài)更新不被通過。
一旦足夠的節(jié)點(diǎn)響應(yīng)了更新的消息,新的集群狀態(tài)(cluster state)被提交并且會(huì)發(fā)送一條消息給所有的節(jié)點(diǎn)。這些節(jié)點(diǎn)開始在內(nèi)部應(yīng)用新的集群狀態(tài)。在繼續(xù)處理隊(duì)列中的下一個(gè)更新之前,主節(jié)點(diǎn)等待所有節(jié)點(diǎn)響應(yīng),直到超時(shí)(discovery.zen.publish_timeout,默認(rèn)設(shè)置為30秒)。上述兩個(gè)超時(shí)設(shè)置都可以通過集群更新設(shè)置api動(dòng)態(tài)更改。
5|0No master block
對(duì)于一個(gè)可以正常充分運(yùn)作的集群來說,必須擁有一個(gè)活著的主節(jié)點(diǎn)和正常數(shù)量(discovery.zen.minimum_master_nodes個(gè))活躍的備選主節(jié)點(diǎn)。discovery.zen.no_master_block設(shè)置了沒有主節(jié)點(diǎn)時(shí)限制的操作。它又兩個(gè)可選參數(shù)
all:所有操作均不可做,讀寫、包括集群狀態(tài)的讀寫api,例如獲得索引配置(index settings),putMapping,和集群狀態(tài)(cluster state)api
write:默認(rèn)為write,寫操作被拒絕執(zhí)行,基于最后一次已知的正常的集群狀態(tài)可讀,這也許會(huì)讀取到已過時(shí)的數(shù)據(jù)。
discovery.zen.no_master_block,對(duì)于節(jié)點(diǎn)相關(guān)的基本api,這個(gè)參數(shù)是無效的,如集群統(tǒng)計(jì)信息(cluster stats),節(jié)點(diǎn)信息(node info),節(jié)點(diǎn)統(tǒng)計(jì)信息(node stats)。對(duì)這些api的請(qǐng)求不會(huì)被阻止,并且可以在任何可用節(jié)點(diǎn)上運(yùn)行。