1. 程式人生 > >study-notes(6 Zookeeper)

study-notes(6 Zookeeper)

這篇文章是將自己所學技術按模組劃分總結而成的筆記,包含了 JavaSE、JavaWeb(SpringMVC、Spring、MyBatis、SpringBoot、SpringCloud 等)、Linux、Hadoop、MapReduce、Hive、Scala、Spark 等,希望通過這些筆記的總結,不僅能讓自己對這些技術的掌握更加深刻,同時也希望能幫助一些其他熱愛技術的人,這些筆記後續會繼續更新,以後自己學習的其他最新技術,也都會以這樣筆記的形式來保留,這些筆記已經共享到 Github,大家可以在那裡下載到 Markdown 檔案,如果大家在看的時候有什麼問題或疑問,可以通過郵箱與我取得聯絡,或者在下面的評論區留言,同時也可以在 Github 上與我進行互動,希望能與大家一起相互學習,相互進步,共同成長。

6 Zookeeper

6.1 概述

Zookeeper 是一個分散式開源框架,有兩個最基本的功能 : 儲存小資料和監聽機制,一般用於分散式鎖、分散式叢集管理、叢集選主。

6.2 叢集特性

1、叢集中每個伺服器儲存一份相同的資料副本;

2、一份資料會在所有機器上都儲存一份;

3、全域性有序和偏序 : 全域性有序是指如果在一臺機器上訊息 a 在訊息 b 之前被髮布,則在叢集中所有機器上訊息 a 都在訊息 b 之前被髮布。偏序是指如果訊息 b 被同一個傳送者在訊息 a 之後釋出,則訊息 a 永遠排在訊息 b 前面。

4、一次資料更新要麼成功(半數以上節點成功),要麼失敗,不存在中間狀態。

6.3 叢集角色

Leader : Zookeeper 叢集工作的核心,事務請求(寫操作)的唯一排程和處理者,保證叢集事務處理的順序性,叢集內部各個伺服器的排程者。

Follower : 處理客戶端非事務(讀操作)請求,轉發寫清求個 Leader,參與叢集 Leader 選舉投票。

Observer : 觀察 Zookeeper 叢集的最新狀態並將這些狀態同步過來,對於非事務性請求可以獨立處理,對於事務性請求,則會轉發給 Leader 進行處理,不會參與任何形式的投票只提供非事務服務,通常用於在不影響叢集效能、處理能力的前提下提升叢集的非事務處理能力。

6.4 典型應用

6.4.1 資料釋出於訂閱(配置中心)

釋出者將資料釋出在 zk 節點上,供訂閱者動態獲取資料,實現配置資訊的集中管理和動態更新。

6.4.2 叢集選主

在一個叢集中有一個 active 節點,多個 standby 節點,當一個節點掛掉時,可以選出一個 standby 節點,並將其狀態更改為 active,從而實現叢集的高可用。

6.4.3 分散式鎖

所有客戶端要想獲得執行權,就需要在 /locked 下建立一個節點,如果這個節點已經建立,那麼使用者就不能在建立節點,無法獲得執行權,這樣就保證了在同一個時刻只有一個客戶端擁有執行權,當執行完成後,客戶端會刪除所建立的節點,這樣所有的客戶端就會爭搶去建立節點,從而實現分散式鎖。

6.5 選舉機制

伺服器 1 啟動 -> 給自己投票 -> 票數為 1,沒有過半 -> 處於觀望狀態

伺服器 2 啟動 -> 給自己投票 -> 伺服器 1 的編號小於伺服器 2 的編號,伺服器 1 屈服,將投票給伺服器 2 -> 票數為 2,沒有過半 -> 處於觀望狀態

伺服器 3 啟動 -> 給自己投票 -> 伺服器 1,2 的編號都小於 3,伺服器 1,2 屈服,將投票給伺服器 3 -> 票數為 3,過半 -> 伺服器 3 勝出

伺服器 4 啟動 -> 給自己投票 -> 票數為 1,但伺服器 3 已經勝出 -> 伺服器 4 屈服

伺服器 5 啟動 -> 給自己投票 -> 票數為 1,但伺服器 3 已經勝出 -> 伺服器 5 屈服