zookeeper是松散耦合的分布式系統(tǒng)中粗粒度鎖以及可靠性存儲的系統(tǒng),具有保管數(shù)據(jù)、提供監(jiān)聽等功能,存儲的容量不高,具有開源、高效的、可協(xié)同工作的特點,其數(shù)據(jù)模型具有命名空間、與標(biāo)準(zhǔn)文件系統(tǒng)相似、以/為間隔的路徑名序列組成、只有絕對路徑;每個節(jié)點自身的信息包含了數(shù)據(jù)、數(shù)據(jù)長度、創(chuàng)建時間、修改時間等信息,具有文件,路徑雙重特點。
zookeeper的三種節(jié)點:永久性節(jié)點、臨時節(jié)點、順序節(jié)點。
永久節(jié)點(persistent nodes):除非client顯示刪除,否則一直存在,create? 默認創(chuàng)建
臨時節(jié)點(ephemeral nodes):僅在創(chuàng)建該節(jié)點client保持連接期間有效,一旦連接丟失,zookeeper會自動刪除該節(jié)點 ,create -e
順序節(jié)點(sequence nodes):client在創(chuàng)建該節(jié)點時,zookeeper會自動在節(jié)點路徑末尾添加遞增序號,這種類型是實現(xiàn)分布式鎖、分布式queue(隊列)等特殊功能的關(guān)鍵。臨時順序節(jié)點【create -s -e】? ? ? or? ? ? 臨時永久節(jié)點【create -s】
watch機制:客戶端會被動收到通知和請求,節(jié)點被刪或者修改信息會被推送到client。
一、zookeeper的應(yīng)用場景:1.服務(wù)器啟動的時候向zookeeper進行注冊;2.客戶端從zookeeper查詢訪問的是哪臺服務(wù)器;3.按照zookeeper給定的服務(wù)器進行訪問。
二、zookeeper實現(xiàn)高可用,選NN(namenode)
當(dāng)client想要去HDFS拿文件的時候(Hadoop fs -cat等操作),zookeeper創(chuàng)建臨時順序節(jié)點,zookeeper會選擇一個節(jié)點作為active節(jié)點,其他節(jié)點是standby狀態(tài),假設(shè)目前active掛掉,standby節(jié)點立刻接手成為新的active節(jié)點,原先的active節(jié)點重啟回來之后成為standby節(jié)點,在zookeeper中,它的命名為/nn00003,之后假如新的active節(jié)點掛掉,新的standby節(jié)點再次變?yōu)閍ctive,再次循環(huán)上一個步驟。
zookeeper有個特性:集群中只要有過半的機器是正常工作的,那么整個集群對外就是可用的。也就是說如果有2個zookeeper節(jié)點,那么只要有1個死了zookeeper就不能用了,因為1沒有過半,所以2個zookeeper節(jié)點的死亡容忍度為0;同理,要是有3個zookeeper節(jié)點,一個死了,還剩下2個正常的,過半了,所以3個zookeeper的容忍度為1;同理你多列舉幾個:2->0;3->1;4->1;5->2;6->2會發(fā)現(xiàn)一個規(guī)律,2n和2n-1的容忍度是一樣的,都是n-1,所以為了更加高效,何必增加那一個不必要的zookeeper呢。所以節(jié)點數(shù)是單數(shù),另外在選主中,被選的新節(jié)點按照命名最小的來做主,命名按照順序命名,例如:001、002、003、004...? ?被重新激活的節(jié)點不會再次被命名為小的數(shù)字。
三、配置管理
server作為跑任務(wù)的主體,它們的配置有時候需要修改,但是一臺臺去修改會很麻煩,這個時候用zookeeper來監(jiān)聽他們的配置,一旦他們的配置信息有變動,變動的消息會立刻被推送到zookeeper中,屆時可以及時做出修改。
zookeeper查看offset:
1、consumer指定groupid:
./bin/kafka-console-consumer.sh --zookeeper master:2181 --topic badou --consumer-property group.id=group_test --from-beginning
2、查看consumer的offset和具體數(shù)據(jù)堆積情況:
./kafka-consumer-offset-checker.sh --zookeeper master:2181 --topic badou --group group_test --broker-info
3、zookeeper查看中的consumers:
ls /consumers
4、zookeeper查看offset:
get /consumers/group_test/offsets/badou/0