目錄
一.Zookeeper概述:
????1.1 概述:
????1.2 特點(diǎn):
????1.3數(shù)據(jù)結(jié)構(gòu)
????1.4 應(yīng)用場(chǎng)景:
二 Zookeeper安裝
????2.1 本地模式安裝部署
????2.2 配置參數(shù)解讀
三 Zookeeper內(nèi)部原理
????3.1 選舉機(jī)制
????3.2 節(jié)點(diǎn)類型
????3.3 stat結(jié)構(gòu)體
????3.4 監(jiān)聽(tīng)器原理
????3.5 寫數(shù)據(jù)流程
四 Zookeeper實(shí)戰(zhàn)
????4.1 分布式安裝部署
????4.2 客戶端命令行操作
一.Zookeeper概述:
1.1 概述:
????Zookeeper是一個(gè)開(kāi)源的分布式的毛肋,為分布式應(yīng)用提供協(xié)調(diào)服務(wù)的Apache項(xiàng)目府适。Hadoop和Hbase的重要組件方灾。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)壶辜、域名服務(wù)捂寿、分布式同步龙优、組服務(wù)等。
1.2 特點(diǎn):
(1)Zookeeper:一個(gè)領(lǐng)導(dǎo)者(leader)怎顾,多個(gè)跟隨者(follower)組成的集群。
(2)Leader負(fù)責(zé)進(jìn)行投票的發(fā)起和決議教翩,更新系統(tǒng)狀態(tài)杆勇。
(3)Follower用于接收客戶請(qǐng)求并向客戶端返回結(jié)果,在選舉Leader過(guò)程中參與投票饱亿。
(4)集群中奇數(shù)臺(tái)服務(wù)器只要有半數(shù)以上節(jié)點(diǎn)存活蚜退,Zookeeper集群就能正常服務(wù)。
(5)全局?jǐn)?shù)據(jù)一致:每個(gè)server保存一份相同的數(shù)據(jù)副本彪笼,client無(wú)論連接到哪個(gè)server钻注,數(shù)據(jù)都是一致的。
(6)更新請(qǐng)求順序進(jìn)行配猫,來(lái)自同一個(gè)client的更新請(qǐng)求按其發(fā)送順序依次執(zhí)行幅恋。
(7)數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功泵肄,要么失敗捆交。
(8)實(shí)時(shí)性,在一定時(shí)間范圍內(nèi)腐巢,client能讀到最新數(shù)據(jù)品追。
1.3數(shù)據(jù)結(jié)構(gòu):
????ZooKeeper數(shù)據(jù)模型的結(jié)構(gòu)與Unix文件系統(tǒng)很類似,整體上可以看作是一棵樹(shù)冯丙,每個(gè)節(jié)點(diǎn)稱做一個(gè)ZNode肉瓦。每一個(gè)ZNode默認(rèn)能夠存儲(chǔ)1MB的元數(shù)據(jù),每個(gè)ZNode都可以通過(guò)其路徑唯一標(biāo)識(shí)
1.4 應(yīng)用場(chǎng)景:
1.4.1統(tǒng)一命名服務(wù)
1.4.2 統(tǒng)一配置管理
1.分布式環(huán)境下,配置文件管理和同步是一個(gè)常見(jiàn)問(wèn)題
(1)一個(gè)集群中泞莉,所有節(jié)點(diǎn)的配置信息是一致的哪雕,比如hadoop集群
(2)對(duì)配置文件修改后,希望能夠快速同步到各個(gè)節(jié)點(diǎn)上
2.配置管理可交由ZK實(shí)現(xiàn)
(1)可配置信息寫入ZK上的一個(gè)Znode
(2)各個(gè)節(jié)點(diǎn)監(jiān)聽(tīng)這個(gè)ZNode
(3)一旦Znode中的數(shù)據(jù)被修改鲫趁,ZK將通知各個(gè)節(jié)點(diǎn)
1.4.3統(tǒng)一集群管理
集群管理結(jié)構(gòu)圖如下所示斯嚎。
1.分布式環(huán)境中,實(shí)時(shí)掌握每個(gè)節(jié)點(diǎn)的狀態(tài)是必要的饮寞。
(1)可根據(jù)節(jié)點(diǎn)實(shí)時(shí)做出一些調(diào)整
2.可交由Zk實(shí)現(xiàn)
(1)可將節(jié)點(diǎn)信息寫入ZK上的一個(gè)ZNode
(2)監(jiān)聽(tīng)這個(gè)Znode可獲取它的實(shí)時(shí)狀態(tài)變化
3.典型應(yīng)用
(1)HBase中Master狀態(tài)監(jiān)控與選舉
1.4.4 服務(wù)器節(jié)點(diǎn)動(dòng)態(tài)上下線
1.4.5 軟負(fù)載均衡
二 Zookeeper安裝
2.1 本地模式安裝部署
1.安裝前準(zhǔn)備:
(1)安裝jdk
(2)上傳zookeeper到linux系統(tǒng)下
(3)解壓到指定目錄
tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
(4)配置環(huán)境變量
輸入命令:
vi /etc/profile
添加內(nèi)容:
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin
2.配置修改
(1)將/opt/module/zookeeper-3.4.10/conf這個(gè)路徑下的zoo_sample.cfg修改為zoo.cfg孝扛;
mv zoo_sample.cfg zoo.cfg
(2)進(jìn)入zoo.cfg文件:
vim zoo.cfg
(3)修改dataDir路徑為
dataDir=/opt/module/zookeeper-3.4.10/zkData
(4)在/opt/module/zookeeper-3.4.10/這個(gè)目錄上創(chuàng)建zkData文件夾
cd /opt/module/zookeeper-3.4.10
mkdir zkData
3.操作zookeeper
(1)啟動(dòng)zookeeper
bin/zkServer.sh start
(2)查看進(jìn)程是否啟動(dòng)
jps
(3)查看狀態(tài):
bin/zkServer.sh status
(4)啟動(dòng)客戶端:
bin/zkCli.sh
(5)退出客戶端:
quit
(6)停止zookeeper
bin/zkServer.sh stop
2.2 配置參數(shù)解讀
????解讀zoo.cfg文件中參數(shù)含義
(1)tickTime=2000:通信心跳數(shù),Zookeeper服務(wù)器心跳時(shí)間幽崩,單位毫秒
????Zookeeper使用的基本時(shí)間苦始,服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時(shí)間間隔,也就是每個(gè)tickTime時(shí)間就會(huì)發(fā)送一個(gè)心跳慌申,時(shí)間單位為毫秒陌选。
它用于心跳機(jī)制,并且設(shè)置最小的session超時(shí)時(shí)間為兩倍心跳時(shí)間蹄溉。(session的最小超時(shí)時(shí)間是2*tickTime)
(2)initLimit=10:Leader和Follower初始通信時(shí)限
????集群中的follower跟隨者服務(wù)器與leader領(lǐng)導(dǎo)者服務(wù)器之間初始連接時(shí)能容忍的最多心跳數(shù)(tickTime的數(shù)量)咨油,用它來(lái)限定集群中的Zookeeper服務(wù)器連接到Leader的時(shí)限。
投票選舉新leader的初始化時(shí)間
????Follower在啟動(dòng)過(guò)程中柒爵,會(huì)從Leader同步所有最新數(shù)據(jù)役电,然后確定自己能夠?qū)ν夥?wù)的起始狀態(tài)。
????Leader允許Follower在initLimit時(shí)間內(nèi)完成這個(gè)工作棉胀。
(3)syncLimit=5:Leader和Follower同步通信時(shí)限
????集群中Leader與Follower之間的最大響應(yīng)時(shí)間單位法瑟,假如響應(yīng)超過(guò)syncLimit * tickTime,Leader認(rèn)為Follwer死掉唁奢,從服務(wù)器列表中刪除Follwer霎挟。
????在運(yùn)行過(guò)程中,Leader負(fù)責(zé)與ZK集群中所有機(jī)器進(jìn)行通信麻掸,例如通過(guò)一些心跳檢測(cè)機(jī)制酥夭,來(lái)檢測(cè)機(jī)器的存活狀態(tài)。
????如果L發(fā)出心跳包在syncLimit之后脊奋,還沒(méi)有從F那收到響應(yīng)熬北,那么就認(rèn)為這個(gè)F已經(jīng)不在線了。
(4)dataDir:數(shù)據(jù)文件目錄+數(shù)據(jù)持久化路徑
????保存內(nèi)存數(shù)據(jù)庫(kù)快照信息的位置诚隙,如果沒(méi)有其他說(shuō)明讶隐,更新的事務(wù)日志也保存到數(shù)據(jù)庫(kù)。
(5)clientPort=2181:客戶端連接端口
????監(jiān)聽(tīng)客戶端連接的端口
三 Zookeeper內(nèi)部原理
3.1 選舉機(jī)制
Server ID: myid(權(quán)重越大)
Zxid:數(shù)據(jù)ID(先一數(shù)據(jù)低進(jìn)行選擇)
1.半數(shù)機(jī)制(Paxos 協(xié)議):
????集群中半數(shù)以上機(jī)器存活最楷,集群可用整份。所以zookeeper適合裝在奇數(shù)臺(tái)機(jī)器上。
2.Zookeeper雖然在配置文件中并沒(méi)有指定master和slave籽孙。
????但是烈评,zookeeper工作時(shí),是有一個(gè)節(jié)點(diǎn)為leader犯建,其他則為follower讲冠,Leader是通過(guò)內(nèi)部的選舉機(jī)制臨時(shí)產(chǎn)生的。
3.以一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明整個(gè)選舉的過(guò)程适瓦。
????假設(shè)有五臺(tái)服務(wù)器組成的zookeeper集群竿开,它們的id從1-5,同時(shí)它們都是最新啟動(dòng)的玻熙,也就是沒(méi)有歷史數(shù)據(jù)否彩,在存放數(shù)據(jù)量這一點(diǎn)上,都是一樣的嗦随。假設(shè)這些服務(wù)器依序啟動(dòng)列荔,來(lái)看看會(huì)發(fā)生什么。
- (1)服務(wù)器1啟動(dòng)枚尼,此時(shí)只有它一臺(tái)服務(wù)器啟動(dòng)了贴浙,它發(fā)出去的報(bào)沒(méi)有任何響應(yīng),所以它的選舉狀態(tài)一直是LOOKING狀態(tài)署恍。
- (2)服務(wù)器2啟動(dòng)崎溃,它與最開(kāi)始啟動(dòng)的服務(wù)器1進(jìn)行通信,互相交換自己的選舉結(jié)果盯质,由于兩者都沒(méi)有歷史數(shù)據(jù)袁串,所以id值較大的服務(wù)器2勝出,但是由于沒(méi)有達(dá)到超過(guò)半數(shù)以上的服務(wù)器都同意選舉它(這個(gè)例子中的半數(shù)以上是3)唤殴,所以服務(wù)器1般婆、2還是繼續(xù)保持LOOKING狀態(tài)。
- (3)服務(wù)器3啟動(dòng)朵逝,根據(jù)前面的理論分析蔚袍,服務(wù)器3成為服務(wù)器1、2配名、3中的老大啤咽,而與上面不同的是,此時(shí)有三臺(tái)服務(wù)器選舉了它渠脉,所以它成為了這次選舉的leader宇整。
- (4)服務(wù)器4啟動(dòng),根據(jù)前面的分析芋膘,理論上服務(wù)器4應(yīng)該是服務(wù)器1鳞青、2霸饲、3、4中最大的臂拓,但是由于前面已經(jīng)有半數(shù)以上的服務(wù)器選舉了服務(wù)器3厚脉,所以它只能接收當(dāng)小弟的命了。
- (5)服務(wù)器5啟動(dòng)胶惰,同4一樣當(dāng)小弟傻工。
3.2 節(jié)點(diǎn)類型
1.Znode有兩種類型:
- 短暫(ephemeral):客戶端和服務(wù)器端斷開(kāi)連接后,創(chuàng)建的節(jié)點(diǎn)自己刪除
- 持久(persistent):客戶端和服務(wù)器端斷開(kāi)連接后孵滞,創(chuàng)建的節(jié)點(diǎn)不刪除
2.Znode有四種形式的目錄節(jié)點(diǎn)(默認(rèn)是persistent )
(1)持久化目錄節(jié)點(diǎn)(PERSISTENT)(小寫:persistent)
????客戶端與zookeeper斷開(kāi)連接后中捆,該節(jié)點(diǎn)依舊存在。
(2)持久化順序編號(hào)目錄節(jié)點(diǎn)(PERSISTENT_SEQUENTIAL)(小寫:persistent_sequential)
????客戶端與zookeeper斷開(kāi)連接后坊饶,該節(jié)點(diǎn)依舊存在泄伪,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào)。
(3)臨時(shí)目錄節(jié)點(diǎn)(EPHEMERAL)(ephemeral)
????客戶端與zookeeper斷開(kāi)連接后匿级,該節(jié)點(diǎn)被刪除臂容。
(4)臨時(shí)順序編號(hào)目錄節(jié)點(diǎn)(EPHEMERAL_SEQUENTIAL)(ephemeral_sequential)
????客戶端與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)被刪除根蟹,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào)脓杉。
3.創(chuàng)建znode時(shí)設(shè)置順序標(biāo)識(shí),znode名稱后會(huì)附加一個(gè)值简逮,順序號(hào)是一個(gè)單調(diào)遞增的計(jì)數(shù)器球散,由父節(jié)點(diǎn)維護(hù)
4.在分布式系統(tǒng)中,順序號(hào)可以被用于為所有的事件進(jìn)行全局排序散庶,這樣客戶端可以通過(guò)順序號(hào)推斷事件的順序
3.3 stat結(jié)構(gòu)體
1.czxid- 引起這個(gè)znode創(chuàng)建的zxid蕉堰,創(chuàng)建節(jié)點(diǎn)的事務(wù)的zxid
????每次修改ZooKeeper狀態(tài)都會(huì)收到一個(gè)zxid形式的時(shí)間戳,也就是ZooKeeper事務(wù)ID悲龟。
????事務(wù)ID是ZooKeeper中所有修改總的次序屋讶。每個(gè)修改都有唯一的zxid,如果zxid1小于zxid2须教,那么zxid1在zxid2之前發(fā)生皿渗。
2.ctime - znode被創(chuàng)建的毫秒數(shù)(從1970年開(kāi)始)
3.mzxid - znode最后更新的zxid
4.mtime - znode最后修改的毫秒數(shù)(從1970年開(kāi)始)
5.pZxid-znode最后更新的子節(jié)點(diǎn)zxid
6.cversion - znode子節(jié)點(diǎn)變化號(hào),znode子節(jié)點(diǎn)修改次數(shù)
7.dataversion - znode數(shù)據(jù)變化號(hào)
8.aclVersion - znode訪問(wèn)控制列表的變化號(hào)
9.ephemeralOwner- 如果是臨時(shí)節(jié)點(diǎn)轻腺,這個(gè)是znode擁有者的session id乐疆。如果不是臨時(shí)節(jié)點(diǎn)則是0。
10.dataLength- znode的數(shù)據(jù)長(zhǎng)度
11.numChildren - znode子節(jié)點(diǎn)數(shù)量
3.4 監(jiān)聽(tīng)器原理
1.監(jiān)聽(tīng)原理詳解:
(1) 首先要有一個(gè)main()線程
(2) 在main線程中創(chuàng)建ZK客戶端贬养,這是會(huì)創(chuàng)建兩個(gè)線程挤土,一個(gè)負(fù)責(zé)網(wǎng)絡(luò)連接通信(connect),一個(gè)負(fù)責(zé)監(jiān)聽(tīng)(listener)
(3) 通過(guò)connect線程將注冊(cè)的監(jiān)聽(tīng)事件發(fā)送給ZK
(4) 在ZK的注冊(cè)監(jiān)聽(tīng)器列表中將注冊(cè)的監(jiān)聽(tīng)事件添加到列表中
(5) ZK監(jiān)聽(tīng)到有數(shù)據(jù)或路徑發(fā)生變化時(shí),就會(huì)將這個(gè)消息發(fā)送給listener線程
(6) Listener線程內(nèi)部調(diào)用process()方法
2.常見(jiàn)的監(jiān)聽(tīng)
1.監(jiān)聽(tīng)節(jié)點(diǎn)數(shù)據(jù)的變化
Get path [watch]
2.監(jiān)聽(tīng)子節(jié)點(diǎn)增減的變化
Ls path [watch]
3.5 寫數(shù)據(jù)流程
????讀是局部性的误算,即client只需要從與它相連的server上讀取數(shù)據(jù)即可仰美;而client有寫請(qǐng)求的話迷殿,與之相連的server會(huì)通知leader,然后leader會(huì)把寫操作分發(fā)給所有server咖杂。所以定要比讀慢很多贪庙。
四 Zookeeper實(shí)戰(zhàn)
4.1 分布式安裝部署
1.集群規(guī)劃
在hadoop1、hadoop2和hadoop3三個(gè)節(jié)點(diǎn)上部署Zookeeper翰苫。
2.解壓安裝
(1)解壓zookeeper安裝包到/opt/module/目錄下
tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
(2)在/opt/module/zookeeper-3.4.10/這個(gè)目錄下創(chuàng)建zkData
mkdir -p zkData
(3)重命名/opt/module/zookeeper-3.4.10/conf這個(gè)目錄下的zoo_sample.cfg為zoo.cfg
mv zoo_sample.cfg zoo.cfg
2.配置zoo.cfg文件
(1)具體配置
vi /opt/module/zookeeper-3.4.10/conf/zoo.cfg
修改內(nèi)容:
dataDir=/opt/module/zookeeper-3.4.10/zkData
增加如下配置
#######################cluster##########################
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
(2)配置參數(shù)解讀
Server.A=B:C:D。
A是一個(gè)數(shù)字这橙,表示這個(gè)是第幾號(hào)服務(wù)器奏窑;
B是這個(gè)服務(wù)器的ip地址;
C是這個(gè)服務(wù)器與集群中的Leader服務(wù)器交換信息的端口屈扎;
D是萬(wàn)一集群中的Leader服務(wù)器掛了埃唯,需要一個(gè)端口來(lái)重新進(jìn)行選舉,選出一個(gè)新的Leader鹰晨,而這個(gè)端口就是用來(lái)執(zhí)行選舉時(shí)服務(wù)器相互通信的端口墨叛。
????集群模式下配置一個(gè)文件myid,這個(gè)文件在dataDir目錄下模蜡,這個(gè)文件里面有一個(gè)數(shù)據(jù)就是A的值漠趁,Zookeeper啟動(dòng)時(shí)讀取此文件,拿到里面的數(shù)據(jù)與zoo.cfg里面的配置信息比較從而判斷到底是哪個(gè)server忍疾。
3.集群操作
(1)在/opt/module/zookeeper-3.4.10/zkData目錄下創(chuàng)建一個(gè)myid的文件
touch myid
添加myid文件闯传,注意一定要在linux里面創(chuàng)建,在notepad++里面很可能亂碼
(2)編輯myid文件
vi myid
在文件中添加與server對(duì)應(yīng)的編號(hào):如1
(3)拷貝配置好的zookeeper到其他機(jī)器上
并分別修改myid文件中內(nèi)容為3卤妒、4,并修改環(huán)境變量甥绿,和hadoop1一樣
scp -r /opt/module/zookeeper-3.4.10/ root@hadoop2:/opt/module/
scp -r /opt/module/zookeeper-3.4.10/ root@hadoop3:/opt/module/
(4)三臺(tái)都修改環(huán)境變量
vi /etc/profile
修改內(nèi)容:
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin
使環(huán)境變量生效:
source /etc/profile
(5)分別啟動(dòng)zookeeper
hadoop1:
bin/zkServer.sh start
hadoop2
bin/zkServer.sh start
hadoop3
bin/zkServer.sh start
(5)查看狀態(tài)
bin/zkServer.sh status
bin/zkServer.sh status
bin/zkServer.sh status
4.2 客戶端命令行操作
命令基本語(yǔ)法 | 功能描述 |
---|---|
help | 顯示所有操作命令 |
ls path [watch] | 使用 ls 命令來(lái)查看當(dāng)前znode中所包含的內(nèi)容 |
ls2 path [watch] | 查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)并能看到更新次數(shù)等數(shù)據(jù) |
create | 普通創(chuàng)建(永久節(jié)點(diǎn)) |
-s | 含有序列 |
-e | 臨時(shí)(重啟或者超時(shí)消失) |
get path [watch] | 獲得節(jié)點(diǎn)的值 |
set | 設(shè)置節(jié)點(diǎn)的具體值 |
stat | 查看節(jié)點(diǎn)狀態(tài) |
delete | 刪除節(jié)點(diǎn) |
rmr | 遞歸刪除節(jié)點(diǎn) |
1.啟動(dòng)客戶端
bin/zkCli.sh
2.顯示所有操作命令
help
3.查看當(dāng)前znode中所包含的內(nèi)容
ls /
4.查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)并能看到更新次數(shù)等數(shù)據(jù)
ls2 /
5.創(chuàng)建普通節(jié)點(diǎn)
create /app1 "hello app1"
create /app1/server101 "192.168.1.101"
6.獲得節(jié)點(diǎn)的值
get /app1
get /app1/server101
7.創(chuàng)建短暫節(jié)點(diǎn)
create -e /app-emphemeral 8888
(1)在當(dāng)前客戶端是能查看到的
ls /
(2)退出當(dāng)前客戶端然后再重啟客戶端
quit
bin/zkCli.sh
(3)再次查看根目錄下短暫節(jié)點(diǎn)已經(jīng)刪除
ls /
8.創(chuàng)建帶序號(hào)的節(jié)點(diǎn)
(1)先創(chuàng)建一個(gè)普通的根節(jié)點(diǎn)app2
create /app2 "app2"
(2)創(chuàng)建帶序號(hào)的節(jié)點(diǎn)
create -s /app2/aa 888
create -s /app2/bb 888
create -s /app2/cc 888
如果原節(jié)點(diǎn)下有1個(gè)節(jié)點(diǎn),則再排序時(shí)從1開(kāi)始则披,以此類推共缕。
create -s /app1/aa 888
9.修改節(jié)點(diǎn)數(shù)據(jù)值
set /app1 999
10.節(jié)點(diǎn)的值變化監(jiān)聽(tīng)
(1)在104主機(jī)上注冊(cè)監(jiān)聽(tīng)/app1節(jié)點(diǎn)數(shù)據(jù)變化
get /app1 watch
(2)在103主機(jī)上修改/app1節(jié)點(diǎn)的數(shù)據(jù)
set /app1 777
(3)觀察104主機(jī)收到數(shù)據(jù)變化的監(jiān)聽(tīng)
11.節(jié)點(diǎn)的子節(jié)點(diǎn)變化監(jiān)聽(tīng)(路徑變化)
(1)在104主機(jī)上注冊(cè)監(jiān)聽(tīng)/app1節(jié)點(diǎn)的子節(jié)點(diǎn)變化
ls /app1 watch
(2)在103主機(jī)/app1節(jié)點(diǎn)上創(chuàng)建子節(jié)點(diǎn)
create /app1/bb 666
(3)觀察104主機(jī)收到子節(jié)點(diǎn)變化的監(jiān)聽(tīng)
12.刪除節(jié)點(diǎn)
delete /app1/bb
13.遞歸刪除節(jié)點(diǎn)
rmr /app2
14.查看節(jié)點(diǎn)狀態(tài)
stat /app1