1 初识Zookeeper集群
官网:https://zookeeper.apache.org/doc/current/zookeeperOver.html#sc_designGoals
1.1 zk集群中的角色

客户端是可以连接任意一个Zookeeper Server Cluster中的机器的。
Leader:只能有一个,可以处理客户端的读写请求。
Follower:可以有多个,只能处理客户端的读请求,要是收到写请求,则会转发给Leader进行处理。
Observer:可以有多个,只能处理客户端的读请求,要是收到写请求,则会转发给Leader进行处理,与Follower不同的是,Observer不参与Leader的投票选举以及写请求的提议和提交过程。
1.2 对zk集群的理解
1.2.1 leader选举
Leader+Follower的数量最好是奇数台,因为选举的时候需要进行投票,只有某个节点的票数超过半数,才会成为Leader。
如果Leader+Follower是2台,则超过半数就是2。如果Leader+Follower是3台,则超过半数也是 2。
1.2.2 节点的状态
Looking:启动节点,但还没有确定当前节点的角色时的状态。
Leading:Leader节点所处的状态。
Following:Follower节点所处的状态。
Observing:Observer节点所处的状态。
1.2.3 数据同步
当zk02成为leader之后,zk01、zk03、zk04需要从leader上同步最新的数据。
1.2.4 崩溃恢复
如果Leader节点挂了,则集群重新进行leader选举,此时集群对外是不能提供服务的。
2 搭建Zookeeper集群
2.1 centos
(1)准备4台centos机器
1 2 3 4
| zk01 192.168.0.111 zk02 192.168.0.112 zk03 192.168.0.113 zk04 192.168.0.114 observer
|
(2)准备好一些前置环境
1 2 3
| Java、Maven Zookeeper压缩包并解压 Zookeeper的环境变量配置
|
(3)配置4台机器的hosts文件
/etc/hosts
1 2 3 4
| 192.168.0.111 zk1 192.168.0.112 zk2 192.168.0.113 zk3 192.168.0.114 zk4
|
(4)创建zk持久化目录的文件夹data
(5)在data目录下创建并配置myid文件 内容分别为:1、2、3、4
(6)在conf目录下编写zoo.cfg文件
2888用于数据同步或节点间通信
3888用于leader选举投票
1 2 3 4 5 6 7 8 9
| tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.1-bin/data clientPort=2181 server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888 server.4=zk4:2888:3888:observer
|
(7)依次启动zk01、zk02、zk03、zk04,并观察各个节点的状态
(8)图解

2.2 基于K8s
1 2 3 4 5 6 7 8
| kubectl apply -f zk-cluster.yaml kubectl get pods -n zookeeper-cluster kubectl get pods -n zookeeper-cluster -o wide kubectl get svc -n zookeeper-cluster kubectl get statefulset -n zookeeper-cluster kubectl describe svc zk-client -n zookeeper-cluster kubectl exec -it zk-1 -n zookeeper-cluster /bin/bash zkServer.sh status
|
2.3 基于源码
(1)下载源码
https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1.tar.gz
(2)maven构建 打开源码文件的跟目录,执行如下命令
mvn clean install ‐DskipTests
(3)导入到idea中
(4)配置日志输出
a-将conf文件下的log.properties文件复制到zookeeper-server的resources文件夹下
b-在zookeeper-server的pom文件中添加slf4j的依赖
1 2 3 4 5 6
| <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency
|
(5)复制4个zoo文件
zoo-01.cfg
1 2 3 4 5 6 7 8 9
| tickTime=2000 initLimit=10 syncLimit=5 dataDir=D:\\install\\dev\\zookeeper\\zk01\\data clientPort=2191 server.1=127.0.0.1:2881:3881 server.2=127.0.0.1:2882:3882 server.3=127.0.0.1:2883:3883 server.4=127.0.0.1:2884:3884:observer
|
zoo-02.cfg
1 2 3 4 5 6 7 8 9
| tickTime=2000 initLimit=10 syncLimit=5 dataDir=D:\\install\\dev\\zookeeper\\zk02\\data clientPort=2192 server.1=127.0.0.1:2881:3881 server.2=127.0.0.1:2882:3882 server.3=127.0.0.1:2883:3883 server.4=127.0.0.1:2884:3884:observer
|
zoo-03.cfg
1 2 3 4 5 6 7 8 9
| tickTime=2000 initLimit=10 syncLimit=5 dataDir=D:\\install\\dev\\zookeeper\\zk03\\data clientPort=2193 server.1=127.0.0.1:2881:3881 server.2=127.0.0.1:2882:3882 server.3=127.0.0.1:2883:3883 server.4=127.0.0.1:2884:3884:observer
|
zoo-04.cfg
1 2 3 4 5 6 7 8 9
| tickTime=2000 initLimit=10 syncLimit=5 dataDir=D:\\install\\dev\\zookeeper\\zk04\\data clientPort=2194 server.1=127.0.0.1:2881:3881 server.2=127.0.0.1:2882:3882 server.3=127.0.0.1:2883:3883 server.4=127.0.0.1:2884:3884:observer
|
(7)在各自的data目录创建myid文件,并配置上1、2、3、4
(8)寻找启动入口类并配置
bin/zkServer.cmd 或 bin/zkServer.sh
也就是服务端启动的时候,会通过QuorumPeerMain进行启动
ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain