1: zookeeper 是什么
是一個針對大型分布式系統(tǒng)的可靠協(xié)調(diào)系統(tǒng);
提供的功能包括:配置維護朋鞍、名字服務(wù)队橙、分布式同步、組服務(wù)等连躏;
zookeeper已經(jīng)成為Hadoop生態(tài)系統(tǒng)中的基礎(chǔ)組件剩岳。
2: zookeeper 特點
最終一致性:為客戶端展示同一視圖,這是Zookeeper最重要的性能入热;
可靠性:如果消息被一臺服務(wù)器接受拍棕,那么它將被所有的服務(wù)器接受;
原子性:更新只能成功或失敗勺良,沒有中間狀態(tài)绰播;
3: ?zookeeper都能做什么
?3.1?統(tǒng)一命名服務(wù)
背景:在我們的應(yīng)用中也會存在很多這類問題,特別是在我們的服務(wù)特別多的時候尚困,如果我們在本地保存服務(wù)的地址的時候?qū)⒎浅2环奖愦缆幔侨绻覀冎恍枰L問一個大家都熟知的訪問點,這里提供統(tǒng)一的入口事甜,那么維護起來將方便得多了谬泌。
我們可以在概括為以下幾點場景:
1)分布式環(huán)境下,經(jīng)常需要對應(yīng)用/服務(wù)進行統(tǒng)一命名逻谦,便于識別不同的服務(wù)
類似于域名與ip之間對應(yīng)關(guān)系掌实,域名容易記住邦马;
通過名稱來獲取資源或服務(wù)的地址贱鼻,提供者信息。
2) 按照層次結(jié)構(gòu)組織服務(wù)/應(yīng)用名稱
解決方案: 采用zookeeper
可將服務(wù)名稱以及地址信息寫在Zookeeper上滋将,客戶端通過Zookeeper獲取可用服務(wù)列表邻悬。
3.2 配置管理
背景:如果我們配置非常多,有很多服務(wù)器都需要這個配置随闽,而且還可能是動態(tài)的話使用配置文件就不是個好主意了父丰。這個時候往往需要尋找一種集中管理配置的方法,我們在這個集中的地方修改了配置橱脸,所有對這個配置感興趣的都可以獲得變更础米。
我們可以用一個集群來提供這個配置服務(wù),但是用集群提升可靠性添诉,那如何保證配置在集群中的一致性呢屁桑? 這個時候就需要使用一種實現(xiàn)了一致性協(xié)議的服務(wù)了。Zookeeper就是這種服務(wù)栏赴。
解決方案:采用zookeeper
原因如下:
1) 配置管理可交由Zookeeper實現(xiàn)
2) 可將配置信息寫入Zookeeper的一個znode上蘑斧;
3) ?各個節(jié)點監(jiān)聽這個znode
?4) 一旦znode中的數(shù)據(jù)被修改,Zookeeper將會通知各個節(jié)點须眷。
3.3 分布式鎖
背景: 在一個分布式環(huán)境中竖瘾,為了提高可靠性,我們的集群的每臺服務(wù)器上都部署著同樣的服務(wù)花颗。但是捕传,一件事情如果集群中的每個服務(wù)器都進行的話,那相互之間就要協(xié)調(diào)扩劝,編程起來將非常復(fù)雜。而如果我們只讓一個服務(wù)進行操作棒呛,那又存在單點聂示。通常還有一種做法就是使用分布式鎖,在某個時刻只讓一個服務(wù)去干活簇秒,當(dāng)這臺服務(wù)出問題的時候鎖釋放鱼喉,立即fail over到另外的服務(wù)
解決方案: 采用zookeeper
原因如下:
(1)Zookeeper是強一致性的
多個客戶端同時在Zookeeper上創(chuàng)建相同znode,只有一個創(chuàng)建成功趋观。
(2)實現(xiàn)鎖的獨占性
?多個客戶端同時在Zookeeper上創(chuàng)建相同znode扛禽,創(chuàng)建成功的那個客戶端得到鎖,其他客 ?戶端等待拆内。
(3)控制鎖的時序
各個客戶端在某個znode下創(chuàng)建臨時znode(類型為CreateMode.EPHEMERAL_SEQUENTIAL)旋圆,這樣,該znode可掌握全局訪問時序麸恍。
3.4 集群管理
背景:在分布式的集群中灵巧,經(jīng)常會由于各種原因,比如硬件故障抹沪,軟件故障刻肄,網(wǎng)絡(luò)問題,有些節(jié)點會進進出出融欧。有新的節(jié)點加入進來敏弃,也有老的節(jié)點退出集群。這個時候噪馏,集群中其他機器需要感知到這種變化麦到,然后根據(jù)這種變化做出對應(yīng)的決策绿饵。比如我們是一個分布式存儲系統(tǒng),有一個中央控制節(jié)點負(fù)責(zé)存儲的分配瓶颠,當(dāng)有新的存儲進來的時候我們要根據(jù)現(xiàn)在集群目前的狀態(tài)來分配存儲節(jié)點拟赊。這個時候我們就需要動態(tài)感知到集群目前的狀態(tài)
解決方案: 采用zookeeper
原因如下:
1)分布式環(huán)境下,實時掌握每個節(jié)點的狀態(tài)是必要的
可根據(jù)節(jié)點實時狀態(tài)做出一些調(diào)整粹淋。
2)可交由Zookeeper實現(xiàn)
可將節(jié)點信息寫入Zookeeper的一個znode上吸祟;
監(jiān)聽這個znode可獲得它的實時狀態(tài)變化。
3)典型應(yīng)用
HBase中Master狀態(tài)的監(jiān)控與選舉桃移。
3.5 分布式通知/協(xié)調(diào)
原理其實就是發(fā)布/訂閱屋匕。
1)分布式環(huán)境下經(jīng)常存在一個服務(wù)需要知道它所管理的子服務(wù)的狀態(tài)
NameNode需要知道各DataNode的狀態(tài)
2)心跳檢測機制可通過Zookeeper實現(xiàn)
3)信息推送可由Zookeeper實現(xiàn)(發(fā)布/訂閱模式)
4: ? 配置zookeeper集群過程
? ? ? ?1) ??tar zxf zookeeper-3.4.6.tar.gz
? ? ? ?2) ?cd zookeeper-3.4.6
? ? ? ?3)?mkdir -p dataDir ? //創(chuàng)建快照日志存放目錄
? ? ? ?4)?mkdir dataLogDir ?//創(chuàng)建事務(wù)日志存放目錄
? ? ? ?5)?cd conf
? ? ? ?6)?mv zoo_sample.cfg zoo.cfg
? ? ? ?7) ?vim zoo.cfg
添加如下內(nèi)容:
? ? ? ? ? ?dataDir=/usr/local/zookeeper-3.4.6/dataDir
? ? ? ? ? ?dataLogDir=/usr/local/zookeeper-3.4.6/dataLogDir
? ? ? ? ? ??server.1=console:2888:3888
? ? ? ? ? ? server.2=log1:2888:3888
? ? ? ? ? ? server.3=log2:2888:3888
? ? ? 8) ?在我們配置的dataDir指定的目錄下面,創(chuàng)建一個myid文件借杰,里面內(nèi)容為一個數(shù)字过吻,用來標(biāo)識當(dāng)前主機,conf/zoo.cfg文件中配置的server.X中X為什么數(shù)字蔗衡,則myid文件中就輸入這個數(shù)字
? ? 9)?遠(yuǎn)程復(fù)制第一臺的zk到另外兩臺上疮装,并修改myid文件為2和3
? ? ? ? ?scp -rp zookeeper-3.4.6 root@114.55.29.86:/usr/local/
? ? ? ? ?scp -rp zookeeper-3.4.6 root@114.55.29.241:/usr/local/
? ? 10) 啟動和關(guān)閉zk
? ? ? ? ? ?./zkServer.sh start?
? ? ? ? ? ?./zkServer.sh stop
? ? ? ? ? ?./zkServer.sh status
5: ? zookeeper 中幾個重要配置
tickTime: zookeeper中使用的基本時間單位, 毫秒值.
dataDir: 數(shù)據(jù)目錄. 可以是任意目錄.
dataLogDir: log目錄, 同樣可以是任意目錄. 如果沒有設(shè)置該參數(shù), 將使用和dataDir相同的設(shè)置.
clientPort: 監(jiān)聽client連接的端口號.
dataDir和 dataLogDir有什么區(qū)別:dataDir用來存儲ZKDatabase的快照文件(Snapshot File);而dataLogDir用來存儲對ZKDatabase所做操作的操作日志文件(Transaction Log File)粘都,如果不配置dataLogDir廓推,則dataLogDir=dataDir。
6: ? zookeeper應(yīng)用到的系統(tǒng)
HDFS ? ?YARN ? Storm ? HBase ? Flume ? Dubbo ? metaq
參考資料:
1)?http://blog.chinaunix.net/uid-29792372-id-5785351.html
2)?https://www.cnblogs.com/yuyijq/p/3424473.html