1. 程式人生 > >《從Paxos到zookeeper分散式一致性原理與實踐》理解

《從Paxos到zookeeper分散式一致性原理與實踐》理解

zookeeper的來由
最大一個特點就是解決分散式一致性問題。簡單講,資料一致性就是指在對一個副本資料進行更新的同時,必須確保也能更新其他副本(其他副本可能在各個不同的伺服器節點),否則不同副本之間的資料將不再一致。那麼解決這樣的一致性問題,大家肯定想到使用鎖,但使用簡單的使用鎖實在太影響效能。所以有很多一致性協議出現,二階段提交協議,三階段提交協議,還有Paxos演算法等。

1.2PC(Two-Phase Commit)二階段提交和3PC(Two-Phase Commit)三階段提交
在分散式系統中,每一個機器節點雖然能明確的知道自己在進行事務操作過程中的結果是成功還是失敗,但卻無法直接獲取其他分散式節點的操作結果。因此,當一個事務操作需要跨越多個分散式節點的時候,為了保持事務的ACID特性,就需要引入一個"協調者"(分散式節點的某一個節點),統一排程所有分散式節點。這些被排程的分散式稱為"參與者"。協調者負責排程參與者的行為,並最終決定這些參與者是否要把事務真正的提交。基於這樣的思想,就出現了2PC和3PC,3PC是2PC的提升。
2PC如下圖:
在這裡插入圖片描述


3PC如下圖:
在這裡插入圖片描述
2PC,3PC對事務的執行其實都差不多
優點:原理簡單,實現方便
缺點:當出現網路故障的時候,無法保證資料的一致性

2.Paxos
Paxos是萊斯利蘭伯特於1990年提出的一種基於訊息傳遞,且具有高度容錯特性的一致性演算法,是目前公認解決分散式一致性問題最有效的演算法之一。Paxos演算法引入"過半"的理念,也就是少數服從多數原則,支援分散式節點角色之間輪換,這可以避免分散式單點宕機問題,也保證了資料一致性。

Zookeeper
zookeeper並沒有直接採用Paxos演算法,而是採用了一種被稱為ZAB(zookeeper Atomic Broadcast)的一致性協議。

zookeeper的設計目的
將那些複雜且容易出錯的分散式一致性服務封裝起來,構成一個高效可靠的原語集,並以一些列簡單易用的介面提供給使用者使用。

zookeeper的特性
1.順序一致性
從同一個客戶端發起的事務請求,最終將會嚴格的按照其發起的順序被應用到ZooKeeper中
2.原子性
所有事務請求處理結果在整個叢集中所有機器上的應用情況是一致的
3.單一試圖
無論客戶端連線的是哪個Zookeeper伺服器,其看到的服務端資料模型都是一致的
4.可靠性
5.實時性
zookeeper僅僅保證在一定的時間段內,客戶端最終一定能從伺服器上讀取到最新的資料狀態

zookeeper的設計


1.簡單的資料模型
zookeeper分散式通過一個共享的,樹型結構的名字空間來進行協調,由一些列的Znode資料節點構成,資料模型類似於一個檔案系統,但zookeeper是將全量資料儲存在記憶體中,以實現高服務吞吐,減少延遲的目的。
2.可以構建叢集
叢集中存在超過一半的機器能夠正常工作,那麼整個叢集就能夠正常對外服務,zookeeper的客戶端會選擇和叢集中的任意一臺機器共同建立一個TCP連線,而一旦伺服器一旦出現問題,客戶端會自動連線到叢集中的其他機器。
3.順序訪問
客戶端的每一個更新請求,zookeeper都會分配一個全域性唯一的遞增編號,以保證順序
4.高效能
因為zookeeper將全量資料在記憶體中,所以具有高效能

zookeeper的叢集角色
沒有沿用Master/Slave概念,而是引入可Leader,Follower和Observer三種角色
1.Leader
主要工作:
(1)事務請求的唯一排程者和處理者,保證叢集事務處理的順序性
(2)叢集內部各伺服器的排程者
2.Follower
主要工作
(1)處理客戶端非事務請求,轉發事務請求給Leader伺服器
(2)參與事務請求Proposal的投票
(3)參與Leader選舉投票
3.Observer
工作原理上和Follower基本一致,唯一區別在於不參與任務形式投票,包括事務請求Proposal的投票和Leader選舉投票。
通常用於在不影響叢集事務處理能力前提下提升叢集的非事務處理能力。

zookeeper監聽器Watcher
Watcher是Zookeeper中的一個很重要的特性,Zookeeper允許使用者在指定節點上註冊一些Watcher,並且在一些特定事件觸發的時候
zookeeper會將事件通知到感興趣的客戶端上。

應用程式使用zookeeper的目的
1.資料釋出/訂閱
2.負載均衡
3.命名服務
4.分散式協調/通知
5.叢集管理
6.Master選舉
7.分散式鎖和分散式佇列等功能

zookeeper的安裝和使用
先要裝java1.8,然後下載zookeeper包,解壓
1.先設定配置檔案
將conf目錄下的zoo_sample.cfg更名為zoo.cfg
2.使用bin/zkServer.sh start 啟動zookeeper
3.使用jps檢視java程序名稱
4.使用bin/zkServer.sh status檢視zookeeper的狀態
5.使用bin/zkCli.sh啟動客戶端和zookeeper伺服器進行連線
連線成功以後可以使用help檢視各種命令
6.檢視目錄 ls /
7.通過get /zookeeper/quota檢視有什麼資料,還有當前磁碟的資訊
8.建立節點 create /test 111,意思就是建立一個檔案目錄test,然後再建立節點111,然後使用ls可以檢視
9.可以通過set /test 222將此節點111修改為222
10.刪除目錄 rmr /test

zookeeper叢集搭建
官方建議1,3,5這樣奇數搭建
只需要在一個伺服器上配置,然後往其它伺服器進行拷貝就可以了,拷貝可以是整個zookeeper資料夾
比如下面配置3個伺服器
1.在conf zoo.cfg中新增伺服器編號
server.1=hadoop-senior01.test.com(主機名或者IP,10.42.27.1):2888(進行資料同步埠號):3888(選主通訊埠號)
server.2=hadoop-senior02.test.com:2888:3888
server.3=hadoop-senior03.test.com:2888:3888
2.然後再data 目錄下建立檔案myid,內容為編號id,比如1,2,3
3.然後啟動3個服務,使用bin/zkServer.sh status檢視zookeeper的狀態,看哪個是主,哪個是從
4.可以使用bin/zkCli.sh -server hadoop-senior01.test.com:2181(埠號) 連線各個服務

java客戶端的API使用
1.可以使用zookeeper自帶的API
2.使用開源客戶端ZkClient
3.使用開源客戶端Curator

zookeeper的典型應用
1.資料的釋出/訂閱
比如:建立節點/configServer/app1/database/cfg,記錄資料庫的連線資訊,所有的伺服器都監聽該節點,假設資料庫連線資訊變更,則所有伺服器立馬就會受到變更訊息,重新更改自己的連線。
2.用來叢集管理,Master選擇