1.談一談你對(duì)zookeep的認(rèn)識(shí)?
分布式環(huán)境下,數(shù)據(jù)通過網(wǎng)絡(luò)傳輸,數(shù)據(jù)的修改和增加需要各個(gè)集群節(jié)點(diǎn)同步;
Zookeeper就能夠做到,它是解決數(shù)據(jù)一致性工具,它能夠在分布式環(huán)境下協(xié)調(diào)各數(shù)據(jù)資源,保證數(shù)據(jù)的一致性,可靠性。它能夠保證同一個(gè)客戶端的請(qǐng)求在zookeeper集群中是按照順序操作,而且是原子性操作;并且無(wú)論連接那個(gè)客戶端看到的數(shù)據(jù)都是一致的。
它是怎么做到的?
這就涉及到Zookeeper的ZAB協(xié)議、選舉機(jī)制、數(shù)據(jù)模型、底層算法等
2.ZAB協(xié)議(原子消息廣播協(xié)議)?
Zookeeper依賴zab協(xié)議來實(shí)現(xiàn)分布式數(shù)據(jù)一致性,基于該協(xié)議,zookeeper實(shí)現(xiàn)了一種主備模式的系統(tǒng)架構(gòu),使用Zab協(xié)議作為數(shù)據(jù)一致性的算法;
Zab協(xié)議:
是在Paxos算法的基礎(chǔ)上改造而來的,支持崩潰恢復(fù)機(jī)制,Zookeeper使用單一的主進(jìn)程leader,處理客戶端所有的請(qǐng)求事物,zab協(xié)議保證Leader廣播的變更序列被順序的處理:一個(gè)狀態(tài)被處理,那么它所依賴的狀態(tài)也一定被處理;Zab支持崩潰恢復(fù),保證leader進(jìn)程崩潰的時(shí)候可以重新選舉出新的leader來管理數(shù)據(jù),保證數(shù)據(jù)的完整性一致性。
這就涉及到zookeeper的過半選舉機(jī)制?
3.Zookeeper的選舉機(jī)制?
Zookeeper中采用“過半選舉”實(shí)現(xiàn)數(shù)據(jù)的一致性,可靠性。
1)同步機(jī)制
在zookeeper中所有的事物請(qǐng)求都由一個(gè)主服務(wù)器(leader)處理,Leader將客戶端的請(qǐng)求轉(zhuǎn)換為一個(gè)事物,分發(fā)給所有的follower;同時(shí)leader按照請(qǐng)求更改自己的數(shù)據(jù),follower按照l(shuí)eader給他們維護(hù)的編號(hào)順序同步Leader中的數(shù)據(jù)。
Leader等待follower反饋,將反饋結(jié)果標(biāo)記在“同步列表”中,當(dāng)有超過半數(shù)的follower反饋“同步完成”,leader再次向集群內(nèi)的follower廣播commint,向客戶端反饋“同步成功”; leader的責(zé)任(讀+寫+廣播),follower責(zé)任(讀+同步+反饋);
總結(jié):“同步機(jī)制-&兩次廣播,兩次反饋”
2)啟動(dòng)選舉機(jī)制
Zab協(xié)議存在三種狀態(tài),Looking、Following、Leading。
Zookeeper啟動(dòng)的時(shí)候所有的節(jié)點(diǎn)都處于looking狀態(tài),這時(shí)集群會(huì)相互發(fā)送id嘗試選舉出一個(gè)Leader,只要其中一個(gè)Looking票數(shù)過半,選舉成功,它將狀態(tài)切換為L(zhǎng)eading狀態(tài),其它的Looking切換為following狀態(tài);
如果選舉不成功,重新選,直到選舉出leader為止,我們可以在配置文件中設(shè)置重新選舉的時(shí)間,第一次集群?jiǎn)?dòng),重新選舉并不影響集群工作。默認(rèn)情況下,按照節(jié)點(diǎn)號(hào),選除1外的第一個(gè)基數(shù)節(jié)點(diǎn)當(dāng)leader。
總結(jié):“所有following都有機(jī)會(huì),過半則成,不成在選,有默認(rèn)”
3)Leader宕機(jī)選舉機(jī)制!
當(dāng)leader宕機(jī)后,集群中的每一個(gè)Follower都想當(dāng)Leader,它們都有機(jī)會(huì),又都沒有機(jī)會(huì)。
所有的follower會(huì)相互發(fā)送ZXID,對(duì)比ZXID,選擇攜帶數(shù)據(jù)最新的follower當(dāng)leader;
具體流程:
每個(gè)follower都會(huì)攜帶(ZXID)向其它節(jié)點(diǎn)發(fā)送請(qǐng)求,選自己為leader的vote,等待回復(fù);
Follower接收到的ZXID比自己新,更新自己的vote為持有數(shù)據(jù)最新的follower的選票,否則拒絕;
每個(gè)follower中維護(hù)著一個(gè)投票記錄表,不斷的更新自己的選票,當(dāng)某個(gè)節(jié)點(diǎn)的選票過半,該節(jié)點(diǎn)晉升為leader,選舉結(jié)束。
所有的follower跟著新的leader同步,舊eader重啟后變?yōu)閒ollower,和新leader同步。
總結(jié):“選最新”
4)Follower宕機(jī)選舉
follower和Leader之間通過“心跳檢測(cè)”來感知對(duì)方存在狀態(tài),follower每隔一段時(shí)間向follower發(fā)送心跳報(bào)告,證明自己還活著。心跳機(jī)制通過RPC的一個(gè)接口類的一個(gè)方法來發(fā); 當(dāng)有過半的follower的沒有發(fā)送心跳報(bào)告,Leader切換到Looking狀態(tài),活著的follower也隨之切換到Looking狀態(tài),集群停止工作,開始新一輪的選舉。
4.Zookeeper的數(shù)據(jù)模型是什么?
采用znode(節(jié)點(diǎn)樹)來保存數(shù)據(jù),znode內(nèi)部可以保存數(shù)據(jù),還可以掛載0至多個(gè)znode;
每一個(gè)節(jié)點(diǎn)都有唯一性,可以用來做統(tǒng)一的命名服務(wù),其數(shù)據(jù)保存在內(nèi)存中; Znode可以分為臨時(shí)的,持久的,普通的,順序的;
因此,它4種存儲(chǔ)類型:普通臨時(shí),普通持久,順序臨時(shí),順序持久
創(chuàng)建節(jié)點(diǎn)的指令:
臨時(shí)節(jié)點(diǎn)客戶端斷開后,節(jié)點(diǎn)刪除;
5.Zookeeper的特點(diǎn):
順序一致性,原子性,單一視圖,可靠性,偽實(shí)時(shí)性。
6.分布式環(huán)境下數(shù)據(jù)一致性算法?
2PC算法:
所有的參與者都成功事物才成功,原子性操作。
缺點(diǎn):同步阻塞,單點(diǎn)故障,鬧裂(一個(gè)集群中出現(xiàn)兩個(gè)以上leader),太保守。
Paxos算法:
拜占庭將軍問題-> 三支相隔遙遠(yuǎn)的軍隊(duì)一起打某個(gè)國(guó)家,分布式環(huán)境下達(dá)成協(xié)議, 信使傳遞消息,信使被收買怎么辦? 信道不可靠解決不了這個(gè)問題。
Paxos算法采用過半機(jī)制,一半通過則協(xié)議達(dá)成,還支持角色替換,但是會(huì)產(chǎn)生活鎖的問題,兩個(gè)人一直讓不開的問題。
ZAB算法: 在Paxos的基礎(chǔ)上改進(jìn),支持崩潰恢復(fù),就是選舉產(chǎn)生活鎖的時(shí)候,集群停止工作,重新選舉。
7.看圖說話
8.Zookeeper的事物操作 ?
事物Zxid全局唯一,遞增,zxid越大,事物越新,在選舉的時(shí)候,可以用到。 選舉id: 置文件中配置,事物Zxid選舉不出來,用選舉ID;
9.補(bǔ)充:
心跳機(jī)制時(shí)間,默認(rèn)10秒,可以調(diào)整,集群環(huán)境不好,可以調(diào)整 原子廣播端口:2888;選舉端口自己配置:3888; 配置觀察者模式指定觀察者
10.圖解——Zookeeper的選舉 ?
原子廣播:選舉 和 寫入操作時(shí)影響性能;
Observe觀察者,服從投票結(jié)果,不參與投票,能提供性能。 例如:阿里Observe的應(yīng)用,杭州leader和flower,每個(gè)和青島observer
提供一個(gè)教材給大家學(xué)習(xí)
https://www.yiibai.com/zookeeper/zookeeper_api.html
更多建議: