網(wǎng)頁設(shè)計與實現(xiàn)論文杭州seo公司排名
文章目錄
- ZooKeeper 概述
- 選舉機制
- 搭建前準備
- 分布式配置
- 分布式安裝
- 解壓縮并重命名
- 配置環(huán)境
- 配置服務(wù)器編號
- 配置文件
- 操作集群
- 編寫腳本
- 運行腳本
- 搭建過程中常見錯誤
ZooKeeper 概述
Zookeeper 是一個開源的分布式服務(wù)協(xié)調(diào)框架,由Apache軟件基金會開發(fā)和維護。以下是對Zookeeper的主要概述:
-
設(shè)計目標(biāo):
- 提供分布式環(huán)境中的數(shù)據(jù)一致性。
- 為分布式應(yīng)用程序提供協(xié)調(diào)服務(wù)。
- 簡化復(fù)雜分布式系統(tǒng)的構(gòu)建和管理。
-
功能特性:
- 數(shù)據(jù)模型:Zookeeper使用一個樹形結(jié)構(gòu)的數(shù)據(jù)模型(Znode),每個節(jié)點可以存儲數(shù)據(jù)并具有版本號。
- 一致性保證:Zookeeper保證在客戶端看到的數(shù)據(jù)是一致的,提供順序一致性、原子性和單一系統(tǒng)映像等特性。
- 分布式鎖:通過臨時節(jié)點和 watches(監(jiān)視器)機制,Zookeeper可以實現(xiàn)分布式鎖,確保在分布式環(huán)境中對共享資源的互斥訪問。
- 集群管理:Zookeeper可以用于管理集群中的節(jié)點,如監(jiān)控節(jié)點狀態(tài)、動態(tài)加入或移除節(jié)點。
- 配置管理:應(yīng)用程序可以在Zookeeper中存儲和獲取配置信息,使得配置變更能夠快速傳播到所有相關(guān)節(jié)點。
- 命名服務(wù):Zookeeper可以作為命名服務(wù),為分布式系統(tǒng)中的資源提供唯一的標(biāo)識符。
-
工作原理:
- Zookeeper集群由一組相互協(xié)作的服務(wù)器組成,這些服務(wù)器共同維護一個具有相同數(shù)據(jù)副本的內(nèi)存數(shù)據(jù)庫。
- 客戶端與Zookeeper集群進行交互,讀取數(shù)據(jù)、寫入數(shù)據(jù)或者注冊 watches以監(jiān)聽數(shù)據(jù)變化。
- Zookeeper通過投票機制實現(xiàn)容錯和領(lǐng)導(dǎo)選舉,確保在部分服務(wù)器故障時仍能提供服務(wù)。
-
應(yīng)用場景:
- 在Hadoop和HBase等大數(shù)據(jù)處理框架中,Zookeeper用于管理集群狀態(tài)和協(xié)調(diào)任務(wù)。
- 作為服務(wù)發(fā)現(xiàn)工具,幫助微服務(wù)架構(gòu)中的服務(wù)注冊和發(fā)現(xiàn)。
- 在分布式消息隊列系統(tǒng)中,如Kafka,用于Broker和Consumer的協(xié)調(diào)。
總的來說,Zookeeper在分布式系統(tǒng)中扮演著關(guān)鍵的角色,通過提供可靠的數(shù)據(jù)管理和協(xié)調(diào)服務(wù),簡化了分布式應(yīng)用程序的開發(fā)和運維。
選舉機制
1)集群中半數(shù)以上機器存活,集群可用。所以 Zookeeper 一般安裝奇數(shù)臺服務(wù)器,因為假設(shè)有 2N + 1 臺機器只要 N + 1 臺存活,集群就可用,再加一臺也還是 N + 1 臺,并不會提高集群可用性能,浪費資源。
2)服務(wù)器具有4
種狀態(tài),分別是LOOKING
、FOLLOWING
、LEADING
、OBSERVING
。
LOOKING
:尋找Leader
狀態(tài)。當(dāng)服務(wù)器處于該狀態(tài)時,當(dāng)前集群中沒有Leader
,因此需要進入Leader
選舉狀態(tài)。FOLLOWING
:跟隨者狀態(tài)。表明當(dāng)前服務(wù)器角色是Follower
。LEADING
:領(lǐng)導(dǎo)者狀態(tài)。表明當(dāng)前服務(wù)器角色是Leader
。OBSERVING
:觀察者狀態(tài)。表明當(dāng)前服務(wù)器角色是Observer
,Observer
不參與投票和選舉過程。
3)選舉過程:假設(shè)有五臺服務(wù)器組成的 Zookeeper 集群,它們的 id 從 1 - 5。如果這些服務(wù)器依序啟動**(第一次啟動)**
- 服務(wù)器 1 啟動,發(fā)起選舉
- 服務(wù)器先投給自己一票,然后判斷是否過半,顯然不夠,選舉無法完成,服務(wù)器 1 狀態(tài)保持為
LOOKING
;
- 服務(wù)器先投給自己一票,然后判斷是否過半,顯然不夠,選舉無法完成,服務(wù)器 1 狀態(tài)保持為
- 服務(wù)器 2 啟動,發(fā)起選舉
- 服務(wù)器 2 先投給自己一票,然后與最開始啟動的服務(wù)器 1 進行通信,互相交換自己的選舉結(jié)果,
id
值更大的服務(wù)器 2 勝出,服務(wù)器 1 將選票改投給 服務(wù)器 2,此時服務(wù)器 1 有 0 票,服務(wù)器 2 有 2 票,還不夠半數(shù),選舉無法完成,服務(wù)器狀態(tài) 1、2 保持為LOOKING
;
- 服務(wù)器 2 先投給自己一票,然后與最開始啟動的服務(wù)器 1 進行通信,互相交換自己的選舉結(jié)果,
- 服務(wù)器 3 啟動,發(fā)起選舉
- 服務(wù)器 3 先投給自己一票,根據(jù)上述方法同理服務(wù)器 1、2 都會改投服務(wù)器 3,此時服務(wù)器 1 有 0 票,服務(wù)器 2 有 0 票,服務(wù)器 3 有 3 票,(3/5) 超過半數(shù),服務(wù)器 3 當(dāng)選為
Leader
。服務(wù)器狀態(tài) 1、2 更改狀態(tài)為FOLLOWDING
,服務(wù)器 3 更改狀態(tài)為LEADING
;
- 服務(wù)器 3 先投給自己一票,根據(jù)上述方法同理服務(wù)器 1、2 都會改投服務(wù)器 3,此時服務(wù)器 1 有 0 票,服務(wù)器 2 有 0 票,服務(wù)器 3 有 3 票,(3/5) 超過半數(shù),服務(wù)器 3 當(dāng)選為
- 服務(wù)器 4 啟動,發(fā)起選舉
- 服務(wù)器先投給自己一票,此時已經(jīng)存在
Leader
了,服務(wù)器 1、2、3 不會再改投了。所以投票結(jié)果為:服務(wù)器 3 有 3 票,服務(wù)器 4 有 1 票。服務(wù)器 4 服從多數(shù),更改狀態(tài)為FOLLOWING
;
- 服務(wù)器先投給自己一票,此時已經(jīng)存在
- 服務(wù)器 5 啟動,發(fā)起選舉
- 與服務(wù)器 4 同理,更改狀態(tài)為
FOLLOWING
。
- 與服務(wù)器 4 同理,更改狀態(tài)為
搭建前準備
下載地址:Index of /dist/zookeeper (apache.org)
文檔地址:Apache ZooKeeper
這里選擇 Zookeeper-3.5.7
版本進行搭建,自行配置 JDK7
或更高版本
分布式配置
分布式配置與偽分布式配置,主要有以下區(qū)別,其余配置均相同:
- 偽分布式所使用的端口必須不同,分布式端口可以相同。
- 偽分布式統(tǒng)一使用一個
IP
,分布式需要根據(jù)當(dāng)前網(wǎng)絡(luò)IP
配置。
以下為分布式與偽分布式配置對比(以3
個服務(wù)器節(jié)點為例):這里選擇分布式配置
配置 | 偽分布式 | 分布式 |
---|---|---|
clienPort | 2181;2182;2183 | 2181;2181;2181 |
server.1 | 127.0.0.1:2888:3888 | hadoop102:2888:3888 |
server.2 | 127.0.0.1:2889:3889 | hadoop103:2888:3888 |
server.3 | 127.0.0.1:2890:3890 | hadoop104:2888:3888 |
分布式安裝
先在 hadoop102 上操作最后分發(fā)文件,改個 myid 就行,也可以使用 MultiExec 功能一次向所有終端發(fā)送命令
解壓縮并重命名
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/
mv /opt/apache-zookeeper-3.5.7-bin /opt/zookeeper-3.5.7
配置環(huán)境
vim /etc/profile.d/zookeeper.sh
添加下述內(nèi)容:
export ZOOKEEPER_HOME=/opt/zookeeper-3.5.7
export PATH=$PATH:$ZOOKEEPER_HOME/bin
更新環(huán)境變量
source /etc/profile
配置服務(wù)器編號
hadoop102 的 myid 設(shè)置為 1,hadoop103 為 2,hadoop104 為 3
mkdir -p $ZOOKEEPER_HOME/tmp/data
echo 1 > $ZOOKEEPER_HOME/tmp/data/myid
配置文件
把 $ZOOKEEPER_HOME/conf
這個目錄下的 zoo_sample.cfg
復(fù)制為 zoo.cfg
cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
修改配置
vim $ZOOKEEPER_HOME/conf/zoo.cfg
修改數(shù)據(jù)存儲路徑
dataDir=/opt/zookeeper-3.5.7/tmp/data
添加下述配置
server.1=hadoop102:2888:3888
server.2=hadoop103:2888:3888
server.3=hadoop104:2888:3888
下述配置參數(shù)含義
server.A=B:C:D
- A 數(shù)字,表示這個是第幾號服務(wù)器;即集群模式下配置的
myid
; - B 服務(wù)器的
IP
地址; - C 服務(wù)器與集群中的
Leader
服務(wù)器交換信息的端口; - D 當(dāng)集群中的
Leader
服務(wù)器掛了,需要重新選舉出一個新的Leader
時,在這個端口進行服務(wù)器相互通信; - 2181:對外提供服務(wù)端口;
- 2888:內(nèi)部數(shù)據(jù)同步端口;
- 3888:
Leader
掛了,重新選舉端口。
集群分發(fā) zookeeper
目錄和配置文件
xsync $ZOOKEEPER_HOME
xsync /etc/profile.d/zookeeper.sh
最后不要忘記去 hadoop102,hadoop104 上將 myid 改為 2,3 ,其他集群如果使用 $ZOOKEEPER_HOME
需要先 source /etc/profile
更新一下環(huán)境變量
[user@hadoop103 ~]$ echo 2 > $ZOOKEEPER_HOME/tmp/data/myid
[user@hadoop104 ~]$ echo 3 > $ZOOKEEPER_HOME/tmp/data/myid
操作集群
在每個服務(wù)器上啟動 Zookeeper
[user@hadoop102 zookeeper-3.5.7]$ zkServer.sh start
[user@hadoop103 zookeeper-3.5.7]$ zkServer.sh start
[user@hadoop104 zookeeper-3.5.7]$ zkServer.sh start
使用 jpsall
查看進程,QuorumPeerMain
就是 Zookeeper
集群的啟動入口類,用來加載配置啟動 QuorumPeer
線程的
[user@hadoop102 ~]$ ./jpsall
=============== hadoop102 ===============
11507 QuorumPeerMain
12988 Jps
=============== hadoop103 ===============
14498 Jps
12887 QuorumPeerMain
=============== hadoop104 ===============
12471 Jps
11086 QuorumPeerMain
查看集群狀態(tài),按照半數(shù)選舉機制三個服務(wù)器中第二個啟動的集群就是 Leader
[user@hadoop102 zookeeper-3.5.7]$ zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower[user@hadoop103 zookeeper-3.5.7]$ zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader[user@hadoop104 zookeeper-3.5.7]$ zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
此時可以嘗試將 hadoop103
斷掉按照投票機制應(yīng)當(dāng)是 hadoop104
當(dāng)選 Leader
編寫腳本
vim zk.sh
給執(zhí)行權(quán)限
chmod 777 zk.sh
添加如下內(nèi)容:
#!/bin/bashif [ $# -lt 1 ]
thenecho "No Args Input..."exit ;
ficase $1 in
"start")echo "=========== 啟動 zookeeper 集群 ==========="echo "------------- hadoop102 -----------------"ssh hadoop102 "$ZOOKEEPER_HOME/bin/zkServer.sh start"echo "------------- hadoop103 -----------------"ssh hadoop103 "$ZOOKEEPER_HOME/bin/zkServer.sh start"echo "------------- hadoop104 -----------------"ssh hadoop104 "$ZOOKEEPER_HOME/bin/zkServer.sh start"
;;
"stop")echo "=========== 關(guān)閉 zookeeper 集群 ==========="echo "------------- hadoop102 -----------------"ssh hadoop102 "$ZOOKEEPER_HOME/bin/zkServer.sh stop"echo "------------- hadoop103 -----------------"ssh hadoop103 "$ZOOKEEPER_HOME/bin/zkServer.sh stop"echo "------------- hadoop104 -----------------"ssh hadoop104 "$ZOOKEEPER_HOME/bin/zkServer.sh stop"
;;
"status")echo "=========== 查看 zookeeper 狀態(tài) ==========="echo "------------- hadoop102 -----------------"ssh hadoop102 "$ZOOKEEPER_HOME/bin/zkServer.sh status"echo "------------- hadoop103 -----------------"ssh hadoop103 "$ZOOKEEPER_HOME/bin/zkServer.sh status"echo "------------- hadoop104 -----------------"ssh hadoop104 "$ZOOKEEPER_HOME/bin/zkServer.sh status"
;;
*)echo "Input Args Error..."
;;
esac
運行腳本
1)啟動 zookeeper 集群
./zk.sh start=========== 啟動 zookeeper 集群 ===========
------------- hadoop102 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
------------- hadoop103 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
------------- hadoop104 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
2)查看集群各服務(wù)器狀態(tài)
./zk.sh status=========== 查看 zookeeper 狀態(tài) ===========
------------- hadoop102 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
------------- hadoop103 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
------------- hadoop104 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
3)關(guān)閉 zookeeper
集群
./zk.sh stop=========== 關(guān)閉 zookeeper 集群 ===========
------------- hadoop102 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
------------- hadoop103 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
------------- hadoop104 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
搭建過程中常見錯誤
Zookeeper 集群搭建過程中常見錯誤-CSDN博客