一 概述
ZooKeeper 主要服务于分布式系统,可以用 ZooKeeper 来做:统一配置管理、统一命名服务、分布式锁、集群管理。
Notes:
预先下载好 Java Runtime Environment 和 Zookeeper 安装介质。
二 具体操作
2.1 安装 Java 运行环境
# 1. 解压
tar xf jdk-19_linux-x64_bin.tar.gz -C /opt/
# 2. 配置环境变量
# 在 ~/.bashrc 文件中加入以下内容
export JAVA_HOME=/opt/jdk-19.0.2
export CLASS_PATH=${JAVA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
# 3. 检查是否生效
source ~/.bashrc
java --version
# 返回:
# java 19.0.2 2023-01-17
# Java(TM) SE Runtime Environment (build 19.0.2+7-44)
# Java HotSpot(TM) 64-Bit Server VM (build 19.0.2+7-44, mixed mode, sharing)
2.2 初始化系统环境
根据 Zookeeper 官方说明,运行 Zookeeper 的主机应该尽可能避免 Zookeeper 使用到 swap
。因为 Zookeeper 的事务日志会频繁的进行同步,如果使用到 swap,则可能会严重影响到 Zookeeper 的性能。当然也可以通过设置一个合理的 JVM Heap Size 也可以避免这种情况发生。而如果 Zookeeper 是独占的一台主机 (2C4G),可以直接把这台主机的系统 swap 进行关闭。
# 1. 临时关闭 Swap
swapoff -a
# 2. 取消自启
sed -i.bak '/swap/s/^/# /g' /etc/fstab
2.3 部署 Zookeeper 单机
# 1. 创建数据目录
mkdir -p /data/zookeeper
# 2. 解压
tar xf apache-zookeeper-3.8.1-bin.tar.gz -C /opt/
# 3. 定义配置文件
cd /opt/apache-zookeeper-3.8.1-bin/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
# 修改 zoo.cfg 内容为如下:
# tickTime=2000
# initLimit=10
# syncLimit=5
# dataDir=/data/zookeeper
# clientPort=2181
# clientPortAddress=0.0.0.0
# 4. 启动 Zookeeper 服务
cd /opt/apache-zookeeper-3.8.1-bin/bin
./zkServer.sh start
# 返回:
# ZooKeeper JMX enabled by default
# Using config: /opt/apache-zookeeper-3.8.1-bin/bin/../conf/zoo.cfg
# Starting zookeeper ... STARTED
# 5. 使用四字命令检查服务是否正常
echo srvr | nc localhost 2181
# 返回:
# Zookeeper version: 3.8.1-74db005175a4ec545697012f9069cb9dcc8cdda7, built on 2023-01-25 16:31 UTC
# Latency min/avg/max: 0/0.0/0
# Received: 1
# Sent: 0
# Connections: 1
# Outstanding: 0
# Zxid: 0x0
# Mode: standalone
# Node count: 5
zoo.cfg 配置文件参数解析:
- initLimit:表示用于在从节点与主节点之间建立初始化连接的时间上限。
- syncLimit:表示允许从节点与主节点处于不同步状态的时间上限
以上两个值都是 tickTime 的倍数,所以 initLimit 是
10*2000=20000ms
。
- dataDir:数据文件路径。
- clientPort:Zookeeper 服务端口。
- clientPortAddress:Zookeeper 服务侦听的 IP 地址。
三 集群部署
Zookeeper 集群被称为群组 。Zookeeper 使用的是一致性协议,所以建议每个群组里应该包含奇数个节点 (比如 3 个、5 个等),因为只有当群组里的大多数节点 (也就是法定人数) 处于可用状态,Zookeeper 才能处理外部的请求。也就是说,如果你有一个包含 3 个节点的群组,那么它允许一个节点失效。如果群组包含 5 个节点,那么它允许 2 个节点失效。
假设有一个包含 5 个节点的群组,如果要对群组做一些包括更换节点在内的配置更改,需要依次重启每一个节点。如果你的群组无法容忍多个节点失效,那么在进行群组维护时就会存在风险。不过,也不建议一个群组包含超过 7 个节点,因为 Zookeeper 使用了一致性协议,节点过多会降低整个群组的性能。
3.1 修改配置文件
部署完多个 Zookeeper 节点之后,只需要在 zoo.cfg
中添加对应的节点信息,然后重启即可。
cd /opt/apache-zookeeper-3.8.1-bin/conf
vim zoo.cfg
# 1. 为每个节点都加入以下内容:
server.1=10.10.0.1:2888:3888
server.2=10.10.0.2:2888:3888
server.3=10.10.0.3:2888:3888
# 2. 添加 myid 文件
echo 1 > /data/zookeeper/myid
# 3. 重启服务
cd /opt/apache-zookeeper-3.8.1-bin/bin
./zkServer.sh restart
zoo.cfg 配置文件参数解析:
Zookeeper 集群的服务器地址遵循server.X=hostname:peerPort:leaderPort
的格式:
- X:表示服务器的ID,必须为整数。不要求从0开始,也不要求连续。
- hostname:Zookeeper 的 IP 地址,或主机名。
- peerPort:Zookeeper 节点间通讯的 TCP 端口。
- leaderPort:Zookeeper 节点间用于选举 leader 的 TCP 端口。
注:
- 客户端只需要通过
clientPort
即可连接到 Zookeeper 集群,而集群节点之间的通过则需要同时用到peerPort,leaderPort,clientPort
三个端口。- 除了公共的配置文件外,每个服务器都必须在
dataDir
目录中创建一个叫作myid
的文件,文件里要包含服务器 ID,这个 ID 要与配置文件里配置的 ID 保持一致。因此会看到步骤中包含 添加 myid 文件 这一步。
3.2 测试集群
# 1. 登录任意一个 zk 节点
/opt/apache-zookeeper-3.8.1-bin/bin/zkCli.sh -server 10.10.0.1:2181
# 2. 创建一个 node
> create /foo bar
# Created /foo
> get /foo
# bar
# 3. 登录另一台 zk 节点
/opt/apache-zookeeper-3.8.1-bin/bin/zkCli.sh -server 10.10.0.2:2181
# 4. 查看同样的 node
> get /foo
# bar