1.創建 docker-cpmpose.yml
version: '3.1' services: zoo1: image: zookeeper restart: always hostname: zoo1 ports: - 2181:2181 environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 zoo2: image: zookeeper restart: always hostname: zoo2 ports: - 2182:2181 environment: ZOO_MY_ID: 2 ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 zoo3: image: zookeeper restart: always hostname: zoo3 ports: - 2183:2181 environment: ZOO_MY_ID: 3 ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
2.Zookeeper集群簡單介紹
zookeeper身為分布式系統協調服務,為了防止自身掛掉,致使整個系統崩潰,zookeeper維護了一個集群。
zookeeper集群由奇數個點組成,采用一主多從的結構,主節點稱為leader,從節點稱為flower。
3.Zookeeper實現數據一致性
當某個服務注冊到zookeeper集群的某個節點時,為了實現zookeeper集群的數據一致性,需要將該服務也同時注冊到集群中的其他節點上,那我們應該怎樣去操作,將數據同步呢?
我們知道zookeeper集群采用 一主多從 的結構,當我們將服務注冊到某個從節點時,該從節點向主節點發送消息(該消息中包含服務信息),主節點收到消息之后,會通過廣播(包含服務信息)通知所有從節點,收到消息之后,全部節點開始進行寫操作。實現的數據的一致性。
4.Zookeeper服務的崩潰恢復
zookeeper集群中的節點也不是非常穩定的,也有可能因為網絡的原因或者高並發的原因而崩潰(一般而言都是主節點崩潰)。當主節點崩潰之后,zookeeper集群是怎樣實現恢復的呢?
當zookeeper集群中的主節點崩潰之后,zookeeper采用 ZAB 協議,它可以有效的解決zookeeper集群的崩潰恢復以及數據同步問題。根據 ZAB協議,集群中的節點存在三種狀態:
◉ Looking :選舉狀態;
◉ Following :Follower節點(從節點)所處的狀態;
◉ LEading :Leader節點(主節點)所處狀態;
處於正常狀態的zookeeper集群中的節點存在兩種狀態:主節點(leader) 與 從節點(flower);崩潰之后,zookeeper集群中的節點都處於 Looking 狀態,集群會根據ZAB協議投票選舉出擁有最大 ZXID 的節點,讓其處於 Leading狀態。
為了防止出現多主現象的出現,選舉出來的處於Leading狀態的節點,會向其他節點發送通知,告訴其他節點自己是主節點,當大於一般的節點去認同他時,他才能正式稱為主節點,否則繼續投票選舉。
