shoufeng

瘦风的南墙

ZooKeeper 03 - CentOS 7 中搭建 ZooKeeper 集群环境

始发于 2018-08-05,修改于 2021-12-06。

上一篇简单写了下 CentOS 服务器上搭建单机版 ZooKeeper 服务的过程(https://www.cnblogs.com/shoufeng/p/10591508.html),这篇来写写搭建集群的步骤。

1 - 准备安装包

1.1 下载安装包并解压

ZooKeeper 下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.8

# 下载后上传至特定目录,这里上传至/data:
mkdir /data && cd /data
# 解压 ZooKeeper 安装包:
tar -zxf zookeeper-3.5.8.tar.gz
# 重命名文件夹名称:
mv zookeeper-3.5.8.tar.gz zookeeper

1.2 创建data和datalog目录

# 进入ZooKeeper安装目录
cd /data/zookeeper

# data 为 ZooKeeper 数据存放目录,datalog 为 ZooKeeper 日志存放目录,若不指定datalog,默认和数据存放目录一致
mkdir data datalog

# 赋予当前用户写权限
chmod 644 data datalog 

1.3 创建 myid 文件

在 data 目录下创建 myid 文件,文件中只包含一行内容:该节点对应的 server.id 的编号。 如 server.1 节点中 myid 文件的内容为1。

# 将编号写入到myid文件中
echo 1 > /data/zookeeper/data/myid

# 查看写入是否成功
cat /data/zookeeper/data/myid

1.4 修改配置文件 zoo.cfg

(1) 修改过程如下:

cd /data/zookeeper/conf

# 拷贝文件,重命名为zoo.cfg
cp zoo_sample.cfg zoo.cfg

# 修改zoo.cfg文件:
vim zoo.cfg

# 添加如下内容:
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/datalog
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888

(2) 配置完成的 zoo.cfg 文件如下:

  # 基本事件单元(毫秒),用来控制心跳和超时
  tickTime=2000 
  
  # 集群中有多台Server,其中一台为Leader,其余Server为Follower。 initLimit参数指定Follower连接并同步到Leader的初始化心跳时间(即最长通信时间),以tickTime的倍数表示,超过该时间则连接失败
  initLimit=5
  
  # Leader与Follower之间发送消息时,请求和应答的最大时间,是tickTime的倍数。 如果Follower在设置的时间内不能与Leader建立通信,此Follower将被丢弃
  syncLimit=2
  
  # 存放ZooKeeper运行时数据的目录,需要提前建立
  dataDir=/data/zookeeper/data
  
  # log目录,如果没有设置该参数,默认使用dataDir的目录,需要提前建立
  # 应当谨慎选择日志目录,使用专用的日志存储设备能很大程度提高系统的性能
  dataLogDir=/data/zookeeper/datalog
  
  # 监听client连接的端口号 
  clientPort=2181
  
  # 设置连接到ZooKeeper的客户端的最大数量(限制并发连接的数量,它通过IP来区分不同的客户端)。 此配置选项可以用来阻止某些类别的Dos攻击,将它设置为0或不设置将会取消对并发连接的限制
  maxClientCnxns=0
  
  # 最小的会话超时时间,默认为 2 * tickTme 时间
  minSessionTimeout=4000
  
  # 最大的会话超时时间默认情况下为 20 倍的会话超时时间
  maxSessionTimeout=10000
  
  # 集群中各个节点的信息(server。id=ip:port1:port2)
  server.1=zoo1:2888:3888 
  server.2=zoo2:2888:3888 
  server.3=zoo3:2888:3888

(3) 关于 server.id=host:port1:port2 的说明:

id 是每个 ZooKeeper 节点的编号,保存在 dataDir 目录下的 myid 文件中;

zoo1~zoo3 表示各个 ZooKeeper 节点的 hostname 或 IP 地址,映射关系在系统文件 /etc/hosts 中设置;

port1 指定该 Server 与集群中的 Leader 通信所使用的端口;

port2 指定集群选举 Leader 时所用的端口。

(4) 常见错误说明:

clientPort 不能与 port1、port2 相同,否则集群将启动失败。

○ 若采用伪分布式配置方式(即在一台服务器上模拟部署多个 ZK 节点),则各个 Server 的 port1 与 port2 不能相同。

○ 如果采用伪分布式配置方式,dataDir 与 dataLogDir 目录也需要设置成不同的,否则数据和日志文件读取会出现冲突。

2 - 部署其他节点上的服务

# 拷贝ZooKeeper文件夹到其他服务器(zoo2和zoo3) --- 需要确保相应的路径/data/zookeeper存在:
scp -r /data/zookeeper zoo2:/data/
scp -r /data/zookeeper zoo2:/data/

# 分别在zoo2和zoo3服务器上修改ZooKeeper的myid:
echo 2 > /data/zookeeper/data/myid
echo 3 > /data/zookeeper/data/myid

3 - 启动 ZooKeeper 集群

3.1 关闭防火墙

ZooKeeper 客户端使用 2181 端口,为了外部服务能正常访问 Zookeeper 服务,需要开放 2181 端口号,或者关闭防火墙:

(1) CentOS 7之前系统的命令:

# 查看防火墙状态:
service iptable status

# 临时关闭防火墙:
service iptables stop

# 永久关闭防火墙(禁止开机启动):
chkconfig iptables off

(2) CentOS 7 开始使用systemctl来管理服务和程序,包括servicechkconfig

# 查看防火墙状态:
systemctl status firewalld。service

# 临时关闭防火墙:
systemctl stop firewalld。service

# 永久关闭防火墙(禁止开机启动):
systemctl disable firewalld。service 

3.2 启动 ZooKeeper 集群

(1) 启动步骤:

# 依次进入三台服务器,执行下述命令:
cd /data/zookeeper/bin
./zkServer.sh start

# 查看 ZooKeeper 运行状态:
./zkServer.sh status

(2) 常见错误:在查看 ZooKeeper 的状态时,可能会发现错误信息:

[root@localhost bin]# ./zkServer.sh status
JMX enabled by default 
Using config: /data/zookeeper/bin/../conf/zoo.cfg 
Error contacting service. It is probably not running 
  • 错误原因:这里部署的是集群,其他服务器尚未启动,当前节点在根据 zoo.cfg 中配置的服务列表发起选举 Leader 的请求,由于无法与集群中的其他节点进行通信,所以抛出错误。

  • 错误解决:在启动第二台 ZooKeeper 服务后,Leader 将被选出,错误就会消失。 因为在 ZooKeeper 集群中,如果有 2n+1 台服务器,它允许n台服务挂掉而不影响服务。


版权声明

作者:瘦风(https://healchow.com)

出处:博客园-瘦风的南墙(https://www.cnblogs.com/shoufeng)

感谢阅读,公众号 「瘦风的南墙」 ,手机端阅读更佳,还有其他福利和心得输出,欢迎扫码关注🤝

本文版权归博主所有,欢迎转载,但 [必须在页面明显位置标明原文链接],否则博主保留追究相关人士法律责任的权利。

posted @ 2018-12-08 19:55  瘦风  阅读(6650)  评论(0编辑  收藏  举报