zookeeper工作原理、安装配置、工具命令简介
1 Zookeeper簡介
Zookeeper 是分布式服務(wù)框架,主要是用來解決分布式應(yīng)用中經(jīng)常遇到的一些數(shù)據(jù)管理問題,如:統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理、分布式應(yīng)用配置項(xiàng)的管理等等。
ZooKeeper是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、名字服務(wù)、分布式同步、組服務(wù)等。
ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯(cuò)的關(guān)鍵服務(wù),將簡單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶。 ZooKeeper包含一個(gè)簡單的原語集,[1]?提供Java和C的接口。 ZooKeeper代碼版本中,提供了分布式獨(dú)享鎖、選舉、隊(duì)列的接口,代碼在zookeeper-3.4.3\src\recipes。其中分布鎖和隊(duì)列有Java和C兩個(gè)版本,選舉只有Java版本。
2 zookeeper基本概念
2.1角色
Zookeeper中的角色主要有以下三類,如下表所示:
系統(tǒng)模型如圖所示:
2.2設(shè)計(jì)目的
1.最終一致性:client不論連接到哪個(gè)Server,展示給它都是同一個(gè)視圖,這是zookeeper最重要的性能。
2 .可靠性:具有簡單、健壯、良好的性能,如果消息m被到一臺(tái)服務(wù)器接受,那么它將被所有的服務(wù)器接受。
3 .實(shí)時(shí)性:Zookeeper保證客戶端將在一個(gè)時(shí)間間隔范圍內(nèi)獲得服務(wù)器的更新信息,或者服務(wù)器失效的信息。但由于網(wǎng)絡(luò)延時(shí)等原因,Zookeeper不能保證兩個(gè)客戶端能同時(shí)得到剛更新的數(shù)據(jù),如果需要最新數(shù)據(jù),應(yīng)該在讀數(shù)據(jù)之前調(diào)用sync()接口。
4 .等待無關(guān)(wait-free):慢的或者失效的client不得干預(yù)快速的client的請求,使得每個(gè)client都能有效的等待。
5.原子性:更新只能成功或者失敗,沒有中間狀態(tài)。
6 .順序性:包括全局有序和偏序兩種:全局有序是指如果在一臺(tái)服務(wù)器上消息a在消息b前發(fā)布,則在所有Server上消息a都將在消息b前被發(fā)布;偏序是指如果一個(gè)消息b在消息a后被同一個(gè)發(fā)送者發(fā)布,a必將排在b前面。
3 zookeeper工作原理
?? ZooKeeper是以Fast Paxos算法為基礎(chǔ)的,paxos算法存在活鎖的 問題,即當(dāng)有多個(gè)proposer交錯(cuò)提交時(shí),有可能互相排斥導(dǎo)致沒有一個(gè)proposer能提交成功,而Fast Paxos作了一些優(yōu)化,通過選舉產(chǎn)生一個(gè)leader,只有l(wèi)eader才能提交propose,具體算法可見Fast Paxos。因此,要想弄懂ZooKeeper首先得對Fast Paxos有所了解。
??? Zookeeper 的核心是廣播,這個(gè)機(jī)制保證了各個(gè)Server之間的同步。實(shí)現(xiàn)這個(gè)機(jī)制的協(xié)議叫做Zab協(xié)議。Zab協(xié)議有兩種模式,它們分別是恢復(fù)模式(選主)和廣播 模式(同步)。當(dāng)服務(wù)啟動(dòng)或者在領(lǐng)導(dǎo)者崩潰后,Zab就進(jìn)入了恢復(fù)模式,當(dāng)領(lǐng)導(dǎo)者被選舉出來,且大多數(shù)Server完成了和leader的狀態(tài)同步以后, 恢復(fù)模式就結(jié)束了。狀態(tài)同步保證了leader和Server具有相同的系統(tǒng)狀態(tài)。為了保證事務(wù)的順序一致性,zookeeper采用了遞增的事務(wù)id號(hào) (zxid)來標(biāo)識(shí)事務(wù)。所有的提議(proposal)都在被提出的時(shí)候加上了zxid。實(shí)現(xiàn)中zxid是一個(gè)64位的數(shù)字,它高32位是epoch用 來標(biāo)識(shí)leader關(guān)系是否改變,每次一個(gè)leader被選出來,它都會(huì)有一個(gè)新的epoch,標(biāo)識(shí)當(dāng)前屬于那個(gè)leader的統(tǒng)治時(shí)期。低32位用于遞 增計(jì)數(shù)。
每個(gè)Server在工作過程中有三種狀態(tài):
LOOKING:當(dāng)前Server不知道leader是誰,正在搜尋。
LEADING:當(dāng)前Server即為選舉出來的leader。
FOLLOWING:leader已經(jīng)選舉出來,當(dāng)前Server與之同步。
3.1 選舉流程
????? 1、選舉Leader。
2、同步數(shù)據(jù)。 3、選舉Leader過程中算法有很多,但要達(dá)到的選舉標(biāo)準(zhǔn)是一致的。 4、Leader要具有最高的zxid。 5、集群中大多數(shù)的機(jī)器得到響應(yīng)并follow選出的Leader
當(dāng) leader崩潰或者leader失去大多數(shù)的follower,這時(shí)候zk進(jìn)入恢復(fù)模式,恢復(fù)模式需要重新選舉出一個(gè)新的leader,讓所有的 Server都恢復(fù)到一個(gè)正確的狀態(tài)。Zk的選舉算法有兩種:一種是基于basic paxos實(shí)現(xiàn)的,另外一種是基于fast paxos算法實(shí)現(xiàn)的。系統(tǒng)默認(rèn)的選舉算法為fast paxos。
basic paxos流程:
1 .選舉線程由當(dāng)前Server發(fā)起選舉的線程擔(dān)任,其主要功能是對投票結(jié)果進(jìn)行統(tǒng)計(jì),并選出推薦的Server;
2 .選舉線程首先向所有Server發(fā)起一次詢問(包括自己);
3 .選舉線程收到回復(fù)后,驗(yàn)證是否是自己發(fā)起的詢問(驗(yàn)證zxid是否一致),然后獲取對方的id(myid),并存儲(chǔ)到當(dāng)前詢問對象列表中,最后獲取對方提議的leader相關(guān)信息(id,zxid),并將這些信息存儲(chǔ)到當(dāng)次選舉的投票記錄表中;
4. 收到所有Server回復(fù)以后,就計(jì)算出zxid最大的那個(gè)Server,并將這個(gè)Server相關(guān)信息設(shè)置成下一次要投票的Server;
5. 線程將當(dāng)前zxid最大的Server設(shè)置為當(dāng)前Server要推薦的Leader,如果此時(shí)獲勝的Server獲得n/2 + 1的Server票數(shù), 設(shè)置當(dāng)前推薦的leader為獲勝的Server,將根據(jù)獲勝的Server相關(guān)信息設(shè)置自己的狀態(tài),否則,繼續(xù)這個(gè)過程,直到leader被選舉出來。
通 過流程分析我們可以得出:要使Leader獲得多數(shù)Server的支持,則Server總數(shù)必須是奇數(shù)2n+1,且存活的Server的數(shù)目不得少于 n+1.每個(gè)Server啟動(dòng)后都會(huì)重復(fù)以上流程。在恢復(fù)模式下,如果是剛從崩潰狀態(tài)恢復(fù)的或者剛啟動(dòng)的server還會(huì)從磁盤快照中恢復(fù)數(shù)據(jù)和會(huì)話信 息,zk會(huì)記錄事務(wù)日志并定期進(jìn)行快照,方便在恢復(fù)時(shí)進(jìn)行狀態(tài)恢復(fù)。
選主的具體流程圖如下所示:
fast paxos流程是在選舉過程中,某Server首先向所有Server提議自己要成為leader,當(dāng)其它Server收到提議以后,解決epoch和 zxid的沖突,并接受對方的提議,然后向?qū)Ψ桨l(fā)送接受提議完成的消息,重復(fù)這個(gè)流程,最后一定能選舉出Leader。其流程圖如下所示:
3.2同步流程
選完leader以后,zk就進(jìn)入狀態(tài)同步過程。
1. leader等待server連接;
2 .Follower連接leader,將最大的zxid發(fā)送給leader;
3 .Leader根據(jù)follower的zxid確定同步點(diǎn);
4 .完成同步后通知follower 已經(jīng)成為uptodate狀態(tài);
5 .Follower收到uptodate消息后,又可以重新接受client的請求進(jìn)行服務(wù)了。
流程圖如下所示:
3.3工作流程
3.3.1 Leader工作流程
Leader主要有三個(gè)功能:
1 .恢復(fù)數(shù)據(jù);
2 .維持與Learner的心跳,接收Learner請求并判斷Learner的請求消息類型;
3 .Learner的消息類型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根據(jù)不同的消息類型,進(jìn)行不同的處理。
PING 消息是指Learner的心跳信息;REQUEST消息是Follower發(fā)送的提議信息,包括寫請求及同步請求;ACK消息是Follower的對提議 的回復(fù),超過半數(shù)的Follower通過,則commit該提議;REVALIDATE消息是用來延長SESSION有效時(shí)間。
Leader的工作流程簡圖如下所示:
3.3.2 Follower工作流程
Follower主要有四個(gè)功能:
1. 向Leader發(fā)送請求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
2 .接收Leader消息并進(jìn)行處理;
3 .接收Client的請求,如果為寫請求,發(fā)送給Leader進(jìn)行投票;
4 .返回Client結(jié)果。
Follower的消息循環(huán)處理如下幾種來自Leader的消息:
1 .PING消息: 心跳消息;
2 .PROPOSAL消息:Leader發(fā)起的提案,要求Follower投票;
3 .COMMIT消息:服務(wù)器端最新一次提案的信息;
4 .UPTODATE消息:表明同步完成;
5 .REVALIDATE消息:根據(jù)Leader的REVALIDATE結(jié)果,關(guān)閉待revalidate的session還是允許其接受消息;
6 .SYNC消息:返回SYNC結(jié)果到客戶端,這個(gè)消息最初由客戶端發(fā)起,用來強(qiáng)制得到最新的更新。
Follower的工作流程簡圖如下所示:
5 zookeeper安裝配置
ZooKeeper的安裝模式分為三種,分別為:單機(jī)模式(stand-alone)、集群模式和集群偽
分布模式。
所需軟件:VM 虛擬機(jī) ?centos系統(tǒng) ?jdk 1.6或者以上 ?zookeeper-3.4.6.tar.gz
zookeeper安裝的時(shí)候,測試會(huì)報(bào)至少需要三臺(tái)server 相關(guān)可以查看zookeeper.out(測試環(huán)境下)
首先下載jdk的rpm包,分別上傳到三個(gè)虛擬機(jī)上并安裝。
1.先查看系統(tǒng)是否存在jdk的相關(guān)包。(有時(shí)候裝的系統(tǒng)中會(huì)有一個(gè)openJDK)有的話就將其卸載掉。 2.將jdk保存在/usr/local/java目錄下 3.安裝jdk:rpm -ivh jdk-**-**.rpm 這里不用配置java環(huán)境,因?yàn)閞pm將其自動(dòng)加到path中。
4.1單機(jī)模式
下載zookeeper的安裝包之后, 解壓到合適目錄. 進(jìn)入zookeeper目錄下的conf子目錄, 創(chuàng)建zoo.cfg:
tickTime=2000
dataDir=/Users/apple/zookeeper/data
dataLogDir=/Users/apple/zookeeper/logs
clientPort=4180
參數(shù)說明:
tickTime: zookeeper中使用的基本時(shí)間單位, 毫秒值.
dataDir: 數(shù)據(jù)目錄. 可以是任意目錄.
dataLogDir: log目錄, 同樣可以是任意目錄. 如果沒有設(shè)置該參數(shù), 將使用和dataDir相同的設(shè)置.
clientPort: 監(jiān)聽client連接的端口號(hào)
4.2偽集群模式
所謂偽集群, 是指在單臺(tái)機(jī)器中啟動(dòng)多個(gè)zookeeper進(jìn)程, 并組成一個(gè)集群. 以啟動(dòng)3個(gè)zookeeper進(jìn)程為例.
將zookeeper的目錄拷貝2份:
zookeeper0/conf/zoo.cfg文件為:
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/Users/apple/zookeeper0/data
dataLogDir=/Users/apple/zookeeper0/logs
clientPort=4180
server.0=127.0.0.1:8880:7770
server.1=127.0.0.1:8881:7771
server.2=127.0.0.1:8882:7772
新增了幾個(gè)參數(shù), 其含義如下:
1 initLimit: zookeeper集群中的包含多臺(tái)server, 其中一臺(tái)為leader, 集群中其余的server為follower. initLimit參數(shù)配置初始化連接時(shí), follower和leader之間的最長心跳時(shí)間. 此時(shí)該參數(shù)設(shè)置為5, 說明時(shí)間限制為5倍tickTime, 即5*2000=10000ms=10s.
2 syncLimit: 該參數(shù)配置leader和follower之間發(fā)送消息, 請求和應(yīng)答的最大時(shí)間長度. 此時(shí)該參數(shù)設(shè)置為2, 說明時(shí)間限制為2倍tickTime, 即4000ms.
3 server.X=A:B:C 其中X是一個(gè)數(shù)字, 表示這是第幾號(hào)server. A是該server所在的IP地址. B配置該server和集群中的leader交換消息所使用的端口. C配置選舉leader時(shí)所使用的端口. 由于配置的是偽集群模式, 所以各個(gè)server的B, C參數(shù)必須不同.
參照zookeeper0/conf/zoo.cfg, 配置zookeeper1/conf/zoo.cfg, 和zookeeper2/conf/zoo.cfg文件. 只需更改dataDir, dataLogDir, clientPort參數(shù)即可.
在之前設(shè)置的dataDir中新建myid文件, 寫入一個(gè)數(shù)字, 該數(shù)字表示這是第幾號(hào)server. 該數(shù)字必須和zoo.cfg文件中的server.X中的X一一對應(yīng).
/Users/apple/zookeeper0/data/myid文件中寫入0, /Users/apple/zookeeper1/data/myid文件中寫入1, /Users/apple/zookeeper2/data/myid文件中寫入2.
分別進(jìn)入/Users/apple/zookeeper0/bin, /Users/apple/zookeeper1/bin, /Users/apple/zookeeper2/bin三個(gè)目錄, 啟動(dòng)server.
4.3集群模式
集群模式的配置和偽集群基本一致.
由于集群模式下, 各server部署在不同的機(jī)器上, 因此各server的conf/zoo.cfg文件可以完全一樣.
下面是一個(gè)示例:
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/home/zookeeper/data
dataLogDir=/home/zookeeper/logs
clientPort=4180
server.43=10.1.39.43:2888:3888
server.47=10.1.39.47:2888:3888
server.48=10.1.39.48:2888:3888
示 例中部署了3臺(tái)zookeeper server, 分別部署在10.1.39.43, 10.1.39.47, 10.1.39.48上. 需要注意的是, 各server的dataDir目錄下的myid文件中的數(shù)字必須不同,10.1.39.43 server的myid為43, 10.1.39.47 server的myid為47, 10.1.39.48 server的myid為48.
6 zookeeper常用命令
ZooKeeper服務(wù)命令:
1. 啟動(dòng)ZK服務(wù): ./zkServer.sh start
2. 查看ZK服務(wù)狀態(tài): ./zkServer.sh status
3. 停止ZK服務(wù): ./zkServer.sh stop
4. 重啟ZK服務(wù): ./zkServer.sh restart
zk客戶端命令:
ZooKeeper 命令行工具類似于Linux的shell環(huán)境,使用它可以對ZooKeeper進(jìn)行訪問,數(shù)據(jù)創(chuàng)建,數(shù)據(jù)修改等操作. 使用 zkCli.sh -server 127.0.0.1:2181 連接到 ZooKeeper 服務(wù),連接成功后,系統(tǒng)會(huì)輸出 ZooKeeper 的相關(guān)環(huán)境以及配置信息。
命令行工具的一些簡單操作如下:
1. 顯示根目錄下、文件: ls / 使用 ls 命令來查看當(dāng)前 ZooKeeper 中所包含的內(nèi)容
2. 顯示根目錄下、文件: ls2 / 查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)并能看到更新次數(shù)等數(shù)據(jù)
3. 創(chuàng)建文件,并設(shè)置初始內(nèi)容: create /zk "test" 創(chuàng)建一個(gè)新的 znode節(jié)點(diǎn)“ zk ”以及與它關(guān)聯(lián)的字符串
4. 獲取文件內(nèi)容: get /zk 確認(rèn) znode 是否包含我們所創(chuàng)建的字符串
5. 修改文件內(nèi)容: set /zk "zkbak" 對 zk 所關(guān)聯(lián)的字符串進(jìn)行設(shè)置
6. 刪除文件: delete /zk 將剛才創(chuàng)建的 znode 刪除
7. 退出客戶端: quit
8. 幫助命令: help
ZooKeeper 常用四字命令:
ZooKeeper 支持某些特定的四字命令字母與其的交互。它們大多是查詢命令,用來獲取 ZooKeeper 服務(wù)的當(dāng)前狀態(tài)及相關(guān)信息。用戶在客戶端可以通過 telnet 或 nc 向 ZooKeeper 提交相應(yīng)的命令
1. 可以通過命令:echo stat|nc 127.0.0.1 2181 來查看哪個(gè)節(jié)點(diǎn)被選擇作為follower或者leader
2. 使用echo ruok|nc 127.0.0.1 2181 測試是否啟動(dòng)了該Server,若回復(fù)imok表示已經(jīng)啟動(dòng)。
3. echo dump| nc 127.0.0.1 2181 ,列出未經(jīng)處理的會(huì)話和臨時(shí)節(jié)點(diǎn)。
4. echo kill | nc 127.0.0.1 2181 ,關(guān)掉server
5. echo conf | nc 127.0.0.1 2181 ,輸出相關(guān)服務(wù)配置的詳細(xì)信息。
6. echo cons | nc 127.0.0.1 2181 ,列出所有連接到服務(wù)器的客戶端的完全的連接 / 會(huì)話的詳細(xì)信息。
7. echo envi |nc 127.0.0.1 2181 ,輸出關(guān)于服務(wù)環(huán)境的詳細(xì)信息(區(qū)別于 conf 命令)。
8. echo reqs | nc 127.0.0.1 2181 ,列出未經(jīng)處理的請求。
9. echo wchs | nc 127.0.0.1 2181 ,列出服務(wù)器 watch 的詳細(xì)信息。
10. echo wchc | nc 127.0.0.1 2181 ,通過 session 列出服務(wù)器 watch 的詳細(xì)信息,它的輸出是一個(gè)與 watch 相關(guān)的會(huì)話的列表。
11. echo wchp | nc 127.0.0.1 2181 ,通過路徑列出服務(wù)器 watch 的詳細(xì)信息。它輸出一個(gè)與 session 相關(guān)的路徑。
測試:
1.進(jìn)入zookeeper的bin目錄,執(zhí)行sh zkServer.sh start進(jìn)行啟動(dòng)zookeeper 2.查看狀態(tài) ? 進(jìn)入bin目錄,執(zhí)行sh zkServer.sh status 3.停止 ? ?進(jìn)入bin目錄,執(zhí)行sh zkServer.sh stop?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的zookeeper工作原理、安装配置、工具命令简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python+html语音人物交互_使用
- 下一篇: python爬虫从入门到放弃(六)之 B