ZooKeeper集群服務器啟動

在本文中,我們將對集群版ZooKeeper服務器的啟動過程做詳細講解。集群和單機ZooKeeper服務器的啟動過程在很多地方都是一致的,因此本節只會對有差異的地方展開進行講解。下圖所示是集群版ZooKeeper服務器的啟動流程圖。

?

預啟動

預啟動的步驟如下。

(1)統一由QuorumPeerMain作為啟動類。

(2)解析配置文件zoo.cfg。

(3)創建并啟動歷史文件清理器DatadirCleanupManager。

(4)判斷當前是集群模式還是單機模式的啟動。

在集群模式中,由于已經在zoo.cfg中配置了多個服務器地址,因此此處選擇集群模式啟動ZooKeeper。

初始化

初始化的步驟如下。

(1)創建ServerCnxnFactory。

(2)初始化ServerCnxnFactory。

(3)創建ZooKeeper數據管理器FileTxnSnapLog。

(4)創建QuorumPeer實例。

Quorum是集群模式下特有的對象,是ZooKeeper服務器實例(ZooKeeperServer)的托管者,從集群層面看,QuorumPeer代表了ZooKeeper集群中的一臺機器。在運行期間,QuorumPeer會不斷檢測當前服務器實例的運行狀態,同時根據情況發起Leader選舉。

(5)創建內存數據庫ZKDatabase。

ZKDatabase是ZooKeeper的內存數據庫,負責管理ZooKeeper的所有會話記錄以及DataTree和事務日志的存儲。

(6)初始化QuorumPeer。

在步驟5中我們已經提到,QuorumPeer是ZooKeeperServer的托管者,因此需要將一些核心組件注冊到QuorumPeer中去,包括FileTxnSnapLog、ServerCnxnFactory和ZKDatabase。同時ZooKeeper還會對QuorumPeer配置一些參數,包括服務器地址列表、Leader選舉算法和會話超時時間限制等。

(7)恢復本地數據。

(8)啟動ServerCnxnFactory主線程。

Leader選舉

Leader選舉的步驟如下。

(1)初始化Leader選舉。

Leader選舉可以說是集群和單機模式啟動ZooKeeper最大的不同點。ZooKeeper首先會根據自身的SID (服務器ID)、lastLoggedZxid (最新的ZXID)和當前的服務器epoch(currentEpoch)來生成一個初始化的投票一簡單地講,在初始化過程中,每個服務器都會給自己投票。

然后,ZooKeeper會根據zoo.cfg中的配置,創建相應的Leader選舉算法實現。在ZooKeeper中,默認提供了三種Leader選舉算法的實現,分別是LeaderElection、AuthFastLeaderElection和FastLeaderElection,可以通過在配置文件(zoo.cfg)中使用electionAlg屬性來指定,分別使用數字0~3來表示。從3.4.0版本開始,ZooKeeper廢棄了前兩種Leader選舉算法,只支持FastLeaderElection選舉算法了。

在初始化階段,ZooKeeper會首先創建Leader選舉所需的網絡I/O層QuorumCnxManager,

同時啟動對Leader選舉端口的監聽,等待集群中其他服務器創建連接。

(2)注冊JMX服務。

(3)檢測當前服務器狀態。

在上文中,我們已經提到QuorumPeer是ZooKeeper服務器實例的托管者,在運行期間,QuorumPeer的核心工作就是不斷地檢測當前服務器的狀態,并做出相應的處理。在正常情況下,ZooKeeper 服務器的狀態在LOOKING、LEADING和FOLLOWING/OBSERVING之間進行切換。而在啟動階段,QuorumPeer的初始狀態是LOOKING,因此開始進行Leader選舉。

(4)Leader選舉:

ZooKeeper的Leader選舉過程,簡單地講,就是一個集群中所有的機器相互之間進行一系列投票,選舉產生最合適的機器成為Leader,同時其余機器成為Follower或是Observer的集群機器角色初始化過程。關于Leader選舉算法,簡而言之,就是集群中哪個機器處理的數據越新(通常我們根據每個服務器處理過的最大ZXID來比較確定其數據是否更新),其越有可能成為Leader。當然,如果集群中的所有機器處理的ZXID一致的話,那么SID最大的服務器成為Leader。

Leader和Follower啟動期交互過程

到這里為止,ZooKeeper已經完成了Leader選舉,并且集群中每個服務器都已經確定了自己的角色一通常情況下就分為Leader 和Follower兩種角色。下面我們來對Leader和Follower在啟動期間的工作原理進行講解,其大致交互流程如下圖所示。

?

Leader和Follower服務器啟動期交互過程包括如下步驟。

(1)創建Leader服務器和Follower服務器。

完成Leader選舉之后,每個服務器都會根據自己的服務器角色創建相應的服務器實例,并開始進入各自角色的主流程。

(2)Leader服務器啟動Follower接收器LearnerCnxAcceptor。

在ZooKeeper集群運行期間,Leader 服務器需要和所有其余的服務器(本文余下部分,我們使用“Learner”來指代這類機器)保持連接以確定集群的機器存活情況。LearnerCnxAcceptor接收器用于負責接收所有非Leader服務器的連接請求。

(3)Learner服務器開始和Leader建立連接。

所有的Learner服務器在啟動完畢后,會從Leader選舉的投票結果中找到當前集群中的Leader服務器,然后與其建立連接。

(4)Leader服務器創建LearnerHandler。

Leader接收到來自其他機器的連接創建請求后,會創建一個LearnerHandler實例。每個LearnerHandler實例都對應了一個Leader與Learner服務器之間的連接,其負責Leader和Learner服務器之間幾乎所有的消息通信和數據同步。

(5)向Leader注冊。

當和Leader建立起連接后,Learner就會開始向Leader進行注冊一所謂的注冊,其實就是將Learner 服務器自己的基本信息發送給Leader 服務器,我們稱之為LearnerInfo,包括當前服務器的SID和服務器處理的最新的ZXID。

(6)Leader解析Learner信息,計算新的epoch。

Leader服務器在接收到Learner的基本信息后,會解析出該Learner的SID和ZXID,然后根據該Learner的ZXID解析出其對應的epoch_of_learner,和當前Leader服務器的epoch_of_leader進行比較,如果該Learner的epoch_of_learner更大的話,那么就更新Leader的epoch:

epoch_of_leader = epoch_of_learner + 1

然后,LearnerHandler會進行等待,直到過半的Learner已經向Leader 進行了注冊,同時更新了epoch_of_leader之后,Leader就可以確定當前集群的epoch了。

(7)發送Leader狀態。

計算出新的epoch之后,Leader會將該信息以一個LEADERINFO消息的形式發送給Learner,同時等待Learner的響應。

(8)Learner發送ACK消息。

Follower在收到來自Leader的LEADERINFO消息后,會解析出epoch和ZXID,然后向Leader反饋一個ACKEPOCH響應。

(9)數據同步。

Leader服務器接收到Learner的這個ACK消息后,就可以開始與其進行數據同步了。

(10)啟動Leader和Learner服務器。

當有過半的Learner已經完成了數據同步,那么Leader和Learner服務器實例就可以開始啟動了。

Leader和Follower啟動

Leader和Follower啟動的步驟如下。

(1)創建并啟動會話管理器。

(2)初始化ZooKeeper的請求處理鏈。

和單機版服務器一樣,集群模式下,每個服務器都會在啟動階段串聯請求處理鏈,只是根據服務器角色不同,會有不同的請求處理鏈路。

(3)注冊JMX服務。

至此,集群ZooKeeper服務器啟動完畢。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42981.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python高光譜遙感數據處理與高光譜遙感機器學習方法教程

詳情點擊鏈接:Python高光譜遙感數據處理與高光譜遙感機器學習方法教程 第一:高光譜基礎 一:高光譜遙感基本 01)高光譜遙感 02)光的波長 03)光譜分辨率 04)高光譜遙感的歷史和發展 二:高光譜傳感器與數據獲取 01)高光譜遙感…

AI搜索引擎助力科學家創新

開發者希望通過幫助科學家從大量文獻中發現聯系從而解放科學家,讓他們專注于發現和創新。 圖片來源:The Project Twins 對于專注于歷史的研究者Mushtaq Bilal來說,他在未來科技中投入了大量時間。 Bilal在丹麥南部大學( Universit…

預訓練GNN:GPT-GNN Generative Pre-Training of Graph Neural Networks

一.文章概述 本文提出了一種自監督屬性圖生成任務來預訓練GNN,使得其能捕圖的結構和語義屬性。作者將圖的生成分為兩個部分:屬性生成和邊生成,即給定觀測到的邊,生成節點屬性;給定觀測到的邊和生成的節點屬性&#xf…

自動駕駛港口車輛故障及事故處理機制

1、傳感器故障: (1)單一傳感器數據異常處理。自動駕駛電動平板傳感方案為冗余設置,有其他傳感器能夠覆蓋故障傳感器觀測區域,感知/定位模塊將數據異常情況發給到規劃決策模塊,由“大腦”向中控平臺上報故障…

視頻集中存儲/云存儲/磁盤陣列EasyCVR平臺接入RTSP設備出現離線情況的排查

安防視頻監控/視頻集中存儲/云存儲/磁盤陣列EasyCVR平臺可拓展性強、視頻能力靈活、部署輕快,可支持的主流標準協議有國標GB28181、RTSP/Onvif、RTMP等,以及支持廠家私有協議與SDK接入,包括海康Ehome、海大宇等設備的SDK等。平臺既具備傳統安…

QT處理日志文件

由于實際生產需要,軟件系統的運行,會產生大量的日志文件,有時候一天就能產生超過百萬條log記錄,那么為了能夠處理日志文件,查詢并且找到我們想要的報錯信息,因此不得不考慮怎么實現,打開大日志文…

ARM--day2(cpsr、spsr、數據搬移指令、移位操作指令、位運算操作指令、算數運算指令、比較指令、跳轉指令)

.text .global _gcd _gcd:mov r0,#9mov r1,#15b loop loop:cmp r0,r1beq stopsubhi r0,r1bhi loopsubcc r1,r0bcc loopstop:b stop.end用for循環實現1~100之間和5050 .text .global _gcd _gcd:mov r0,#0x0mov r1,#0x1mov r2,#0x64b loop loop:cmp r1,r2bhi stopadd r0,r0,r1ad…

【Unity】坐標轉換經緯度方法(應用篇)

【Unity】坐標轉換經緯度方法(應用篇) 解決地圖中經緯度坐標轉換與unity坐標互轉的問題。使用線性變換的方法,理論上可以解決小范圍內所以坐標轉換的問題。 之前有寫過[Unity]坐標轉換經緯度方法(原理篇),在實際使用中&#xff0c…

R語言實現免疫浸潤分析(2)

原始數據承接免疫浸潤分析&#xff08;1&#xff09;&#xff0c;下面展示免疫浸潤結果&#xff1a; #直接使用IOBR包內的cell_bar_plot pic<-cell_bar_plot(input quantiseq_immo_de[1:20,], title "quanTiseq Cell Fraction") #使用ggplot2 library(ggplot2)…

大疆飛卡30運載無人機技術分享

大疆飛卡30是大疆公司面向運輸領域推出的一款專業運載無人機。它采用了優秀的設計,裝備了多種先進傳感器,以解決運輸中的難題。以下我們來了解一下其主要特點: 【應用領域】 飛卡30適用于山地救災、農業化肥施用、工程材料運送等交通不便的山區應用,也適用于海島聯通等運輸鏈…

管理類聯考——邏輯——真題篇——按知識分類——匯總篇——二、論證邏輯——削弱——第一節 推理論證

文章目錄 第七章 削弱質疑第一節 削弱-題型1-推理論證-論證為預測結果題-削弱質疑-預測-推理論證-分類1-削弱論點真題(2019-24)-削弱質疑-預測-推理論證-分類1-削弱論點真題(2019-42)-削弱質疑-預測-推理論證-分類1-削弱論點真題(2011-32)-削弱質疑-預測-推理論證-分類…

機器學習基礎之《分類算法(3)—模型選擇與調優》

作用是如何選擇出最好的K值 一、什么是交叉驗證&#xff08;cross validation&#xff09; 1、定義 交叉驗證&#xff1a;將拿到的訓練數據&#xff0c;分為訓練和驗證集。以下圖為例&#xff1a;將數據分成5份&#xff0c;其中一份作為驗證集。然后經過5次(組)的測試&#x…

通過請求頭傳數據向后端發請求

axios &#xff08;get post請求、頭部參數添加&#xff09;傻瓜式入門axios_axiospost請求參數_web_blog的博客-CSDN博客

ByteBuffer 使用

ByteBuffer 使用 1 java.nio包中的類定義的緩沖區類型2 緩沖區常用屬性2.1緩沖區的容量(capacity)2.2 緩沖區的位置(position)2.3 緩沖區的限制(limit)2.4 緩沖區的標記(mark)2.5 剩余容量 remaining/hasRemaining 3 緩沖區常用方法3.1 創建緩沖區3.1.1 allocate方法3.1.2 wrap…

【mybatis】mapper.xml中foreach的用法,含批量查詢、插入、修改、刪除方法的使用

一、xml文件中foreach的主要屬性 foreach元素的屬性主要有 collection&#xff0c;item&#xff0c;index&#xff0c;separator&#xff0c;open&#xff0c;close。 collection: 表示集合&#xff0c;數據源 item &#xff1a;表示集合中的每一個元素 index &#xff1a;用于…

blender 發射體粒子

發射體粒子的基礎設置 選擇需要添加粒子的物體&#xff0c;點擊右側粒子屬性&#xff0c;在屬性面板中&#xff0c;點擊加號&#xff0c;物體表面會出現很多小點點&#xff0c;點擊空格鍵&#xff0c;粒子會自動運動&#xff0c;像下雨一樣&#xff1b; bender 粒子系統分為兩…

【100天精通python】Day40:GUI界面編程_PyQt 從入門到實戰(完)_網絡編程與打包發布

目錄 8 網絡編程 8.1 使用PyQt 網絡模塊進行網絡通信 服務器端示例 客戶端示例 8.2 處理網絡請求和響應 9 打包和發布 9.1 創建可執行文件或安裝程序 9.2 解決依賴問題 9.3 發布 PyQt 應用到不同平臺 9.3.1 發布到 Windows 9.3.2 發布到 macOS 9.3.3 發布到 Linux 9…

sap ui5刷新頁面的方式

1.第一種 window.location.reload();2.第二種 如果你想在UI5應用程序中使用MVC模式來處理頁面刷新,可以通過重新加載當前路由來實現刷新。首先,確保你有一個Router對象實例: var oRouter = sap.ui.core.UIComponent.getRouterFor(this);然后&

[保研/考研機試] KY43 全排列 北京大學復試上機題 C++實現

題目鏈接&#xff1a; 全排列https://www.nowcoder.com/share/jump/437195121692001512368 描述 給定一個由不同的小寫字母組成的字符串&#xff0c;輸出這個字符串的所有全排列。 我們假設對于小寫字母有a < b < ... < y < z&#xff0c;而且給定的字符串中的字…

Docker vs. Kubernetes:選擇合適的場景

在決定使用 Docker 還是 Kubernetes 之前&#xff0c;讓我們看看一些實際的場景&#xff0c;以便更好地理解它們的適用性。 使用 Docker 的場景 假設您正在開發一個微服務應用程序&#xff0c;其中每個微服務都需要一些特定的依賴項和環境。在這種情況下&#xff0c;Docker 是一…