Zookeeper集群

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


Zookeeper集群
http://www.zivjie.cn/2023/03/19/中间件/zookeeper/Zookeeper集群/
作者
Francis
发布于
2023年3月19日
许可协议