1. 安装
1.1 单机版
1.1.1 安装 JKD
注意:Zookeeper 对 JDK 版本有要求,目前使用最多的是 8 和 11 版本,其他版本是否支持请去官方查看。
# 安装jdk 1.11yum -y install java-11-openjdk-devel# 添加环境变量cat > /etc/profile.d/jdk.sh <<EOFJAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.8.10-1.el7.x86_64JRE_HOME=\$JAVA_HOMECLASSPATH=\$JAVA_HOME/lib:\$JRE_HOME/libPATH=\$PATH:\$JAVA_HOME/binexport JAVA_HOME JRE_HOME CLASSPATH PATHEOF# 加载环境变量source /etc/profile.d/jdk.sh
1.1.2 下载安装
# 下载wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz -P /opt/src/# 解压tar xvf /opt/src/apache-zookeeper-3.6.3-bin.tar.gz -C /opt/# 创建软连接ln -s /opt/apache-zookeeper-3.6.3-bin/ /opt/zookeeper
1.1.3 修改配置文件
配置文件说明:
- tickTime:心跳检测的时间频率,单位为毫秒。
- initLimit:集群中的 Flower 服务器和 Leader 服务器之间初始连接时能容忍的最多心跳数。
- syncLimit:集群中 Flower 服务器和 Leader 服务器之间的请求和答应最多能容忍的心跳数。
- dataDir:存放myid信息跟一些版本,日志等 Zookeeper 相关数据的目录。
- clientPort:客户端连接的端口。
```bash
切换目录
[root@c7-01 ~]# cd /opt/zookeeper/
修改配置文件
[root@c7-01 zookeeper]# cp conf/zoo_sample.cfg conf/zoo.cfg [root@c7-01 zookeeper]# vim conf/zoo.cfg dataDir=/opt/zookeeper/data
这里仅仅修改了 data 目录
<a name="naLmj"></a>### 1.1.4 启动服务```bash# 添加环境变量[root@c7-01 zookeeper]# echo 'PATH=$PATH:/opt/zookeeper/bin' >> /etc/profile.d/zookeeper.sh# 创建普通用户[root@c7-01 zookeeper]# useradd -r -u 306 -s /sbin/nologin zookeeper# 修改目录属主[root@centos7 zookeeper]# chown -R zookeeper.zookeeper /opt/zookeeper/# 切换普通用户启动服务[root@centos7 opt]# su - zookeeper[zookeeper@centos7 ~]$ zkServer.sh start/bin/javaZooKeeper JMX enabled by defaultUsing config: /opt/zookeeper/bin/../conf/zoo.cfgStarting zookeeper ... STARTED
1.2 集群
1.2.1 安装JDK
yum -y install java-11-openjdk-devel# 添加环境变量cat > /etc/profile.d/jdk.sh <<EOFJAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.8.10-1.el7.x86_64JRE_HOME=\$JAVA_HOMECLASSPATH=\$JAVA_HOME/lib:\$JRE_HOME/libPATH=\$PATH:\$JAVA_HOME/binexport JAVA_HOME JRE_HOME CLASSPATH PATHEOF# 加载环境变量source /etc/profile.d/jdk.sh
1.2.2 下载安装
# 下载wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz -P /opt/src/# 解压tar xvf /opt/src/apache-zookeeper-3.6.3-bin.tar.gz -C /opt/# 创建软连接ln -s /opt/apache-zookeeper-3.6.3-bin/ /opt/zookeeper
1.2.3 准备配置文件
基于模板配置文件生成配置文件
[root@redis-01:conf]# cp zoo_sample.cfg zoo.cfg
修改配置文件,具体配置如下:
[root@redis-01:conf]# grep -v “^#” /opt/zookeeper/conf/zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/opt/zookeeper/data clientPort=2181 maxClientCnxns=120 autopurge.snapRetainCount=3 autopurge.purgeInterval=1
server.1=172.16.198.196:2888:3888 server.2=172.16.198.194:2888:3888 server.3=172.16.198.147:2888:3888
创建数据目录
[root@redis-01:conf]# mkdir /opt/zookeeper/data
创建集群id文件
[root@redis-01:conf]# echo “1” > /opt/zookeeper/data/myid
将配置文件拷贝到其他节点
[root@redis-01:conf]# scp zoo.cfg 172.16.198.194:/opt/zookeeper/conf/zoo.cfg [root@redis-01:conf]# scp zoo.cfg 172.16.198.147:/opt/zookeeper/conf/zoo.cfg
- 第二台节点:```bash# 创建数据目录[root@redis-02:conf]# mkdir /opt/zookeeper/data# 创建集群id文件[root@redis-02:conf]# echo "2" > /opt/zookeeper/data/myid
创建集群id文件
[root@redis-03:conf]# echo “3” > /opt/zookeeper/data/myid
<a name="b45iZ"></a>### 1.2.4 启动集群三台节点上执行以下相同操作:```bash# 添加环境变量cat > /etc/profile.d/zookeeper.sh <<EOFPATH=\$PATH:/opt/zookeeper/binZOOKEEPER_HOME=/opt/zookeeperexport PATH ZOOKEEPER_HOMEEOF# 加载环境变量source /etc/profile.d/zookeeper.sh# 启动服务[root@redis-01:~]# zkServer.sh start/bin/javaZooKeeper JMX enabled by defaultUsing config: /opt/zookeeper/bin/../conf/zoo.cfgStarting zookeeper ... STARTED
1.2.5 查看集群状态
# 第一台节点[root@redis-01 conf]# zkServer.sh status/usr/bin/javaZooKeeper JMX enabled by defaultUsing config: /opt/zookeeper/bin/../conf/zoo.cfgClient port found: 2181. Client address: localhost. Client SSL: false.Mode: follower# 第二台节点[root@redis-02 conf]# zkServer.sh status/usr/bin/javaZooKeeper JMX enabled by defaultUsing config: /opt/zookeeper/bin/../conf/zoo.cfgClient port found: 2181. Client address: localhost. Client SSL: false.Mode: leader# 第三台节点[root@redis-03 conf]# zkServer.sh status/usr/bin/javaZooKeeper JMX enabled by defaultUsing config: /opt/zookeeper/bin/../conf/zoo.cfgClient port found: 2181. Client address: localhost. Client SSL: false.Mode: follower
1.2.6 Docker 安装
创建数据目录
mkdir -p /data/zookeeper/{node01,node02,node03}mkdir /data/zookeeper/node01/{data,datalog,logs}mkdir /data/zookeeper/node02/{data,datalog,logs}mkdir /data/zookeeper/node03/{data,datalog,logs}# 目录结构tree /data/zookeeper//data/zookeeper/├── node01│ ├── data│ ├── datalog│ └── logs├── node02│ ├── data│ ├── datalog│ └── logs└── node03├── data├── datalog└── logs12 directories, 0 files
创建自定义网络
docker network create --driver bridge --subnet=172.19.0.0/16 --gateway=172.19.0.254 zknet
启动容器
$ vim zk-cluster-docker.sh#!/bin/bashfor i in {1..3};dodocker run -d -p 218${i}:2181 \--name zookeeper-node0${i} \--privileged --restart always \--network zknet --ip 172.19.0.${i} \-v /data/zookeeper/node0${i}/data:/data \-v /data/zookeeper/node0${i}/datalog:/datalog \-v /data/zookeeper/node0${i}/logs:/logs \-e ZOO_MY_ID=${i} \-e "ZOO_SERVERS=server.1=172.19.0.1:2888:3888 server.2=172.19.0.2:2888:3888 server.3=172.19.0.3:2888:3888" \zookeeper:3.4.14done$ bash zk-cluster-docker.sh
2. 集群选举
2.1 集群角色
- LOOKING:寻找 Leader 状态,处于该状态需要进入选举流程。
- LEADING:领导者状态,处于该状态的节点说明是角色已经是 Leader,只有 Leader 节点具有写权限。
- FOLLOWING:跟随者状态,表示 Leader 已经选举出来,节点角色是 Follower。 功能一般有主要有,向 Leader 发送请求 , 接收 Leader 消息并进行处理,接收 Client 请求,如果是写请求会先询问 Leader,等待 Leader 指示并执行。
OBSERVER:观察者状态,节点角色是 Observer, 功能和 Follower 差不多,但不参加投票和选举 。
2.2 集群 ID
ZXID(zookeeper transaction id):每个改变 Zookeeper 状态的操作都会形成一个对应的 zxid,
- myid:服务器的唯一标识(SID),通过配置 myid 文件指定,集群中唯一。
2.3 选举流程
当集群中的 zookeeper 节点启动以后,会根据配置文件中指定的 zookeeper 节点地址进行 leader 选举操作,过程如下:
- 每个 zookeeper 节点都会发出投票,由于是第一次选举 leader,因此每个节点都会把自己当做 leader 角色进行选举,每个 zookeeper 的投票中都会包含自己 的 myid 和 zxid。
- 每个节点接受并检查对方的投票信息,比如投票时间、是否状态为 LOOKING 状态的投票。
- 对比投票,优先检查 zxid,如果 zxid 不一样则 zxid 大的为 leader,如果 zxid 相同则继续对比 myid,myid 大的一方为 leader
注意:Leader 与 Follower 利用 PING 来感知对方的是否存活,当 Leader 无法响应 PING 时,将重新发起 Leader 选举。
