elasticsearch Discovery 發現模塊學習

来源:https://www.cnblogs.com/hyq0823/archive/2019/09/22/11569606.html
-Advertisement-
Play Games

發現模塊和集群的形成 目標 發現節點 Master選舉 組成集群,在Master信息發生變化時及時更新。 故障檢測 細分為幾個子模塊 Discovery發現模塊 Discover是在集群Master節點未知時,互相發現對方的過程,例如新節點的加入或是先前的主節點宕機,如果一個節點不滿足Master資 ...


發現模塊和集群的形成
目標
  • 發現節點
  • 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候選節點時,指定錯誤,則有可能形成兩套不相同的集群。這有可能帶來數據丟失的。

file

通過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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring Boot 項目中使用 JSP: 項目結構:需要添加webapp文件夾用來存放目錄 jsp 文件 在配置文件application.properties中指定 jsp 的位置和尾碼。spring.mvc.view.prefix=/WEB-INF/jsp/spring.mvc.view.s ...
  • 上篇文章 "SpringBoot自動裝配原理解析" 中,我們分析了SpringBoot的自動裝配原理以及 註解的原理,本篇文章則繼續基於上篇文章中的main方法來分析 這個類 點擊 方法一路跟蹤下來,發現首先做的是實例化 對象實例 1. 首先看一下 方法 大抵意思就是根據當前項目中是否存在上方的幾個 ...
  • 最近將萬方數據的爬取代碼進行了重構,速度大概有10w每小時吧,因為屬於公司項目,代碼暫時就不開源了,所以在這裡先說說思路和一些註意事項吧,順帶吐槽一下萬方。 先上圖: 其實邏輯也蠻簡單的,醫學類的期刊分了16個大類,那麼首先手動將這16大類所對應的唯一id拿下來拼接出該類型的url,然後翻頁請求它就 ...
  • 函數概述 qsort 為quick sort的簡寫,意為快速排序,主要用於對各種數組的排序,在頭文件stdlib.h中。 因為數組的元素可能是任何類型的,甚至是結構或者聯合,所以必須高數函數qsort如何確定兩個數組元素哪一個“更小”,這就需要我們給出比較的規則,即什麼算大,什麼算小。 通過編寫比較 ...
  • 在 Spring Cloud 微服務系統中,一種常見的負載均衡方式是,客戶端的請求首先經過負載均衡(Ngnix),再到達服務網關(Zuul 集群),然後再到具體的服務。服務統一註冊到高可用的服務註冊中心集群,服務的所有的配置文件由配置服務管理,配置服務的配置文件放在 GIT 倉庫,方便開發人員隨時改 ...
  • 前言 越來越多的項目已經使用 "Java 8" 了,毫無疑問, "Java 8" 是Java自Java 5(發佈於2004年)之後的最重要的版本。這個版本包含語言、編譯器、庫、工具和 JVM 等方面的十多個新特性。在本文中我們將學習這些新特性,並用實際的例子說明在什麼場景下適合使用。 引用: 本文參 ...
  • R語言構建蛋白質網路並實現GN演算法 1.蛋白質網路的構建 我們使用與人類HIV相關的蛋白質互作數據hunam HIV PPI.csv來構建這個蛋白質互作網路。 在R中,我們可以從存儲在R環境外部的文件讀取數據。還可以將數據寫入由操作系統存儲和訪問的文件。 R可以讀取和寫入各種文件格式,如:csv,e ...
  • 面試題 如何保證消息的順序性? 面試官心理分析 其實這個也是用 MQ 的時候必問的話題,第一看看你了不瞭解順序這個事兒?第二看看你有沒有辦法保證消息是有順序的?這是生產系統中常見的問題。 面試題剖析 我舉個例子,我們以前做過一個 mysql 同步的系統,壓力還是非常大的,日同步數據要達到上億,就是說 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...