ZooKeeper作为目前开源技术体系的无可替代的基础组件,首先要保证自身的高可用,也就是对于部分服务下线要有一定的容忍能力,不能说ZooKeeper突然挂了所有的服务都跟着寄了。
为保证高可用,ZooKeeper提供了集群模式,或者说是Master/Slave架构,防止单点故障影响整个服务。
图源:ZooKeeper 集群
角色 | 职责 |
---|---|
Leader | 可以处理读写请求这里的读写请求来自Follower和Observer;事务的发起和决议;更新系统状态 |
Follower | 处理读请求,将写请求转发给Leader;参与Leader发起的事务处理,负责本节点的数据变更和事务提交;参与Leader选举;同步Leader状态(保持心跳连接) |
Observer | 处理读请求,将写请求转发给Leader ;不参与Leader发起的事务处理;不参与Leader选举 ;同步Leader状态(保持心跳连接) |
为什么要引入Observer(ZK 3.3.0)?
Leader和Follower遵循Quorum仲裁机制(过半策略),也就是说,若Leader+Follwer的数量为m,则Quorum = m/2 + 1,只有投票数大于等于Quorum,事务和选举才判定成功。
因此官方文档强烈建议使用奇数台服务器作为ZooKeeper集群,这样的话在不影响事务处理的前提下,最多可容忍n台宕机。
举个例子:
对于节点数为5和6的两个集群:
防止集群脑裂:对于一个集群,通常多台机器会部署在不同机房,来提高这个集群的可用性。保证可用性的同时,会发生一种机房间网络线路故障,导致机房间网络不通,而集群被割裂成几个小集群。这时候子集群各自选主导致“脑裂”的情况,会导致数据一致性问题。ZooKeeper的过半机制导致不可能产生 2 个leader,因为少于等于一半是不可能产生leader的,这就使得不论机房的机器如何分配都不可能发生脑裂。
服务器的四种状态:
选举的原则:选择能力强,数据新的节点作为Leader
选票的数据结构:(sid, zxid),sid为服务器id,zxid为当前服务器的最大事务id
选票的比较规则: ①zxid大的胜出;②若zxid相等,则sid大的胜出
从选票也可以看出,zxid代表了这个机器上的ZooKeeper服务是不是最新的,否则要看机器id的大小了。
如上图所示,在启动时期Leader选举
这里也贯穿着选举思想:能力强,数据新
如上图所示:
环境:Mac,ZooKeeper3.8
仍然继续第一部分的安装。
首先复制出来三个ZooKeeper的目录,分别命名为:zookeeper-01,zookeeper-02,zookeeper-03
修改配置文件/conf/zoo.cfg
# zk1
dataDir=/usr/local/software/zookeeper-01/data
dataLogDir=/usr/local/software/zookeeper-01/log
clientPort=2181
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889
# zk2
dataDir=/usr/local/software/zookeeper-02/data
dataLogDir=/usr/local/software/zookeeper-02/log
clientPort=2182
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889
# zk3
dataDir=/usr/local/software/zookeeper-03/data
dataLogDir=/usr/local/software/zookeeper-03/log
clientPort=2183
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889
在data下创建myid文件并写入1,2,3:
# zk1
vim data/myid
# 输入1,wq
# zk2
vim data/myid
# 输入2,wq
# zk3
vim data/myid
# 输入3,wq
运行:
/zookeeper-01/bin/zkServer.sh start
/zookeeper-01/bin/zkServer.sh start
/zookeeper-01/bin/zkServer.sh start
检查服务状态:
/zookeeper-01/bin/zkServer.sh status
Using config: /usr/local/software/zookeeper-01/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
/zookeeper-02/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/software/zookeeper-02/bin/../conf/zoo.cfg
Client port found: 2182. Client address: localhost. Client SSL: false.
Mode: follower
/zookeeper-03/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/software/zookeeper-03/bin/../conf/zoo.cfg
Client port found: 2183. Client address: localhost. Client SSL: false.
Mode: leader