一個重要的機制----選舉機制
原則:集羣中半數以上機器存活,集羣可用。所以 Zookeeper 適合安裝奇數臺服務器。
Zookeeper 雖然在配置文件中並沒有指定 Master 和 Slave 。但是 Zookeeper工作時,是有一個節點爲 Leader ,其他則爲 Follower,Leader 是通過內部的選舉機制臨時產生的。
以一個簡單的例子來說明整個選舉的過程。
假設有五臺服務器組成的Zookeeper集羣,它們的id從1-5,同時它們都是最新啓動的,也就是沒有歷史數據,存放數據量都是一樣的。假設這些服務器按照順序啓動,來看看會發生什麼,如圖
(1)服務器1啓動,此時只有它一臺服務器啓動了,它發出去的報文沒有任何響應,所以它的選舉狀態一直是LOOKING狀態。
(2)服務器2啓動,它與最開始啓動的服務器1進行通信,互相交換自己的選舉結果,由於兩者都沒有歷史數據,默認投給id較大的,但是由於沒有達到超過半數以上的服務器都同意選舉它(這個例子中的半數以上是3),所以服務器1、2還是繼續保持LOOKING狀態。
(3)服務器3啓動,根據前面的理論分析,服務器3成爲服務器1、2、3中的老大,而與上面不同的是,此時有三臺服務器選舉了它,所以它成爲了這次選舉的Leader。
(4)服務器4啓動,根據前面的分析,理論上服務器4應該是服務器1、2、3、4中最大的,但是由於前面已經有半數以上的服務器選舉了服務器3,所以它只能接收當小弟的命了。
(5)服務器5啓動,同4一樣當小弟。
具體搭建過程
機器編號 | IP地址 | 端口 |
---|---|---|
zk1 | xxx | 2181 |
zk-2 | xxx | 2182 |
zk-3 | xxx | 2183 |
1、在 /usr/local/zk-cluster 目錄下先複製一個 Zookeeper ,並重命名爲 zk-1,在 zk-1 下新建 log 和 data 目錄
2、在data 目錄創建 myid 文件,寫一個標識(1,2,3)
3、修改 zoo.cfg
4、複製兩個 zk-1,並改名爲 zk-2、zk-3
5、修改 zk-2 和 zk-3 中的 myid 文件和 zoo.cfg 文件
6、分別啓動三個 Zookeeper
7、連接三個cli
注意:
在高版本中 log 目錄可以不建立,默認會在 data 目錄中記錄日誌
# 複製並重命名
cp -r /usr/local/zookeeper /usr/local/zk-cluster/zk-1
# 進入
cd zk-1
# 創建log和data目錄
mkdir log
mkdir data
# 創建myid文件
touch /usr/local/zk-cluster/zk-1/data/myid
# 寫一個數字1進去
vim /usr/local/zk-cluster/zk-1/data/myid
# 修改 zoo.cfg
vim /usr/local/zk-cluster/zk-1/conf/zoo.cfg
zk-1的zoo.cfg內容如下:
# 通信心跳數,取默認值
tickTime=2000
# LF初始通信時限
initLimit=10
# LF同步通信時限
syncLimit=5
# 指定data和log的保存目錄
dataDir=/usr/local/zk-cluster/zk-1/data
dataLogDir=/usr/local/zk-cluster/zk-1/log
# 端口
clientPort=2181
# 集羣配置
# 1,2,3 來自於data目錄中的myid文件,該文件保存了當前集羣的標識
# 2888,2889,2890爲內部通信的端口,可以相同,只要不佔用系統資源
# 3888,3889,3890爲內部選舉端口,可以相同,只要不佔用系統資源
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
# 複製兩個 zk-1,並改名爲 zk-2、zk-3
cp -r zk-1 /usr/local/zk-cluster/zk-2
cp -r zk-1 /usr/local/zk-cluster/zk-3
# 修改 zk-2 和 zk-3 中的 myid 文件和 zoo.cfg 文件
# 把zk-2中的myid文件改爲2,把zk-3中的myid文件改爲3
vim ./zk-2/data/myid
vim ./zk-3/data/myid
# 修改zoo.cfg 文件
vim ./zk-2/conf/zoo.cfg
vim ./zk-3/conf/zoo.cfg
zk-2的zoo.cfg
zk-3的zoo.cfg
注意:按順序啓動,2爲 leader
# 分別啓動三個 Zookeeper
./zk-1/bin/zkServer.sh start
./zk-2/bin/zkServer.sh start
./zk-3/bin/zkServer.sh start
# 連接三個cli
cd /usr/local/zk-cluster/zk-1/bin/
./zkCli.sh -server 127.0.0.1:2181
cd /usr/local/zk-cluster/zk-2/bin/
./zkCli.sh -server 127.0.0.1:2182
cd /usr/local/zk-cluster/zk-3/bin/
./zkCli.sh -server 127.0.0.1:2183
三臺Zookeeper都可以讀寫操作。
關於不同加載順序選舉 leader 的問題
原則:誰的 myid 大,票就投給誰,直到選舉成功(票數超過 Zookeeper 半數就選舉成功),選舉成功之後,將不再進行選舉,只有投出 Leader 這個集羣才能跑起來。
1、按照順序 1 2 3啓動
2 是Leader
2、倒序 3 2 1 啓動
3 是Leader
3、啓動順序爲:2 3 1
3是 Leader