Discover是在集羣Master節點未知時,互相發現對方的過程,例如新節點的加入或是先前的主節點宕機,若是一個節點不知足Master資格,則它將繼續發現,直到發現了選定的主節點爲止,其中,重試配置的屬性爲:discovery.find_peers_interval,默認值1s。node
官網上master-eligible的含義:設置了node-master:true的節點,表示有資格成爲Master的節點。json
1、基於單播的方式發現api
能夠在 elasticsearch.yml 配置文件中使用discovery.zen.ping.unicast.hosts靜態設置設置主機列表。
discovery.zen.ping.unicast.hosts: ["host1", "host2"]
具體的值是一個主機數組或逗號分隔的字符串。每一個值應採用host:port或host的形式(其中port默認爲設置transport.profiles.default.port數組
過期配置 | 配置(新) |
---|---|
discovery.zen.ping.unicast.hosts | discovery.seed_hosts |
discovery.zen.hosts_provider | discovery.seed_providers |
discovery.zen.no_master_block | cluster.no_master_block |
2、基於配置文件的方式發現服務器
elasticsearch能夠在文件中配置種子主機列表,來進行節點發現,這種方式在容器化環境能夠很好的支持動態擴展,能夠隨時更改文件內容,不用重啓節點。
文件配置方式爲主機ip,主機ip:端口,也可使用主機名配置,這會觸發DNS查找,每次在DNS查找中的等待時間屬性:discovery.zen.ping.unicast.resolve_timeout,默認爲5S,如不指定端口,默認按順序搜索transport.profiles.default.port、transport.port。
注意: 若是還配置了discovery.seed_hosts,則會把兩個配置合併起來。網絡
1、選舉Master
選舉Master須要全部的Master候選節點共同工做,即便某些節點發生了故障,這個工做也必須可以正常進行,es須要經過仲裁的方式選取出還能正常工做的節點,再組成集羣,避免造成「腦裂」,這裏「腦裂」是指,可能出現不止一個Master節點,好比節點間的通訊斷開後,各個Master候選節點都有可能認爲其餘節點都宕機,提高本身爲Master,形成集羣狀態不一致的狀況。由此衍生出參與選主時,須要配置能通訊的候選節點數量。discovery.zen.minimum_master_nodes,缺省配置是1.一個基本的原則是這裏須要設置成 N/2+1, N是集羣中節點的數量。app
由上面的分析咱們能夠知道,是否發生選舉,在於節點彼此間的通訊感知,由此可知節點間的網絡通訊一樣重要,就像是API接口調用,有調用就會有超時,因此在網絡環境差的狀況下,超時配置顯得尤其重要。discovery.zen.ping.timeout用來指定兩個節點間的通訊超時時間,默認是3S。根據網絡狀況,調整這個參數,儘可能避免因爲網絡延遲,帶來的沒必要要的選舉。curl
2、改變集羣狀態elasticsearch
在elasticsearch7的版本中,當有一半的候選主節點宕機後,集羣將不會自動恢復,在剩下的,這種極端狀況下,最容易的解決辦法就是讓這些節點從新上線,
在三個節點的集羣中,一般能容忍一個節點的宕機。節點加入或離開集羣后,Elasticsearch會經過自動對投票配置進行相應的更改來作出反應,以確保集羣儘量具備彈性。相關配置以下:ide
# 將節點加入投票配置排除列表中 # 默認超時時間30s,能夠指定超時時間 POST /_cluster/voting_config_exclusions/node_name?timeout=1m
1、集羣自舉
首次啓動Elasticsearch集羣須要在集羣中的一個或多個Master候選節點上顯式定義初始一組主資格節點 . 這個行爲稱爲集羣自舉。
符合主機要求的初始節點集是在cluster.initial_master_nodes設置中,要求以下:
節點的節點名稱。 該節點的主機名,若是node.name沒有設置,由於node.name默認爲節點的主機名. 根據系統配置,必須使用標準主機名或裸機主機名. 節點的發佈地址的IP地址(若是沒法使用該節點的node.name 。這是network.host解析到的IP地址,可是能夠覆蓋此IP地址。 節點發布地址的IP地址和端口,格式爲IP:PORT ,若是不可能使用節點的node.name ,而且有多個節點共享一個IP地址
注意:啓動Master候選節點時,能夠在命令行上或elasticsearch.yml文件中提供此設置. 羣集造成後,再也不須要此設置,而且會忽略它,也就是說,這個屬性就只是在集羣首次啓動時有用。而且能夠不須要在非Master候選節點上設置。
特別要當心的是,對於Master候選節點的配置最好採用持久化的方式來替代使用CMD命令行的方式啓動,由於若是一旦重啓Master候選節點時,指定錯誤,則有可能造成兩套不相同的集羣。這有可能帶來數據丟失的。
經過cluster.name設置,能夠建立彼此分離的多個羣集. 節點在首次相互鏈接時會驗證它們是否贊成其集羣名稱,而且Elasticsearch將僅由具備相同集羣名稱的節點組成集羣. 集羣名稱的默認值是elasticsearch ,可是建議更改此值以反映集羣的邏輯名稱。
因爲elasticsearch集羣節點時能夠動態上線下線的,那在這個過程當中,咱們可以理解或須要夠操做什麼呢。在主服務器選舉期間或加入現有的已造成集羣時,節點會向主服務器發送加入請求,以便將其正式添加到集羣中. 可使用cluster.join.timeout設置來配置節點在發送加入集羣的請求後等待多長時間. 其默認值爲30s。
刪除符合主機資格的節點時,重要的是不要同時刪除太多節點。 例如,若是當前有七個Master候選的節點,但願將其減小到三個,則不可能簡單地一次中止四個節點:這樣作將只剩下三個節點,這少於一半投票配置,這意味着羣集沒法採起任何進一步的措施.只要集羣中至少有三個符合主控條件的節點,一般,最好一次刪除一個節點,從而爲集羣留出足夠的時間來自動調整表決配置並適應故障新節點集的容差級別。
這裏,咱們須要注意,節點上線下線,咱們都須要關注防止「腦裂」的配置,經過調用Elasticsearch APi的方式,將配置持久化下來,而不用重啓節點。
curl -uelastic:passwd -XGET "EsIP:9200/_cluster/settings" -H "Content-Type:application/json" -d ' { "persistent" : { "discovery.zen.minimum_master_nodes" : 2 } } '
只有Master節點能夠更改集羣狀態。更改後會將更新的狀態發佈到集羣中全部的節點上,每一個節點都會接受這個消息,並進行Ack確認。可是不會應用這個更新。主節點須要在
discovery.zen.commit_timeout配置的時間內獲取discovery.zen.minimum_master_nodes個Ack響應,纔算是狀態成功的發佈,不然此次發佈就是失敗的,不會被應用。
對於那些未收到確認的節點被稱爲滯後,由於它們的羣集狀態已落後於主服務器的最新狀態. 主機等待滯後的節點再追趕一段時間,經過cluster.follower_lag.timeout ,默認爲90s . 若是節點在此時間內仍未成功應用集羣狀態更新,則認爲該節點已失敗並從集羣中刪除。
Master確認Ack數量知足後,纔會繼續發送確認消息給全部節點,此時節點纔會真正的應用這個集羣的狀態信息,這第二個過程是經過discovery.zen.publish_timeout配置的,默認是30s,這個超時等待時長是從第二次發佈時開始計算的。
由上述能夠,在發佈集羣狀態時,獲取Master候選節點的Ack是很重要的,節點數量由discovery.zen.minimum_master_nodes配置。而沒有主節點時,也有相關配置須要瞭解,它就是:discovery.zen.no_master_block。
discovery.zen.no_master_block設置了沒有主節點時,集羣的限制操做。
all。表明全部操做均不可用,包括讀寫等全部api的調用。
write。這是默認值,只有寫操做會被拒絕,同時須要注意,這個屬性對Node level相關的api是無效的。
當選的主節點會按期檢查羣集中的每一個節點,以確保它們仍處於鏈接狀態而且運行情況良好. 羣集中的每一個節點還按期檢查當選的主機的運行情況. 這些檢查分別稱爲 follower checks 和 leader checks。
相關配置cluster.fault開頭,更改默認設置可能會致使羣集變得不穩定,不建議修改。
這裏列舉幾個必要重要的配置,發現模塊的其餘配置,已經整理成思惟導圖,【俠夢的開發筆記】公衆號回覆,【發現】獲取完整圖片。
提供集羣中符合主機要求的節點的列表. 每一個值的格式爲host:port或host ,其中port默認爲設置transport.profiles.default.port。
以文件的方式提供主機列表,能夠動態修改,而不用重啓節點(容器化環境適用)
設置全新羣集中符合主機要求的節點的初始集合. 默認狀況下,該列表爲空,這意味着該節點但願加入已經被引導的集羣
選定主節點發現時間間隔,默認1S
歡迎關注vx公衆號【俠夢的開發筆記】