1、什么是zookeeper?
1、zookeeper是一個分布式協調技術,是分布式數據一致性解決方案的典型代表,力求做到強一致性但最終實現的是最終一致性,采用CAP理論的AP,用來構建高可用分布式主備系統
2、zookeeper能干什么?
1、數據發布/訂閱
2、命名服務
3、集群管理
4、Master選舉
5、分布式鎖
6、分布式隊列
7、負載均衡
3、zookeeper提供了什么?
1、文件系統
2、消息廣播
4、簡單說一下zookeeper的文件系統?
1、zookeeper集群是有一個叫做命名節點空間的概念,其中節點就是znode,在zookeeper的文件系統中有兩種節點,一是數據節點,二是目錄節點,但是只有數據節點能存放數據
2、zookeeper集群為了維護高吞吐和低延遲的特性,就維護了這樣樹狀的目錄結構,而且數據節點的存儲量不能太大,最多為1M
5、說一下ZAB協議?
1、ZAB協議是為分布式協調技術zookeeper提供的一個支持崩潰回復的原子廣播協議
2、ZAB包括兩種模式即崩潰回復和消息廣播
3、首先當服務剛啟動的時候或者leader節點宕機或者集群內有一半以上機器不能正常工作,此時會進入leader選舉狀態,然后再向其它服務器同步數據(采用的是兩階段提交),只要有一般以上返回成功的結果,此時便進入消息廣播模式,整個zookeeper集群就可以對外提供服務並處理客戶端的請求
6、zookeeper有幾種數據節點?分別是什么?
1、7種
持久節點 除非手動刪除,否則數據一直存在
臨時節點 臨時節點的生命周期與客戶端會話綁定,當會話關閉,數據才會丟失
持久順序節點 和持久節點類似,只是多了順序性,該特性是由父節點維護的一個自增整型數字
臨時順序節點 和臨時節點類似,只是多了順序性,該特性是由父節點維護的一個自增整型數字
容器節點 當節點的最后一個子節點刪除之后,該容器節點會被自動刪除
TTL節點 在節點上加了過期時間
TTL順序節點 和TTL節點類似,只是多了順序性,該特性是由父節點維護的一個自增整型數字
7、簡單說一下zookeeper Watcher機制(zookeeper數據變更通知)?
1、客戶端注冊Watcher
2、服務端觸發Watcher
3、客戶端回調Watcher
首先客戶端會向服務端注冊一個Watcher監聽,當服務端的某些指令觸發了這個Watcher的話,服務端就會向客戶端返回一個消息通知,客戶端接收到消息之后便可以做出業務上的改變
8、客戶端注冊Watcher是如何實現的?
1、首先會訪問getData()/getChildren()/exist()三個API,傳入Watcher對象
2、標記請求request,將Watcher封裝成WatcherRegistration對象
3、再封裝成Packet對象,服務端發送request
4、接收到服務端的request請求之后,將Watcher注冊到zkWatcherManager中進行管理
5、將結果返回給客戶端,注冊成功
9、服務端處理Watcher是怎樣實現的?
1、首先根據客戶端的請求判斷是否需要注冊Watcher
2、比如服務端觸發了setData()/delete()/create()方法,會觸發一個叫做NodeDataChanged()的事件
3、服務端會將觸發的事件類型、節點的路徑封裝成一個叫做WatchedEvent的對象
4、再向zkWatcherManager中的WatcherTable中根據節點路徑查找
若找不到,說明客戶端沒有注冊過Watcher
若找到,將Watcher從WatcherTable中刪除(說明Watcher監聽是一次性的)
5、調用process方法觸發Watcher,主要是通過Servercnxn的TCP連接來通知客戶端
10、客戶端回調Watcher是怎樣實現的?
1、客戶端有個SendThread來接收Watcher通知的線程,接收的通知之后會交由EventThread線程處理
2、客戶端的Watcher監聽也是一次性的,一旦觸發也會被刪除
11、說一下你對zookeeper權限控制列表的認識(ACL)?
1、zookeeper的權限控制列表包含三個部分
a、授權模式
· IP:授權模式精確到IP粒度
· Digest:相當於username:password,最常用的一種授權模式
· World:相當於最特殊的Digest模式world:everyone,最開放的一種授權模式
· Super:超級用戶
b、授權對象:被授予權限的用戶例如某個IP
c、權限
· Create:創建
· Delete:刪除
· Read:讀
· Write:寫
· Admin:管理
12、你知道Chroot屬性是用來干什么的嗎?
1、zookeeper新版本提出的一種特性,類似與namespace的說法,就是每個客戶端與zookeeper的服務端之間的交互都保存在自己的namespace下
2、在目前的分布式系統中,很多都是多個應用共用一個zookeeper集群,如果設置了chroot屬性,那么不同應用之間就可以起到很好的隔離效果
13、zookeeper的會話管理是怎樣的?
1、分桶策略:即將類似的會話分到同一個區內進行管理,這樣做可以起到不同區塊的分批處理以及同一區塊的統一處理
2、分桶原則:下次會話超時時間點
3、計算公式:{[(當前時間+session超時時間)/(tickTime)]+1}*tickTime (其中tickTime是會話超時檢查時間間隔)
14、zookeeper中的服務器角色都有哪些?分別是干什么的?
1、leader
a、事務的執行和調度者,保證事務的順序性
b、集群內部各服務的調度者
2、follower
a、處理非事務請求,將事務請求轉發給leader處理
b、參與集群內Proposal(提議)的投票
c、參與leader選舉的投票
3、observer
a、處理非事務請求,將事務請求轉發給leader
b、在不影響事務處理能力的基礎上增加了處理非事務請求的能力
c、不參與任何形式的投票
15、zookeeper中Server的工作狀態?
1、looking:集群中leader選舉的狀態
2、leading:說明當前服務器角色是leader節點
3、following:說明當前服務器角色是follower節點
4、observing:說明當前服務器角色是observer節點
16、zookeeper數據同步的實現方式?
1、zookeeper實現數據同步有4種方式,即直接差異化同步、先回滾再差異化同步、僅回滾同步、全量同步
2、首先先從learner(follower和observer節點的統稱)節點獲取最后一次操作數據的zxid,再從leader節點中獲取最小的minZxid和最大的maxZxid
3、a、如果minZxid<zxid<maxZxid -->采用直接差異化同步
b、如果leader服務器發現learner服務器包含了自己不存在的數據,那么learner服務器需要回滾到leader包含的數據然后在差異化處理
-->先回滾再差異化同步
c、如果zxid>maxZxid -->僅回滾同步即可
d、如果zxid<minZxid -->全量同步
17、zookeeper是如何保證事務的順序一致性的?
1、zookeeper采用全局遞增的事務id(zxid)來保證事務的順序一致性的
2、所有的提議在被提出的都會攜帶這個zxid,zxid是一個64位的數字;高32位是個epoch(時期,紀元,世,新時代)值,表示leader選舉周期,每進行一次leader選舉,該數字就會+1;后32位用來表示遞增計數,當產生新的提議時,會依據數據庫的兩階段提交過程,首先會像其它節點發送執行請求,如果超過半數以上的機器正確執行,那么該事務就可以被執行
18、分布式集群中為什么會有Master節點?
1、因為在分布式環境中,某些場景下你只需要計算一次,所有的節點都可以共享這個結果,避免重復計算,減少性能開銷,所以就有了Master節點
19、zookeeper節點宕機了怎么辦?
1、因為zookeeper本身也是一個集群,並且推薦配置集群機器不少於3台
2、如果低於三台,掛了一台(無論是leader還是follower節點),集群都不能正常工作
3、如果集群機器>=3台,如果掛的是follower節點,不影響集群正常工作,如果掛的是leader節點,需要重新選舉leader節點,選舉完成之后還能正常工作
20、zookeeper負載均衡和nginx負載均衡的區別?
1、zookeeper的負載均衡可以調控,nginx的負載均衡只能調權重,其它可調控的方面都需要自己手寫
2、但是nginx的吞吐量遠大於zookeeper,所以要根據不同的場景選擇合適的負載均衡方案
21、zookeeper有哪幾種部署模式?
1、單機
2、偽集群
3、集群
22、zookeeper集群至少需要幾台機器?集群規則是怎樣的?
1、至少需要3態機器
2、規則是:2n+1(n>0的整數)
23、zookeeper集群支持動態添加機器嗎?
1、動態添加機器說白了就是水平擴容,動態添加機器有以下兩種方案
2、全部重啟:先把集群中所有的服務都關掉,修改完配置之后再全部重啟,不影響之前客戶端的會話
3、逐個重啟:因為zookeeper集群只要有半數以上的機器存活時,集群就能對外提供服務,因此我們可以逐個關閉機器,然后修改配置再重啟
24、zookeeper集群的Watcher監聽是永久的嗎?為什么?
1、不是永久的(一次性的)
2、因為一旦是永久的話,服務端的每次更改數據都會發送一個消息通知給客戶端,這對於網絡開銷和服務器端的壓力都是非常大的,而且我們一般都是需要最新的一次數據,不需要每次變更數據的結果,所以zookeeper在Watcher監聽這一塊設置一次性的,一旦觸發了Watcher,監聽就會被移除,下次想觸發還需要重新注冊
25、zookeeper的java客戶端有哪些?
1、zookeeper自帶的zkClient
2、apache開源的Curator
26、chubby是什么?與zookeeper比你怎么看?
1、chubby是google的一個完全采用Paxos算法的項目,不開源
2、zookeeper可以說是chubby開源的版本,采用ZAB協議,開源
27、說幾個zookeeper常用的命令?
1、set /liulong 123
2、get /liulong
3、ls /
4、update /liulong 456
5、delete /liulong
6、stat /liulong
28、ZAB協議和Paxos算法的聯系(相同點和不同點)?
1、相同點:
a、都有一個leader進程,並且該leader進程負責調控lollower進程的運行
b、leader節點都需要經過半數以上的follower節點作出正確的反饋后,才會將一個提議提交
c、在ZAB中每個提議都有一個epoll值,在Paxos中稱為Ballot
2、不同點:
a、ZAB采用AP,用來構建高可用分布式主備系統;Paxos采用CP,用來構建分布式一致性狀態機系統
29、Zookeeper的典型應用場景有哪些?
1、消息發布與訂閱 -->發布者發送消息供訂閱者消費消息
2、命令服務 -->采用全局路徑,每個路徑對應一個名稱用來指定相應的服務
3、master選舉
4、集群管理
5、負載均衡
6、分布式鎖 -->兩種(保持獨占/控制時序)
保持獨占:每個znode都可以看作一把鎖,在createZnode的時候,每個客戶端都去創建/distribute_lock,最終創建成功的那個客戶端就擁有了這把鎖,用完之后刪除/distribute_lock即可
控制時序:在/distribute_lock下面創建臨時順序節點,編號最小的擁有這把鎖,用完刪除
7、分布式隊列: -->兩種(同步隊列/FIFO隊列)
同步隊列:當一個隊列的所有成員都聚集時,這個隊列才可用;只需要在約定目錄下創建一個Watcher監聽,當達到指定數量時,就觸發Watcher通知機制
FIFO隊列:與分布式鎖差不多,入隊時有編號,出隊時按編號依次出隊