文章目錄
- 1. 集群搭建
- 2. Leader選舉
- 3. Zookeeper集群角色
1. 集群搭建
這里我們使用docker-compose 搭建偽集群
version: '3.1'
services:zoo1:image: zookeeperrestart: alwayscontainer_name: zoo1ports:- 2181:2181volumes:- /home/zk/zoo1/data:/data- /home/zk/zoo1/datalog:/datalogenvironment:ZOO_MY_ID: 1ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181ZOO_AUTOPURGE_PURGEINTERVAL: 1zoo2:image: zookeeperrestart: alwayscontainer_name: zoo2ports:- 2182:2181volumes:- /home/zk/zoo2/data:/data- /home/zk/zoo2/datalog:/datalogenvironment:ZOO_MY_ID: 2ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181ZOO_AUTOPURGE_PURGEINTERVAL: 1zoo3:image: zookeeperrestart: alwayscontainer_name: zoo3ports:- 2183:2181volumes:- /home/zk/zoo3/data:/dada- /home/zk/zoo3/datalog:/datalogenvironment:ZOO_MY_ID: 3ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181ZOO_AUTOPURGE_PURGEINTERVAL: 1
啟動dokcer-compose.yml文件
docker-compose up -d
查看容器狀態
可以看到集群搭建成功
2. Leader選舉
選舉的時候需要一些參數作為參考的維度,主要有兩個參數
-
Serverid:服務器ID
例如有三臺服務器,編號分別為1、2、3,編號越大的在選擇算法中權重越大
-
Zxid:數據ID
服務器中存放的最大數據ID,值越大說明數據越新,權重越大
如果某臺機器獲得超過半數的選票就成為leader
我們以上面的五臺Zookeeper集群為例看一下選舉的過程:
- 首先Server1上線,此時集群內只有它一臺機器,它會投票給自己,但是其票數沒有過半(即三票),此時不能成為leader
- Server2上線,由于集群內現在還沒有leader,重新選舉。根據Zookeeper順序結點的特性,Server2的編號會比Server1大,所以Server1根據權重規則將票投給Server2,Server2投給自己,但是票數依舊沒有過半,不能成為leader
- Server3上線,集群內沒有leader,重新選舉。同理Server1、2、3根據權重規則都會投給Server3,此時Server3票數過半,成為整個集群的leader
- Server4、5上線,由于集群內已經有leader了,所以不會再繼續投票
3. Zookeeper集群角色
Zookeeper集群服務中有三個角色:
- Leader領導者
- 負責處理事務請求
- 集群內部各服務器的調度者
- Follower跟隨者
- 處理客戶端非事務請求,轉發事務請求給Leader服務器
- 參與Leader選舉投票
- Observer觀察者
- 處理客戶端非事務請求,轉發事務請求給Leader服務器
- 不能參與Leader選舉投票