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状态的节点,会向其他节点发送通知,告诉其他节点自己是主节点,当大于一般的节点去认同他时,他才能正式称为主节点,否则继续投票选举。