目錄
一、ZooKeeper是什么
二、ZooKeeper的工作機制
三、ZooKeeper特點
四、ZooKeeper數據結構
五、ZooKeeper應用場景
●統(tǒng)一命名服務
●統(tǒng)一配置管理
●統(tǒng)一集群管理
●服務器動態(tài)上下線
●軟負載均衡
六、ZooKeeper的選舉機制
七、實操部署ZooKeeper集群
步驟一:先部署java環(huán)境
步驟二:完成zookeeper安裝包下載
步驟三:完成部署啟動
一、ZooKeeper是什么
Zookeeper是一個開源的分布式的,為分布式框架提供協(xié)調服務的Apache項目。
二、ZooKeeper的工作機制
Zookeeper從設計模式角度來理解:是一個基于觀察者模式設計的分布式服務管理框架,它負責存儲和管理大家都關心的數據,然后接受觀察者的注冊,一旦這些數據的狀態(tài)發(fā)生變化,Zookeeper就將負責通知已經在Zookeeper上注冊的那些觀察者做出相應的反應。也就是說
Zookeeper = 注冊中心+文件系統(tǒng) + 通知機制。
三、ZooKeeper特點
(1)Zookeeper:一個領導者(Leader),多個跟隨者(Follower)組成的集群。
(2)Zookeeper集群中只要有半數以上節(jié)點存活,Zookeeper集群就能正常服務。所以Zookeeper適合安裝奇數臺服務器。
(3)全局數據一致:每個Server保存一份相同的數據副本,Client無論連接到哪個Server,數據都是一致的。
(4)更新請求順序執(zhí)行,來自同一個Client的更新請求按其發(fā)送順序依次執(zhí)行,即先進先出。
(5)數據更新原子性,一次數據更新要么成功,要么失敗。
(6)實時性,在一定時間范圍內,Client能讀到最新數據。
四、ZooKeeper數據結構
ZooKeeper數據模型的結構與Linux文件系統(tǒng)很類似,整體上可以看作是一棵樹,每個節(jié)點稱做一個ZNode。每一個ZNode默認能夠存儲1MB的數據,每個ZNode都可以通過其路徑唯一標識。
五、ZooKeeper應用場景
提供的服務包括:
統(tǒng)一命名服務、統(tǒng)一配置管理、統(tǒng)一集群管理、服務器節(jié)點動態(tài)上下線、軟負載均衡等。
●統(tǒng)一命名服務
在分布式環(huán)境下,經常需要對應用/服務進行統(tǒng)一命名,便于識別。例如:IP不容易記住,而域名容易記住。
●統(tǒng)一配置管理
(1)分布式環(huán)境下,配置文件同步非常常見。一般要求一個集群中,所有節(jié)點的配置信息是一致的,比如Kafka集群。對配置文件修改后,希望能夠快速同步到各個節(jié)點上。
(2)配置管理可交由ZooKeeper實現(xiàn)。可將配置信息寫入ZooKeeper上的一個Znode。各個客戶端服務器監(jiān)聽這個Znode。一旦Znode中的數據被修改,ZooKeeper將通知各個客戶端服務器。
●統(tǒng)一集群管理
(1)分布式環(huán)境中,實時掌握每個節(jié)點的狀態(tài)是必要的??筛鶕?jié)點實時狀態(tài)做出一些調整。
(2)ZooKeeper可以實現(xiàn)實時監(jiān)控節(jié)點狀態(tài)變化??蓪⒐?jié)點信息寫入ZooKeeper上的一個ZNode。監(jiān)聽這個ZNode可獲取它的實時狀態(tài)變化。
●服務器動態(tài)上下線
客戶端能實時洞察到服務器上下線的變化。
●軟負載均衡
在Zookeeper中記錄每臺服務器的訪問數,讓訪問數最少的服務器去處理最新的客戶端請求(這邊最小連接調度算法嘛)。
六、ZooKeeper的選舉機制
- 第一次啟動選舉機制
(1)服務器1啟動,發(fā)起一次選舉。服務器1投自己一票。此時服務器1票數一票,不夠半數以上(3票),選舉無法完成,服務器1狀態(tài)保持為LOOKING;
(2)服務器2啟動,再發(fā)起一次選舉。服務器1和2分別投自己一票并交換選票信息:此時服務器1發(fā)現(xiàn)服務器2的myid比自己目前投票推舉的(服務器1)大,更改選票為推舉服務器2。此時服務器1票數0票,服務器2票數2票,沒有半數以上結果,選舉無法完成,服務器1,2狀態(tài)保持LOOKING
(3)服務器3啟動,發(fā)起一次選舉。此時服務器1和2都會更改選票為服務器3。此次投票結果:服務器1為0票,服務器2為0票,服務器3為3票。此時服務器3的票數已經超過半數,服務器3當選Leader。服務器1,2更改狀態(tài)為FOLLOWING,服務器3更改狀態(tài)為LEADING;
(4)服務器4啟動,發(fā)起一次選舉。此時服務器1,2,3已經不是LOOKING狀態(tài),不會更改選票信息。交換選票信息結果:服務器3為3票,服務器4為1票。此時服務器4服從多數,更改選票信息為服務器3,并更改狀態(tài)為FOLLOWING;(5)服務器5啟動,同4一樣當小弟。
總結:比較服務器的myid大小,誰的myid越大則獲取其他節(jié)點的選票,當選票數量超過服務器節(jié)點數量的半數以后,則當選leader,其他節(jié)點為follower。即使有新的更大myid節(jié)點加入集群,也不變
- 非第一次啟動選舉機制
1.EPOCH大的直接勝出
2.EPOCH相同,事務id大的勝出
3.事務id相同,服務器id大的勝出
SID:服務器ID。用來唯一標識一臺ZooKeeper集群中的機器,每臺機器不能重復,和myid一致。(表示服務器的唯一標志id)
ZXID:事務ID。ZXID是一個事務ID,用來標識一次服務器狀態(tài)的變更。在某一時刻,集群中的每臺機器的ZXID值不一定完全一致,這和ZooKeeper服務器對于客戶端“更新請求”的處理邏輯速度有關。(表示處理任務的數量)
Epoch:每個Leader任期的代號。沒有Leader時同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個數據就會增加(表示參與選舉的次數)
七、實操部署ZooKeeper集群
步驟一:先部署java環(huán)境
步驟二:完成zookeeper安裝包下載
//安裝 JDK
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
java -version
//下載安裝包
官方下載地址:https://archive.apache.org/dist/zookeeper/
cd /opt
方法一:wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz
2.安裝 Zookeeper
cd /opt
方法二:
tar -zxvf apache-zookeeper-3.6.4-bin.tar.gz
mv apache-zookeeper-3.6.4-bin /usr/local/zookeeper
//修改配置文件
cd /usr/local/zookeeper/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
tickTime=2000 #通信心跳時間,Zookeeper服務器與客戶端心跳時間,單位毫秒
initLimit=10 #Leader和Follower初始連接時能容忍的最多心跳數(tickTime的數量),這里表示為10*2s
syncLimit=5 #Leader和Follower之間同步通信的超時時間,這里表示如果超過5*2s,Leader認為Follwer死掉,并從服務器列表中刪除Follwer
dataDir=/usr/local/zookeeper-3.5.7/data ●修改,指定保存Zookeeper中的數據的目錄,目錄需要單獨創(chuàng)建
dataLogDir=/usr/local/zookeeper-3.5.7/logs ●添加,指定存放日志的目錄,目錄需要單獨創(chuàng)建
clientPort=2181 #客戶端連接端口
#添加集群信息
server.1=192.168.20.12:3188:3288
server.2=192.168.20.15:3188:3288
server.3=192.168.20.16:3188:3288
-------------------------------------------------------------------------------------
server.A=B:C:D
●A是一個數字,表示這個是第幾號服務器。集群模式下需要在zoo.cfg中dataDir指定的目錄下創(chuàng)建一個文件myid,這個文件里面有一個數據就是A的值,Zookeeper啟動時讀取此文件,拿到里面的數據與zoo.cfg里面的配置信息比較從而判斷到底是哪個server。
●B是這個服務器的地址。
●C是這個服務器Follower與集群中的Leader服務器交換信息的端口。
●D是萬一集群中的Leader服務器掛了,需要一個端口來重新進行選舉,選出一個新的Leader,而這個端口就是用來執(zhí)行選舉時服務器相互通信的端口。
-------------------------------------------------------------------------------------
//拷貝配置好的 Zookeeper 配置文件到其他機器上
scp /usr/local/zookeeper/conf/zoo.cfg 192.168.20.15:/usr/local/zookeeper/conf/
scp /usr/local/zookeeper/conf/zoo.cfg 192.168.20.16:/usr/local/zookeeper/conf/
//在每個節(jié)點上創(chuàng)建數據目錄和日志目錄
mkdir /usr/local/zookeeper/data
mkdir /usr/local/zookeeper/logs
//在每個節(jié)點的dataDir指定的目錄下創(chuàng)建一個 myid 的文件
echo 1 > /usr/local/zookeeper/data/myid
echo 2 > /usr/local/zookeeper/data/myid
echo 3 > /usr/local/zookeeper/data/myid
?
步驟三:完成部署啟動
文章來源:http://www.zghlxwxcb.cn/news/detail-817286.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-817286.html
//配置 Zookeeper 啟動腳本
vim /etc/init.d/zookeeper
#!/bin/bash
#chkconfig: 2345 20 90
#description:Zookeeper Service Control Script
ZK_HOME='/usr/local/zookeeper'
case $1 in
start)
echo "---------- zookeeper 啟動 ------------"
$ZK_HOME/bin/zkServer.sh start
;;
stop)
echo "---------- zookeeper 停止 ------------"
$ZK_HOME/bin/zkServer.sh stop
;;
restart)
echo "---------- zookeeper 重啟 ------------"
$ZK_HOME/bin/zkServer.sh restart
;;
status)
echo "---------- zookeeper 狀態(tài) ------------"
$ZK_HOME/bin/zkServer.sh status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
// 設置開機自啟
chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper
//分別啟動 Zookeeper
service zookeeper start
//查看當前狀態(tài)
service zookeeper status
到了這里,關于【分布式技術】注冊中心zookeeper的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!