在公司核心系統(tǒng)的開發(fā)過程中用到了ZooKeeper钙勃,簡稱zk祖秒,用于搭建分布式核心環(huán)境痕囱,開發(fā)過程中也經(jīng)常會遇到zk出現(xiàn)的問題田轧,看了幾篇博客了解和總結(jié)一下zk的基本原理。
一鞍恢、Zookeeper簡介
ZooKeeper 是一個開源的分布式協(xié)調(diào)服務(wù)傻粘,由雅虎創(chuàng)建每窖,是 Google Chubby 的開源實現(xiàn)。分布式應(yīng)用程序可以基于 ZooKeeper 實現(xiàn)諸如數(shù)據(jù)發(fā)布/訂閱弦悉、負載均衡窒典、命名服務(wù)、分布式協(xié)調(diào)/通知稽莉、集群管理瀑志、Master 選舉、配置維護污秆,名字服務(wù)劈猪、分布式同步、分布式鎖和分布式隊列等功能良拼。
二战得、基本概念
ZooKeeper?主要有幾個重要的概念,簡單總結(jié)下:
1.集群角色
ZooKeeper?中主要有三種角色:Leader庸推、Follower常侦、Observer
一個 ZooKeeper 集群同一時刻只會有一個 Leader,其他都是 Follower 或 Observer贬媒。
什么是集群聋亡?
PS:引用一個有趣的例子
小飯店原來只有一個廚師,切菜洗菜備料炒菜全干掖蛤。后來客人多了杀捻,廚房一個廚師忙不過來,又請了個廚師蚓庭,兩個廚師都能炒一樣的菜,這兩個廚師的關(guān)系是集群仅仆。為了讓廚師專心炒菜器赞,把菜做到極致,又請了個配菜師負責(zé)切菜墓拜,備菜港柜,備料,廚師和配菜師的關(guān)系是分布式咳榜,一個配菜師也忙不過來了夏醉,又請了個配菜師,兩個配菜師關(guān)系是集群
官方解釋:
分布式:不同的業(yè)務(wù)模塊部署在不同的服務(wù)器上或者同一個業(yè)務(wù)模塊分拆多個子業(yè)務(wù)涌韩,部署在不同的服務(wù)器上畔柔,解決高并發(fā)的問題
集群:同一個業(yè)務(wù)部署在多臺機器上,提高系統(tǒng)可用性
2.Zookeeper節(jié)點讀寫服務(wù)分工
ZooKeeper 集群的所有機器通過一個 Leader 選舉過程來選定一臺被稱為『Leader』的機器臣樱,Leader服務(wù)器為客戶端提供讀和寫服務(wù)靶擦。
Follower 和 Observer 都能提供讀服務(wù)腮考,不能提供寫服務(wù)。兩者唯一的區(qū)別在于玄捕,Observer機器不參與 Leader 選舉過程踩蔚,也不參與寫操作的『過半寫成功』策略,因此 Observer 可以在不影響寫性能的情況下提升集群的讀性能枚粘。
每個子目錄項如 NameService 都被稱作為znode馅闽,和文件系統(tǒng)一樣,我們能夠自由的增加馍迄、刪除znode捞蛋,在一個znode下增加、刪除子znode柬姚,唯一的不同在于znode是可以存儲數(shù)據(jù)的拟杉。?
Zookeeper選主流程(basic paxos)
當(dāng)leader崩潰或者leader失去大多數(shù)的follower,這時候zk進入恢復(fù)模式量承,恢復(fù)模式需要重新選舉出一個新的leader搬设,讓所有的Server都恢復(fù)到一個正確的狀態(tài)。Zk的選舉算法有兩種:一種是基于basic paxos實現(xiàn)的撕捍,另外一種是基于fast paxos算法實現(xiàn)的拿穴。系統(tǒng)默認的選舉算法為fast paxos。
1.選舉線程由當(dāng)前Server發(fā)起選舉的線程擔(dān)任忧风,其主要功能是對投票結(jié)果進行統(tǒng)計默色,并選出推薦的Server;
2.選舉線程首先向所有Server發(fā)起一次詢問(包括自己)狮腿;
3.選舉線程收到回復(fù)后腿宰,驗證是否是自己發(fā)起的詢問(驗證zxid是否一致),然后獲取對方的id(myid)缘厢,并存儲到當(dāng)前詢問對象列表中吃度,最后獲取對方提議的leader相關(guān)信息(id,zxid),并將這些信息存儲到當(dāng)次選舉的投票記錄表中贴硫;
4.收到所有Server回復(fù)以后椿每,就計算出zxid最大的那個Server,并將這個Server相關(guān)信息設(shè)置成下一次要投票的Server英遭;
5.線程將當(dāng)前zxid最大的Server設(shè)置為當(dāng)前Server要推薦的Leader间护,如果此時獲勝的Server獲得n/2 + 1的Server票數(shù),設(shè)置當(dāng)前推薦的leader為獲勝的Server挖诸,將根據(jù)獲勝的Server相關(guān)信息設(shè)置自己的狀態(tài)汁尺,否則,繼續(xù)這個過程税灌,直到leader被選舉出來均函。 通過流程分析我們可以得出:要使Leader獲得多數(shù)Server的支持亿虽,則Server總數(shù)必須是奇數(shù)2n+1,且存活的Server的數(shù)目不得少于n+1. 每個Server啟動后都會重復(fù)以上流程苞也。在恢復(fù)模式下洛勉,如果是剛從崩潰狀態(tài)恢復(fù)的或者剛啟動的server還會從磁盤快照中恢復(fù)數(shù)據(jù)和會話信息,zk會記錄事務(wù)日志并定期進行快照如迟,方便在恢復(fù)時進行狀態(tài)恢復(fù)收毫。
3.Session 客戶端會話
Session 是指客戶端會話。在ZooKeeper 中殷勘,一個客戶端連接是指客戶端和 ZooKeeper 服務(wù)器之間的TCP長連接此再。
ZooKeeper 對外的服務(wù)端口默認是2181,客戶端啟動時玲销,首先會與服務(wù)器建立一個TCP連接输拇,從第一次連接建立開始,客戶端會話的生命周期也開始了贤斜,通過這個連接策吠,客戶端能夠通過心跳檢測和服務(wù)器保持有效的會話,也能夠向 ZooKeeper 服務(wù)器發(fā)送請求并接受響應(yīng)瘩绒,同時還能通過該連接接收來自服務(wù)器的 Watch 事件通知猴抹。
Session 的 SessionTimeout 值用來設(shè)置一個客戶端會話的超時時間。當(dāng)由于服務(wù)器壓力太大锁荔、網(wǎng)絡(luò)故障或是客戶端主動斷開連接等各種原因?qū)е驴蛻舳诉B接斷開時蟀给,只要在SessionTimeout 規(guī)定的時間內(nèi)能夠重新連接上集群中任意一臺服務(wù)器,那么之前創(chuàng)建的會話仍然有效阳堕。
4.?數(shù)據(jù)節(jié)點
zookeeper的結(jié)構(gòu)其實就是一個樹形結(jié)構(gòu)跋理,leader就相當(dāng)于其中的根結(jié)點,其它節(jié)點就相當(dāng)于follow節(jié)點嘱丢,每個節(jié)點都保留自己的內(nèi)容薪介。
zookeeper的節(jié)點分兩類:持久節(jié)點和臨時節(jié)點
持久節(jié)點:所謂持久節(jié)點是指一旦這個 樹形結(jié)構(gòu)上被創(chuàng)建了,除非主動進行對樹節(jié)點的移除操作越驻,否則這個 節(jié)點將一直保存在 ZooKeeper 上。
臨時節(jié)點:臨時節(jié)點的生命周期跟客戶端會話綁定道偷,一旦客戶端會話失效缀旁,那么這個客戶端創(chuàng)建的所有臨時節(jié)點都會被移除。
有四種類型的znode:?
1勺鸦、PERSISTENT-持久化目錄節(jié)點?
客戶端與zookeeper斷開連接后并巍,該節(jié)點依舊存在?
2、PERSISTENT_SEQUENTIAL-持久化順序編號目錄節(jié)點?
客戶端與zookeeper斷開連接后换途,該節(jié)點依舊存在懊渡,只是Zookeeper給該節(jié)點名稱進行順序編號?
3刽射、EPHEMERAL-臨時目錄節(jié)點?
客戶端與zookeeper斷開連接后,該節(jié)點被刪除?
4剃执、EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節(jié)點?
客戶端與zookeeper斷開連接后誓禁,該節(jié)點被刪除,只是Zookeeper給該節(jié)點名稱進行順序編號?
5.?狀態(tài)信息
每個 節(jié)點除了存儲數(shù)據(jù)內(nèi)容之外肾档,還存儲了 節(jié)點本身的一些狀態(tài)信息摹恰。用 get 命令可以同時獲得某個 節(jié)點的內(nèi)容和狀態(tài)信息
在 ZooKeeper 中,version 屬性是用來實現(xiàn)樂觀鎖機制中的『寫入校驗』的(保證分布式數(shù)據(jù)原子性操作)怒见。
6.事物操作
Zookeeper 的核心是原子廣播俗慈,這個機制保證了各個Server之間的同步。實現(xiàn)這個機制的協(xié)議叫做Zab協(xié)議遣耍。Zab協(xié)議有兩種模式闺阱,它們分別是恢復(fù)模式(選主)和廣播模式(同步)。當(dāng)服務(wù)啟動或者在領(lǐng)導(dǎo)者崩潰后舵变,Zab就進入了恢復(fù)模式酣溃,當(dāng)領(lǐng)導(dǎo)者被選舉出來,且大多數(shù)Server完成了和 leader的狀態(tài)同步以后棋傍,恢復(fù)模式就結(jié)束了救拉。狀態(tài)同步保證了leader和Server具有相同的系統(tǒng)狀態(tài)。
在ZooKeeper中瘫拣,能改變ZooKeeper服務(wù)器狀態(tài)的操作稱為事務(wù)操作亿絮。一般包括數(shù)據(jù)節(jié)點創(chuàng)建與刪除、數(shù)據(jù)內(nèi)容更新和客戶端會話創(chuàng)建與失效等操作麸拄。對應(yīng)每一個事務(wù)請求派昧,為了保證事務(wù)的順序一致性,ZooKeeper都會為其分配一個全局唯一的事務(wù)ID拢切,用 ZXID 表示蒂萎,通常是一個64位的數(shù)字。每一個 ZXID對應(yīng)一次更新操作淮椰,從這些 ZXID 中可以間接地識別出 ZooKeeper 處理這些事務(wù)操作請求的全局順序五慈。
7.Watcher(事件監(jiān)聽器)
ZooKeeper允許用戶在指定節(jié)點上注冊一些 Watcher,并且在一些特定事件觸發(fā)的時候主穗,ZooKeeper 服務(wù)端會將事件通知到感興趣的客戶端上去泻拦。該機制是 ZooKeeper 實現(xiàn)分布式協(xié)調(diào)服務(wù)的重要特性。