快速部署ZooKeeper集群

简介

  • ZooKeeper: 1个开源的分布式应用程序协调服务,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。
  • ZooKeeper支持以单机模式安装运行,但它的长处在于通过分布式ZooKeeper集群(1Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。

环境

网址

  • JDK《传送门》
  • ZooKeeper《传送门》
  • 管理员指南:《传送门》

版本

  • OSCentOS 7.7Ubuntu 16.04
  • JDK1.8
  • ZooKeeper3.6.1

节点

  • ZooKeeper在提供分布式锁等服务的时候需要过半数的节点可用。
  • 高可用的本质:节点的个数必须大于1,所以ZooKeeper集群的节点个数必须为大于1的奇数节点。例如357等。
主机名 IP 应用
cluster-hadoop-01 172.18.20.3 ZooKeeper
cluster-hadoop-02 172.18.20.4 ZooKeeper
cluster-hadoop-03 172.18.20.5 ZooKeeper

角色

  • ZooKeeper的角色:领导者(Leader)、跟随者(Follower)和观察者(Observer)。
  • 领导者:为客户端提供读和写的服务,负责投票的发起和决议,更新系统状态。
  • 跟随者:为客户端提供读服务,如果是写服务则转发给Leader,在选举过程中参与投票。
  • 观察者:为客户端提供读服务器,如果是写服务则转发给Leader,在选举过程中不参与投票,也不参与过半写成功策略,在不影响写性能的情况下提升集群的读性能。

功能

  • ZooKeeper为分布式应用提供一致性服务,提供的功能包括:
    • 命名服务:Naming Service
    • 分布式锁:Distributed Lock
    • 集群维护:Group Maintenance
    • 分布式同步:Distributed Synchronization

部署

基础

CentOS

  • 关闭SELinux
1
2
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  • 关闭防火墙:
1
2
systemctl stop firewalld.service
systemctl disable firewalld.service

Common

  • 修改主机名:
1
echo "cluster-hadoop-01" > /etc/hostname
  • 内部解析:
1
2
3
4
echo '127.0.0.1 localhost' > /etc/hosts
echo '172.18.20.3 cluster-hadoop-01' >> /etc/hosts
echo '172.18.20.4 cluster-hadoop-02' >> /etc/hosts
echo '172.18.20.5 cluster-hadoop-03' >> /etc/hosts
  • 提示符:
1
echo 'export PS1="\u@\[\e[1;93m\]\h\[\e[m\]:\w\\$\[\e[m\] "' >> /root/.bashrc

JDK

ZooKeeper

  • Apache下载最新版本的ZooKeeper二进制文件。
  • 解压到指定目录:
1
2
tar -zxf apache-zookeeper-3.6.1-bin.tar.gz -C /opt/
mv -f /opt/apache-zookeeper-3.6.1-bin /opt/zookeeper-3.6.1
  • 创建软连接:
1
ln -sf /opt/zookeeper-3.6.1 /opt/zookeeper
  • 环境变量:
1
2
3
4
5
echo '' >> /etc/profile
echo '# ZooKeeper Home' >> /etc/profile
echo 'export ZOOKEEPER_HOME="/opt/zookeeper"' >> /etc/profile
echo 'export PATH="${PATH}:${ZOOKEEPER_HOME}/bin"' >> /etc/profile
source /etc/profile
  • 创建工作目录:
1
2
3
4
5
6
7
# 日志目录
mkdir -p /data/zookeeper/log
echo 'd /data/zookeeper/log 0770 root root' >> /usr/lib/tmpfiles.d/zookeeper.conf

# 数据目录
mkdir -p /data/zookeeper/data
echo 'd /data/zookeeper/data 0770 root root' >> /usr/lib/tmpfiles.d/zookeeper.conf
  • 编辑zoo.cfg
1
2
cp -a /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
vim /opt/zookeeper/conf/zoo.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# CS心跳通信间隔(毫秒)
tickTime=2000

# LF初始通信时限(心跳数):L与F之间初始连接时能容忍的最多心跳数
initLimit=30000

# LF同步通信时限(心跳数):L与F之间请求和应答过程能容忍的最多心跳数
syncLimit=10

# 单个客户端与单个成员建立的并发连接数
maxClientCnxns=2000

# 服务器允许客户端进行协商的最大会话超时时间(毫秒),默认为<tickTime>的20倍
maxSessionTimeout=60000000

# 数据文件目录
dataDir=/data/zookeeper/data

# 日志文件目录
dataLogDir=/data/zookeeper/log

# 自动清除功能:将最新快照和相应的事务日志分别保留在<dataDir>和<dataLogDir>中,并删除其余部分,默认值为<3>,最小值为<3>
autopurge.snapRetainCount=10

# 必须触发清除任务的时间间隔(小时),请设置为正整数(<1>或更大)以启用自动清除,默认为<0>。
autopurge.purgeInterval=1

# 为了避免查找,为事务日志文件中分配空间的大小(千字节的块),默认为<64M>
# 更改块大小的原因:若更频繁地拍摄快照,则减小块大小
preAllocSize=131072

# 快照数
snapCount=3000000

# L负责接受客户端连接,默认值为yes。Leader协调更新。为了获得较高的更新吞吐量,而以读取吞吐量为代价,可以将L配置为不接受连接,并专注于协调
leaderServes=yes

# 禁用standalone模式
standaloneEnabled=false

# 启用动态配置: 从3.5版本开始支持
reconfigEnabled=true

# 指定动态配置文件
dynamicConfigFile=/opt/zookeeper/conf/zoo.cfg.dynamic
  • 编辑zoo.cfg.dynamic
1
vim /opt/zookeeper/conf/zoo.cfg.dynamic
1
2
3
4
5
6
# server.<positive id>=<address>:<port>:<port>[:role];[<client address>:]<client port>
# role:角色,可选项,可选值有<participant>、<observer>,默认为<participant>
# client address: 可选项,默认为<0.0.0.0>
server.1=172.18.20.3:2888:3888:participant;0.0.0.0:2181
server.2=172.18.20.4:2888:3888:participant;0.0.0.0:2181
server.3=172.18.20.5:2888:3888:participant;0.0.0.0:2181
  • 编辑myid
1
2
# 每个节点将自己的<positive id>的值填入<dataDir>目录的<myid>文件中
echo "1" > /data/zookeeper/data/myid
  • 编辑zkEnv.sh
1
vim /opt/zookeeper/bin/zkEnv.sh
1
2
# 找到脚本中使用<JAVA_HOME>的地方,在其前面添加代码
JAVA_HOME="/opt/jdk"
  • 编辑zkServer.sh
1
vim /opt/zookeeper/bin/zkServer.sh
1
2
# 找到<ZOOMAIN>赋值的下方添加配置
ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"
  • 编辑system
1
vim /etc/systemd/system/zookeeper.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=ZooKeeper Service
Requires=network.target
After=network.target

[Service]
Type=forking
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg
Restart=always
StartLimitBurst=0

[Install]
WantedBy=default.target
  • 更改目录权限:
1
2
chown -R root:root /opt/zookeeper
chown -R root:root /opt/zookeeper-3.6.1
  • 同步到其他节点:
1
2
3
4
5
rsync -azPS --delete /opt/zookeeper-3.6.1 cluster-hadoop-02:/opt/
rsync -azPS --delete /opt/zookeeper-3.6.1 cluster-hadoop-03:/opt/

rsync -azPS --delete /etc/systemd/system/zookeeper.service cluster-hadoop-02:/etc/systemd/system/
rsync -azPS --delete /etc/systemd/system/zookeeper.service cluster-hadoop-03:/etc/systemd/system/
  • 启动服务:
1
2
systemctl start zookeeper.service
systemctl enable zookeeper.service
  • 获取服务状态:
1
2
systemctl status zookeeper.service
/opt/zookeeper/bin/zkServer.sh status
  • 获取版本信息:
1
echo stat | nc cluster-hadoop-01 2181
  • 客户端连接测试:
1
/opt/zookeeper/bin/zkCli.sh -server cluster-hadoop-01:2181

维护

动态扩容

  • 暂无。

排错

问题描述

  • 通过请求端口,获取版本信息时,有如下报错:
1
2
echo stat | nc cluster-hadoop-01 2181
stat is not executed because it is not in the whitelist.

解决过程

  • 查询后,发现是没在zkServer.sh中添加白名单的原因:
1
vim /opt/zookeeper/bin/zkServer.sh
1
2
# 找到脚本中<ZOOMAIN>被赋值的地方,在其后面添加代码
ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"

请作者喝瓶肥宅快乐水