ZooKeeper 安装

1、单机安装

单机版的 ZooKeeper 安装

配置 java 环境

# 官方依赖介绍
https://zookeeper.apache.org/doc/r3.8.0/zookeeperAdmin.html

root@zookeeper01:~# apt install -y openjdk-11-jdk

root@zookeeper01:~# java -version
openjdk version "11.0.17" 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu220.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu220.04, mixed mode, sharing)

部署 ZooKeeper

# 官网下载地址
https://archive.apache.org/dist/zookeeper/

root@zookeeper01:/usr/local/src# pwd
/usr/local/src

root@zookeeper01:/usr/local/src# wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

root@zookeeper01:/usr/local/src# tar xvf zookeeper-3.4.14.tar.gz

root@zookeeper01:/usr/local/src# ln -sv /usr/local/src/zookeeper-3.4.14 /usr/local/zookeeper

root@zookeeper01:/usr/local/src# cd /usr/local/zookeeper/conf/
root@zookeeper01:/usr/local/zookeeper/conf# cp zoo_sample.cfg zoo.cfg

root@zookeeper01:/usr/local/zookeeper/conf#  grep ^[a-Z] zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181

启动zookeeper

# 用于启动、重启、停止 ZooKeeper
/usr/local/zookeeper/bin/zkServer.sh

root@zookeeper01:~# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

root@zookeeper01:~# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: standalone
图片[1]-ZooKeeper 安装-李佳程的个人主页

2、ZooKeeper 集群介绍

ZooKeeper 集群用于解决单点和单机性能及数据高可用等问题。

https://www.sohu.com/a/253808097_465221

2.1、集群结构

图片[2]-ZooKeeper 安装-李佳程的个人主页

ZooKeeper 集群中的所有机器通过一个 Leader 选举过程来选定一台称为 “Leader” 的机器,Leader 既可以为客户端提供写服务又能提供读服务。除了 Leader 外,Follower 和 Observer 都只能提供读服务。Follower 和 Observer 唯一的区别在于 Observer 机器不参与 Leader 的选举过程,也不参与写操作的“过半写成功”策略,因此 Observer 机器可以在不影响写性能的情况下提升集群的读性能。

图片[3]-ZooKeeper 安装-李佳程的个人主页
图片[4]-ZooKeeper 安装-李佳程的个人主页
图片[5]-ZooKeeper 安装-李佳程的个人主页

2.2、集群角色

图片[6]-ZooKeeper 安装-李佳程的个人主页

当 Leader 服务器出现网络中断、崩溃退出与重启等异常情况时,ZAB 协议就会进人恢复模式并选举产生新的Leader服务器。这个过程大致是这样的:

  1. Leader election(选举阶段):节点在一开始都处于选举阶段,只要有一个节点得到超半数节点的票数,它就可以当选准 leader。
  2. Discovery(发现阶段):在这个阶段,followers 跟准 leader 进行通信,同步 followers 最近接收的事务提议。
  3. Synchronization(同步阶段):同步阶段主要是利用 leader 前一阶段获得的最新提议历史,同步集群中所有的副本。同步完成之后 准 leader 才会成为真正的 leader。
  4. Broadcast(广播阶段) :到了这个阶段,Zookeeper 集群才能正式对外提供事务服务,并且 leader 可以进行消息广播。同时如果有新的节点加入,还需要对新节点进行同步。

3、集群部署

zookeeper 集群特性:整个集群中只要有超过集群数量一半的 zookeeper 工作只正常的,那么整个集群对外就是可用的,假如有 2 台服务器做了一个 zookeeper集群,只要有任何一台故障或宕机,那么这个 zookeeper 集群就不可用了,因为剩下的一台没有超过集群一半的数量,但是假如有三台 zookeeper 组成一个集群,那么损坏一台就还剩两台,大于 3 台的一半,所以损坏一台还是可以正常运行的,但是再损坏一台就只剩一台集群就不可用了。那么要是 4 台组成一个 zookeeper集群,损坏一台集群肯定是正常的,那么损坏两台就还剩两台,那么 2 台不大于集群数量的一半,所以 3 台的 zookeeper 集群和 4 台的 zookeeper 集群损坏两台的结果都是集群不可用,以此类推 5 台和 6 台以及 7 台和 8 台都是同理,所以这也就是为什么集群一般都是奇数的原因。

各 zookeeper 服务器都配置 java 环境并部署 zookeeper 集群

# 环境:
node1:192.168.1.84
node2:192.168.1.85
node3:192.168.1.86

节点 1 部署

# 安装步骤与单机一致

root@zookeeper01:/usr/local/zookeeper/conf# grep -v "^#" /usr/local/zookeeper/conf/zoo.cfg
# 服务器与服务器之间的单次心跳检测时间间隔,单位为毫秒
tickTime=2000
# 集群中 leader 服务器与 follower 服务器初始连接心跳次数,即多少
个 2000 毫秒
initLimit=10
# leader 与 follower 之间连接完成之后,后期检测发送和应答的心跳
次数,如果该 follower 在设置的时间内(5*2000)不能与 leader 进行通信,那么此
follower 将被视为不可用。
syncLimit=5

# 自定义的 zookeeper 保存数据的目录
dataDir=/usr/local/zookeeper/data
# 客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个
端口,接受客户端的访问请求
clientPort=2181
# 单个客户端 IP 可以和 zookeeper 保持的连接数
maxClientCnxns=128
# 3.4.0 中的新增功能:启用后,ZooKeeper 自动清
除功能会将 autopurge.snapRetainCount 最新快照和相应的事务日志分别保留在
dataDir 和 dataLogDir 中,并删除其余部分,默认值为 3。最小值为 3。
autopurge.snapRetainCount=3
# 3.4.0 及之后版本,ZK 提供了自动清理日志和快照
文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个 1 或更大的
整数,默认是 0,表示不开启自动清理功能
autopurge.purgeInterval=1

# server.服务器编号=服务器 IP:LF 数据同步端
口:LF 选举端
server.1=192.168.1.84:2888:3888
server.2=192.168.1.85:2888:3888
server.3=192.168.1.86:2888:3888

# 将配置文件分发至其他服务器
root@zookeeper01:/usr/local/zookeeper/conf# scp zoo.cfg 192.168.1.85:/usr/local/zookeeper/conf
root@zookeeper01:/usr/local/zookeeper/conf# scp zoo.cfg 192.168.1.86:/usr/local/zookeeper/conf

# 创建数据目录
root@zookeeper01:/usr/local/zookeeper/conf# mkdir /usr/local/zookeeper/data

# 自己的集群 id
root@zookeeper01:/usr/local/zookeeper/conf# echo "1" > /usr/local/zookeeper/data/myid

节点 2 部署

root@zookeeper03:~# mkdir /usr/local/zookeeper/data
root@zookeeper02:~# echo "2" > /usr/local/zookeeper/data/myid

节点 3 部署

root@zookeeper03:~# mkdir /usr/local/zookeeper/data
root@zookeeper03:~# echo "3" > /usr/local/zookeeper/data/myid

4、各服务器启动 zookeeper

节点 1 启动

root@zookeeper01:~# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

root@zookeeper01:~# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

节点 2 启动

root@zookeeper02:~# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

root@zookeeper02:~# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

节点 3 启动

root@zookeeper03:~# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

root@zookeeper03:~# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader

5、zookeeper 集群选举

节点角色状态

  • LOOKING:寻找 Leader 状态,处于该状态需要进入选举流程
  • LEADING:领导者状态,处于该状态的节点说明是角色已经是 Leader
  • FOLLOWING:跟随者状态,表示 Leader 已经选举出来,当前节点角色是 follower
  • OBSERVER:观察者状态,表明当前节点角色是 observe

选举 ID

  • ZXID(zookeeper transaction id):每个改变 Zookeeper 状态的操作都对应的 zxid。
  • myid:服务器的唯一标识(SID),通过配置 myid 文件指定,集群中唯一。

leader 选举过程

当集群中的 zookeeper 节点启动以后,会根据配置文件中指定的 zookeeper 节点地址进行 leader 选择操作

  1. 每个 zookeeper 都会发出投票,由于是第一次选举 leader,因此每个节点都会把自己当做 leader 角色进行选举,每个 zookeeper 的投票中都会包含自己的 myid 和 zxid,此时 zookeeper 1 的投票为 myid 为 1,初始 zxid 有一个初始值,后期会随着数据更新而自动变化,zookeeper2 的投票为 myid 为 2,初始zxid 为初始生成的值。
  2. 每个节点接受并检查对方的投票信息,比如投票时间、是否状态为 LOOKING状态的投票。
  3. 对比投票,优先检查 xvid,如果 xvid 不一样则 xvid 大的为 leader,如果 xvid相同则继续对比 myid,myid 大的一方为 leade
  • 成为 Leader 的必要条件: Leader 要具有最高的 zxid;当集群的规模是 n 时,集群中大多数的机器(至少 n/2+1)得到响应并 follow 选出的 Leader。
  • 心跳机制:Leader 与 Follower 利用 PING 来感知对方的是否存活,当 Leader 无法响应 PING 时,将重新发起 Leader 选举

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享