Zookeeper是什么
Zookeeper是一個分布式的泼差,開源的分布式應用程序協(xié)調(diào)服務躯概,是Google的Chubby一個開源的實現(xiàn)年栓,是Hadoop和HBase導致重要組件。它是一個為分布式應用提供一致性服務的軟件糜烹,提供的功能包括:配置維護违诗、域名服務、分布式同步疮蹦,組服務等诸迟。
為什么使用Zookeeper
- 大部分的分布式應用程序都需要一個主控、協(xié)調(diào)器或者控制器來物理分布的子進程(如資源愕乎,內(nèi)存分配等)
- 目前大部分應用開發(fā)私有的協(xié)調(diào)程序亮蒋,缺乏一個通用性
- 協(xié)調(diào)程序的反復編寫浪費,難以形成通用妆毕、伸縮性好的協(xié)調(diào)器
- ZooKeeper:提供通用的分布式鎖服務,用以協(xié)調(diào)分布式應用
Zookeeper三種角色
Leader
整個Zookeeper集群工作機制中的核心贮尖。Leader作為整個Zookeeper集群的主節(jié)點笛粘,負責響應所有對Zookeeper狀態(tài)變更的請求。
主要工作:
- 事務請求的唯一調(diào)度和處理湿硝,保證集群處理事務的順序性
- 集群內(nèi)各服務的調(diào)度者薪前。
Follower
是Zookeeper集群狀態(tài)的跟隨者。它的邏輯相對簡單关斜。除了響應本服務器上的讀請求外示括,follower還要處理leader的提議,并在leader提交該提議時在本地也進行提交痢畜。另外需要注意的是垛膝,leader和follower構(gòu)成Zookeeper集群的法定人數(shù),也就是說丁稀,只有它們才參與新leader的選舉吼拥,響應leader的提議。
Observer
觀察者线衫。如果Zookeeper集群的讀取負載很高凿可,或者客戶端多到跨機房,可以設(shè)置一些observer服務器授账,以提高讀取的吞吐量枯跑。Observer和Follower比較相似惨驶,只有一些小區(qū)別:
- 首先Observer不屬于法定人數(shù),即不參加選舉也不響應提議敛助,也不參與寫操作的過半寫成功策略
- observer不需要將食物持久化到磁盤粗卜,一旦observer被重啟,需要從leader重新同步整個名字空間
Zookeeper Leader選舉過程
Leader選舉是保證分布式數(shù)據(jù)一致性的關(guān)鍵所在辜腺。當Zookeeper集群中的一臺服務器出現(xiàn)以下兩種情況之一是休建,需要進入Leader選舉。
- 服務器初始化啟動
- 服務器運行期間無法和Leader保持連接
服務器初始化時期Leader選舉
- 每個Server發(fā)出一個投票评疗。初始情況下测砂,每個Server都會將自己作為Leader服務器來進行投票,每次投票會包含所推舉的myid和ZXID百匆,使用(myid砌些,ZXID)來表示,然后各自將這個投票發(fā)給集群中其他機器
- 接受來自各個服務器的投票加匈。集群的每個服務器收到投票后存璃,首先判斷該投票的有小型,如檢查是否是本輪投票雕拼、是否來自LOOKING狀態(tài)的服務器纵东。
- 處理投票。針對每一個投票啥寇,服務器都需要將別人的投票和自己的投票進行PK偎球,PK規(guī)則如果下:
- 優(yōu)先檢查ZXID。ZXID比較大的服務器優(yōu)先作為Leader
- 如果ZXID相同辑甜,那么就比較myid衰絮。myid較大的服務器作為Leader服務器。
- 統(tǒng)計投票磷醋。每次投票后猫牡,服務器都會統(tǒng)計投票信息,判斷是否已經(jīng)有過半機器接收到相同的投票信息邓线。
- 改變服務器狀態(tài)淌友。一旦確定了Leader。每個服務器就會更新自己的狀態(tài)褂痰,如果是Follower亩进,那么就變更為FOLLOWING,如果是Leader缩歪,就變更狀態(tài)為LEADING归薛。
服務器運行期間Leader選舉
- 變更狀態(tài)。Leader掛后,余下的非Observer服務器都會講自己的服務器狀態(tài)變?yōu)長OKKING主籍,然后開始進入Leader選舉過程习贫。
- 每個Server會發(fā)出一個投票。在運行期間千元,每個服務器上的ZXID可能不同苫昌,每個服務器向集群中多有機器發(fā)送投票信息(myid,ZXID)
- 接收來自各個服務器的投票幸海。與啟動時過程相同祟身。
- 處理投票。與啟動時過程相同物独。
- 統(tǒng)計投票袜硫。與啟動時過程相同。
- 改變服務器的狀態(tài)挡篓。與啟動時過程相同婉陷。