二. zookeeper集群与选举机制
文章目录
2.1:ZooKeeper集群三种角色
一.分类
- leader:作为整个zk集群写请求的唯一处理者,并负责进行投票的发起和决议,更新系统的状态。
- follower:接收客户端请求,处理读请求,并向客户端返回结果;将写请求转给 Leader;在选举 Leader过程中参与投票。
- observer:可以理解为无选举投票权的 Flollower,其主要是为了协助 Follower 处理更多的读请求。如果Zookeeper 集群的读请求负载很高,或者客户端非常非常多,多到跨机房,则可以设置一些 Observer服务器,以提高读取的吞吐量。
二.图示
三种角色图示:
observer作用:
2.2:ZooKeeper集群三种模式
一.分类
- 恢复模式: 如果leader崩溃,这个时候就会进入恢复模式,使整个zk集群恢复到正常的工作状态
- 同步模式:新的leader选举出来后,就会进入同步模式(各个follower会去同步新的leader上的数据),当大多数zkServer完成了与leader的状态同步之后,恢复模式就结束
- 广播模式:客户端想写入数据,这个时候leader发起提议,当leader的提议被大多数的zkServer统一之后,leader就会去修改自身的数据,并将修改后的数据广播给其他的follower
二.图示
2.3:ZooKeeper集群选举
一.myid与zxid
- myid:这是 zk 集群中服务器的唯一标识,称为 myid。
- 例如,有三个 zk 服务器,那么编号分别是 1,2,3。
- zxid:
- zxid 为 Long 类型,其中高 32 位表示 epoch,低 32 位表示 xid。
- 组成:
- epoch: 每个 Leader 都会具有一个不同的 epoch 值,表示一个时期、时代。新的 Leader 产生,则会更新所有zkServer 的 zxid 中的 epoch
- xid: zk 的事务 id,每一个写操作都是一个事务,都会有一个xid。每一个写操作都需要由 Leader 发起一个提议,由所有 Follower 表决是否同意本次写操作。
- zxid原理:
类似ReentranReadWriteLock 32位
高位 | 低位 |
---|---|
0000000000000000 | 0000000000000000 |
zxid 是64位
epoch | xid |
---|---|
00000000000000000000000000000000 | 00000000000000000000000000000000 |
二. 逻辑时钟
逻辑时钟,Logicalclock:是一个整型数,该概念在选举时称为 logicalclock,而在 zxid 中则为 epoch 的值。即 epoch 与 logicalclock 是同一个值,在不同情况下的不同名称。
三. zk的选举状态
- 分类
- LOOKING,选举状态(查找 Leader 的状态)。
- LEADING,领导者状态。处于该状态的服务器称为 Leader
- FOLLOWING,随从状态,同步 leader 状态。处于该状态的服务器称为 Follower。
- OBSERVING,观察状态,同步 leader 状态。处于该状态的服务器称为 Observer。
- 图示
2.4:ZooKeeper集群选举发生的时机与选举算法
一.简介
- 发生时机:整个集群群龙无首的时候
- 服务启动
- leader宕机之后
- 选举机制:集群中,半数zkServer同意,则产生新的leader
- 注意:搭建集群时,一般都是奇数个。例:三台服务器,最多允许一台宕机,四台服务器,也是最多允许一台宕机
- 选举算法:对比(myid,zxid)
- 先对比zxid,zxid大者(大表示数据越新)胜出,成为leader
- 如果zxid一致,则myid大者成为leader
二.图示
2.5:ZooKeeper集群搭建
一.简介
- 端口的作用(默认配置下)
- 2181: 对client端提供服务
- 2888: 集群内及其通讯使用的端口
- 3888: 集群选举leader
二.集群步骤(3台)
- 修改zk配置
- 编辑zk的conf目录下的zoo.cfg:
dataDir=/usr/local/zookeeper-3.4.12/data
- 三台分别修改zoo.cfg:
server.1=xdclass1:2888:3888
server.2=xdclass2:2888:3888
server.3=xdclass3:2888:3888
- 在zk的根目录下,新建一个data目录,并在data目录下新增一个myid的文件
- 编辑zk的conf目录下的zoo.cfg:
- 配置权限:
- 三台服务器,分别新增一个叫做zookeeper的用户 useradd zookeeper
- 将修改好配置的zk,分别放到三台服务器的/usr/local/,并将目录权限改为zookeeper用户
chown -R zookeeper:zookeeper zookeeper-3.4.12/
- 修改myid文件: 三台服务器,均修改/usr/local/zookeeper-3.4.12/data/目录里的myid文件,文件内容是一个数字,对应server.1=xdclass1 里的1
- 关闭防火墙
systemctl stop firewalld.service
- 清理cmd文件,并使sh文件具有可执行权限:
- 进入zk的bin目录运行下面命令
rm -rf *.cmd
chmod +x *.sh
- 启动并观察状态:
- 从第一台机子依次启动 ./zkServer.sh start
- 三台机子均启动完成之后,可以使用zkServer.sh status去查看状态
-
leader的机器状态
-
follower的机器的状态
扫描二维码关注公众号,回复: 10880749 查看本文章