官方网站

1. 安装

1.1 单机版

1.1.1 安装 JKD

注意:Zookeeper 对 JDK 版本有要求,目前使用最多的是 8 和 11 版本,其他版本是否支持请去官方查看。

  1. # 安装jdk 1.11
  2. yum -y install java-11-openjdk-devel
  3. # 添加环境变量
  4. cat > /etc/profile.d/jdk.sh <<EOF
  5. JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.8.10-1.el7.x86_64
  6. JRE_HOME=\$JAVA_HOME
  7. CLASSPATH=\$JAVA_HOME/lib:\$JRE_HOME/lib
  8. PATH=\$PATH:\$JAVA_HOME/bin
  9. export JAVA_HOME JRE_HOME CLASSPATH PATH
  10. EOF
  11. # 加载环境变量
  12. source /etc/profile.d/jdk.sh

1.1.2 下载安装

  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/
  3. # 解压
  4. tar xvf /opt/src/apache-zookeeper-3.6.3-bin.tar.gz -C /opt/
  5. # 创建软连接
  6. 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 目录

  1. <a name="naLmj"></a>
  2. ### 1.1.4 启动服务
  3. ```bash
  4. # 添加环境变量
  5. [root@c7-01 zookeeper]# echo 'PATH=$PATH:/opt/zookeeper/bin' >> /etc/profile.d/zookeeper.sh
  6. # 创建普通用户
  7. [root@c7-01 zookeeper]# useradd -r -u 306 -s /sbin/nologin zookeeper
  8. # 修改目录属主
  9. [root@centos7 zookeeper]# chown -R zookeeper.zookeeper /opt/zookeeper/
  10. # 切换普通用户启动服务
  11. [root@centos7 opt]# su - zookeeper
  12. [zookeeper@centos7 ~]$ zkServer.sh start
  13. /bin/java
  14. ZooKeeper JMX enabled by default
  15. Using config: /opt/zookeeper/bin/../conf/zoo.cfg
  16. Starting zookeeper ... STARTED

1.2 集群

1.2.1 安装JDK

  1. yum -y install java-11-openjdk-devel
  2. # 添加环境变量
  3. cat > /etc/profile.d/jdk.sh <<EOF
  4. JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.8.10-1.el7.x86_64
  5. JRE_HOME=\$JAVA_HOME
  6. CLASSPATH=\$JAVA_HOME/lib:\$JRE_HOME/lib
  7. PATH=\$PATH:\$JAVA_HOME/bin
  8. export JAVA_HOME JRE_HOME CLASSPATH PATH
  9. EOF
  10. # 加载环境变量
  11. source /etc/profile.d/jdk.sh

1.2.2 下载安装

  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/
  3. # 解压
  4. tar xvf /opt/src/apache-zookeeper-3.6.3-bin.tar.gz -C /opt/
  5. # 创建软连接
  6. ln -s /opt/apache-zookeeper-3.6.3-bin/ /opt/zookeeper

1.2.3 准备配置文件

  • 第一台节点: ```bash

    切换目录

    [root@redis-01:~]# cd /opt/zookeeper/conf/

基于模板配置文件生成配置文件

[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

  1. - 第二台节点:
  2. ```bash
  3. # 创建数据目录
  4. [root@redis-02:conf]# mkdir /opt/zookeeper/data
  5. # 创建集群id文件
  6. [root@redis-02:conf]# echo "2" > /opt/zookeeper/data/myid
  • 第三台节点: ```bash

    创建数据目录

    [root@redis-03:conf]# mkdir /opt/zookeeper/data

创建集群id文件

[root@redis-03:conf]# echo “3” > /opt/zookeeper/data/myid

  1. <a name="b45iZ"></a>
  2. ### 1.2.4 启动集群
  3. 三台节点上执行以下相同操作:
  4. ```bash
  5. # 添加环境变量
  6. cat > /etc/profile.d/zookeeper.sh <<EOF
  7. PATH=\$PATH:/opt/zookeeper/bin
  8. ZOOKEEPER_HOME=/opt/zookeeper
  9. export PATH ZOOKEEPER_HOME
  10. EOF
  11. # 加载环境变量
  12. source /etc/profile.d/zookeeper.sh
  13. # 启动服务
  14. [root@redis-01:~]# zkServer.sh start
  15. /bin/java
  16. ZooKeeper JMX enabled by default
  17. Using config: /opt/zookeeper/bin/../conf/zoo.cfg
  18. Starting zookeeper ... STARTED

1.2.5 查看集群状态

  1. # 第一台节点
  2. [root@redis-01 conf]# zkServer.sh status
  3. /usr/bin/java
  4. ZooKeeper JMX enabled by default
  5. Using config: /opt/zookeeper/bin/../conf/zoo.cfg
  6. Client port found: 2181. Client address: localhost. Client SSL: false.
  7. Mode: follower
  8. # 第二台节点
  9. [root@redis-02 conf]# zkServer.sh status
  10. /usr/bin/java
  11. ZooKeeper JMX enabled by default
  12. Using config: /opt/zookeeper/bin/../conf/zoo.cfg
  13. Client port found: 2181. Client address: localhost. Client SSL: false.
  14. Mode: leader
  15. # 第三台节点
  16. [root@redis-03 conf]# zkServer.sh status
  17. /usr/bin/java
  18. ZooKeeper JMX enabled by default
  19. Using config: /opt/zookeeper/bin/../conf/zoo.cfg
  20. Client port found: 2181. Client address: localhost. Client SSL: false.
  21. Mode: follower

1.2.6 Docker 安装

创建数据目录

  1. mkdir -p /data/zookeeper/{node01,node02,node03}
  2. mkdir /data/zookeeper/node01/{data,datalog,logs}
  3. mkdir /data/zookeeper/node02/{data,datalog,logs}
  4. mkdir /data/zookeeper/node03/{data,datalog,logs}
  5. # 目录结构
  6. tree /data/zookeeper/
  7. /data/zookeeper/
  8. ├── node01
  9. ├── data
  10. ├── datalog
  11. └── logs
  12. ├── node02
  13. ├── data
  14. ├── datalog
  15. └── logs
  16. └── node03
  17. ├── data
  18. ├── datalog
  19. └── logs
  20. 12 directories, 0 files

创建自定义网络

  1. docker network create --driver bridge --subnet=172.19.0.0/16 --gateway=172.19.0.254 zknet

启动容器

  1. $ vim zk-cluster-docker.sh
  2. #!/bin/bash
  3. for i in {1..3};do
  4. docker run -d -p 218${i}:2181 \
  5. --name zookeeper-node0${i} \
  6. --privileged --restart always \
  7. --network zknet --ip 172.19.0.${i} \
  8. -v /data/zookeeper/node0${i}/data:/data \
  9. -v /data/zookeeper/node0${i}/datalog:/datalog \
  10. -v /data/zookeeper/node0${i}/logs:/logs \
  11. -e ZOO_MY_ID=${i} \
  12. -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" \
  13. zookeeper:3.4.14
  14. done
  15. $ 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 选举操作,过程如下:
  1. 每个 zookeeper 节点都会发出投票,由于是第一次选举 leader,因此每个节点都会把自己当做 leader 角色进行选举,每个 zookeeper 的投票中都会包含自己 的 myid 和 zxid。
  2. 每个节点接受并检查对方的投票信息,比如投票时间、是否状态为 LOOKING 状态的投票。
  3. 对比投票,优先检查 zxid,如果 zxid 不一样则 zxid 大的为 leader,如果 zxid 相同则继续对比 myid,myid 大的一方为 leader

注意:Leader 与 Follower 利用 PING 来感知对方的是否存活,当 Leader 无法响应 PING 时,将重新发起 Leader 选举。

3. CRUD

3.1 数据写入