1. 程式人生 > >elasticsearch Discovery 發現模組學習

elasticsearch Discovery 發現模組學習

發現模組和叢集的形成
目標
  • 發現節點
  • Master選舉
  • 組成叢集,在Master資訊發生變化時及時更新。
  • 故障檢測
細分為幾個子模組
Discovery發現模組

Discover是在叢集Master節點未知時,互相發現對方的過程,例如新節點的加入或是先前的主節點宕機,如果一個節點不滿足Master資格,則它將繼續發現,直到發現了選定的主節點為止,其中,重試配置的屬性為:discovery.find_peers_interval,預設值1s。

官網上master-eligible的含義:設定了node-master:true的節點,表示有資格成為Master的節點。

一、基於單播的方式發現

可以在 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

二、基於配置檔案的方式發現

elasticsearch可以在檔案中配置種子主機列表,來進行節點發現,這種方式在容器化環境可以很好的支援動態擴充套件,可以隨時更改檔案內容,不用重啟節點。
檔案配置方式為主機ip,主機ip:埠,也可以使用主機名配置,這會觸發DNS查詢,每次在DNS查詢中的等待時間屬性:discovery.zen.ping.unicast.resolve_timeout,預設為5S,如不指定埠,預設按順序搜尋transport.profiles.default.port、transport.port。
注意: 如果還配置了discovery.seed_hosts,則會把兩個配置合併起來。

選舉

一、選舉Master
選舉Master需要所有的Master候選節點共同工作,即使某些節點發生了故障,這個工作也必須能夠正常進行,es需要通過仲裁的方式選取出還能正常工作的節點,再組成叢集,避免形成“腦裂”,這裡“腦裂”是指,可能出現不止一個Master節點,比如節點間的通訊斷開後,各個Master候選節點都有可能認為其他節點都宕機,提升自己為Master,造成叢集狀態不一致的情況。由此衍生出參與選主時,需要配置能通訊的候選節點數量。discovery.zen.minimum_master_nodes,預設配置是1.一個基本的原則是這裡需要設定成 N/2+1, N是叢集中節點的數量。

由上面的分析我們可以知道,是否發生選舉,在於節點彼此間的通訊感知,由此可知節點間的網路通訊同樣重要,就像是API介面呼叫,有呼叫就會有超時,所以在網路環境差的情況下,超時配置顯得尤為重要。discovery.zen.ping.timeout用來指定兩個節點間的通訊超時時間,預設是3S。根據網路情況,調整這個引數,儘量避免由於網路延遲,帶來的不必要的選舉。

二、改變叢集狀態

投票配置

在elasticsearch7的版本中,當有一半的候選主節點宕機後,叢集將不會自動恢復,在剩下的,這種極端情況下,最容易的解決辦法就是讓這些節點重新上線,
在三個節點的叢集中,通常能容忍一個節點的宕機。節點加入或離開集群后,Elasticsearch會通過自動對投票配置進行相應的更改來做出反應,以確保叢集儘可能具有彈性。相關配置如下:

# 將節點加入投票配置排除列表中
# 預設超時時間30s,可以指定超時時間
POST /_cluster/voting_config_exclusions/node_name?timeout=1m
叢集啟動項

一、叢集自舉
首次啟動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 ,但是建議更改此值以反映叢集的邏輯名稱。

新增OR刪除節點

由於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開頭,更改預設設定可能會導致群集變得不穩定,不建議修改。

發現和形成叢集的配置

這裡列舉幾個必要重要的配置,發現模組的其他配置,已經整理成思維導圖,【俠夢的開發筆記】公眾號回覆,【發現】獲取完整圖片。

  • discovery.seed_hosts
    提供叢集中符合主機要求的節點的列表. 每個值的格式為host:port或host ,其中port預設為設定transport.profiles.default.port。

  • discovery.seed_providers
    以檔案的方式提供主機列表,可以動態修改,而不用重啟節點(容器化環境適用)

  • cluster.initial_master_nodes
    設定全新群集中符合主機要求的節點的初始集合. 預設情況下,該列表為空,這意味著該節點希望加入已經被引導的叢集

  • discovery.find_peers_interval
    選定主節點發現時間間隔,預設1S