Linux系统-部署-运维系列导航

 

zookeeper介绍

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
 
zookeeper集群包括3种角色:leader、follower、observer。
Leader是整个 zookeeper 集群的核心,主要的工作任务有两项:
  1. 事物请求的唯一调度和处理者,保证集群事物处理的顺序性。
  2. 集群内部各服务器的调度者。
 
Follower 角色主要职责是
  1. 处理客户端非事物请求、转发事物请求给 leader 服务器。
  2. 参与事物请求 Proposal 的投票(Leader 发起的提案,要求 Follower 投票,需要半数以上follower节点通过,leader才会commit数据。)
  3. 参与 Leader 选举的投票。
 
Observer 角色
Observer 是 zookeeper3.3 开始引入的一个全新的服务器角色,从字面来理解,该角色充当了观察者的角色。
  1. 观察 zookeeper 集群中的最新状态变化并将这些状态变化同步到 observer 服务器上。
  2. Observer 的工作原理与 follower 角色基本一致,而它和 follower 角色唯一的不同在于 observer 不参与任何形式的投票,包括事务请求Proposal的投票和leader选举的投票。
 
zookeeper集群工作流程
zookeeper集群只能有一个leader节点,由所有follower选举产生,只有leader节点才有权利发起修改数据的操作,而follower节点即使接收到了客户端发起的修改操作,也要将其转交给leader来处理,leader接收到修改数据的请求后,会向所有follower广播一条消息,让他们执行某项操作,follower 执行完后,便会向 leader 回复执行完毕。当 leader 收到半数以上的 follower 的确认消息,便会判定该操作执行完毕,然后向所有 follower 广播该操作已经生效。
 
zookeeper集群节点数量为奇数,建议至少3个节点。
关于集群数量,考虑以下几点:
1.容错率:需要保证集群能够有半数进行投票
  • 2台服务器,至少2台正常运行才行(2的半数为1,半数以上最少为2),正常运行1台服务器都不允许挂掉,但是相对于 单节点服务器,2台服务器还有两个单点故障,所以直接排除了。
  • 3台服务器,至少2台正常运行才行(3的半数为1.5,半数以上最少为2),正常运行可以允许1台服务器挂掉
  • 4台服务器,至少3台正常运行才行(4的半数为2,半数以上最少为3),正常运行可以允许1台服务器挂掉
  • 5台服务器,至少3台正常运行才行(5的半数为2.5,半数以上最少为3),正常运行可以允许2台服务器挂掉
 
2.防脑裂:脑裂集群的脑裂通常是发生在节点之间通信不可达的情况下,集群会分裂成不同的小集群,小集群各自选出自己的leader节点,导致原有的集群出现多个leader节点的情况,这就是脑裂。
  • 3台服务器,投票选举半数为1.5,一台服务裂开,和另外两台服务器无法通行,这时候2台服务器的集群(2票大于半数1.5票),所以可以选举出leader,而 1 台服务器的集群无法选举。
  • 4台服务器,投票选举半数为2,可以分成 1,3两个集群或者2,2两个集群,对于 1,3集群,3集群可以选举;对于2,2集群,则不能选择,造成没有leader节点。
  • 5台服务器,投票选举半数为2.5,可以分成1,4两个集群,或者2,3两集群,这两个集群分别都只能选举一个集群,满足zookeeper集群搭建数目。
基于以上分析,如果要搭建一个能够允许F台机器down掉的集群,那么就要部署2*F+1台服务器构成的 zookeeper 集群。
 

zookeeper安装

架构设计
机器名称  
IP
服务器角色
备注
localhost
192.168.11.63
zk节点0
CentOS7 + zk 3.7.0
localhost
192.168.11.66
zk节点1
CentOS7 + zk 3.7.0
localhost
192.168.11.72
zk节点2
CentOS7 + zk 3.7.0
 
 
组件安装操作步骤参考 组件安装部署手册模板,根据不同组件的安装目标,部分操作可以省略。
本文将按照该参考步骤执行。
 
zookeeper官方支持二进制安装。

一、获取组件可执行程序库,包括主程序,此为组件的基本文件

1.官网下载 zk安装包
创建目录 /usr/local/zookeeper,将源码包下载到该目录下,支持wget获取

 

2.安装依赖组件
 
3.解压安装
[root@localhost zookeeper]# tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
[root@localhost zookeeper]# cd apache-zookeeper-3.7.0-bin/
[root@localhost apache-zookeeper-3.7.0-bin]# ll
总用量 36
drwxr-xr-x 2 1000 1000  4096 3月  17 2021 bin
drwxr-xr-x 2 1000 1000    77 3月  17 2021 conf
drwxr-xr-x 5 1000 1000  4096 3月  17 2021 docs
drwxr-xr-x 2 root root  4096 2月  11 15:23 lib
-rw-r--r-- 1 1000 1000 11358 3月  17 2021 LICENSE.txt
-rw-r--r-- 1 1000 1000   432 3月  17 2021 NOTICE.txt
-rw-r--r-- 1 1000 1000  2214 3月  17 2021 README.md
-rw-r--r-- 1 1000 1000  3570 3月  17 2021 README_packaging.md

 

二、安装系统服务

zk默认没有安装系统服务,通过主程序运行。
人工安装系统服务,请参考本文附录部分。
 

三、主程序加入到环境变量

1..将zk目录添加到环境变量
[root@localhost bin]# vim /etc/profile
#zookeeper env
export ZK_HOME=/usr/local/zookeeper/apache-zookeeper-3.7.0-bin
export PATH=$PATH:$ZK_HOME/bin

[root@localhost bin]# source /etc/profile

 

2.关于创建软连接方案,由于zk主程序运行时依赖同目录下其他文件,所以需要将主程序相关的程序全部创建软连接,不建议采用此方案
 

四、配置文件

1.创建主配置文件
zk运行时自动查找与主目录 bin 同级目录 conf/zoo.cfg,默认安装后conf目录如下
[root@localhost conf]# ll
总用量 16
-rw-r--r-- 1 1000 1000  535 3月  17 2021 configuration.xsl
-rw-r--r-- 1 1000 1000 3435 3月  17 2021 log4j.properties

-rw-r--r-- 1 1000 1000 1148 3月  17 2021 zoo_sample.cfg
[root@localhost conf]# cp zoo_sample.cfg zoo.cfg

 

2.配置文件内容,63、66、72节点配置相同
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial synchronization phase can take
initLimit=10
# The number of ticks that can pass between sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
# the port at which the clients will connect
clientPort=8181
# the maximum number of client connections.increase this if you need to handle more clients
#maxClientCnxns=60

#zk集群
server.0=192.168.11.63:2888:3888
server.1=192.168.11.66:2888:3888
server.2=192.168.11.72:2888:3888

#zookeeper在运行过程中会生成快照数据,默认不会自动清理,会持续占用硬盘空间
# 保存3个快照,即3个日志文件
autopurge.snapRetainCount=3
# 间隔1个小时执行一次清理
autopurge.purgeInterval=1

 

配置说明
1.tickTime:基本事件单元,这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳;最小 的session过期时间为2倍tickTime
2.initLimit:允许follower连接并同步到Leader的初始化连接时间,以tickTime为单位。当初始化连接时间超过该值,则表示连接失败。
3.syncLimit:表示Leader与Follower之间发送消息时,请求和应答时间长度。如果follower在设置时间内不能与leader通信,那么此follower将会被丢弃。
4.dataDir:存储内存中数据库数据快照的位置。注意:不能使用 /tmp 路径,会被定期清除。使用专用的存储设备能够大大提高系统的性能。
5.dataLogDir:数据日志存储路径
6.clientPort:zk对外端口,即监听客户端连接的端口。
7.集群配置,格式为 server.A=B:C:D
    A:其中 A 是一个数字,表示这个是服务器的编号;
    B:是这个服务器的 ip 地址;
    C:Zookeeper服务器之间的通信端口;
    D:Leader选举的端口。
8.autopurge.snapRetainCount:zookeeper在运行过程中会生成快照数据,默认不会自动清理,会持续占用硬盘空间,配置保留的日志数量,默认为3
9.autopurge.purgeInterval:配置清理日志的间隔,单位小时

 

3.创建 myid 文件
在主配置文件 zoo.cfg 中指定的 dataDir 目录下,创建 myid 文件,文件内容为 zoo.cfg 集群配置 server.A=B:C:D 中的A,即配置如下
63 配置为 0
66 配置为 1
72 配置为 2

 

特别关注:配置文件中指定的所有路径,请在启动前确保已存在

 

五、运行用户

默认使用root运行即可。
 

六、开机启动

请参考教程 Linux开机启动方案 
 

七、服务启动运行

以主程序运行为例(已经将主目录添加环境变量)
1.启动
[root@localhost conf]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

 

2.查看节点状态(72为leader)
63
[root@localhost conf]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Client port found: 8181. Client address: localhost. Client SSL: false.
Mode: follower

66
[root@localhost conf]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Client port found: 8181. Client address: localhost. Client SSL: false.
Mode: follower

 72
[root@localhost conf]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Client port found: 8181. Client address: localhost. Client SSL: false.
Mode: leader

 

3.停止
[root@localhost conf]# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

 

4.重启
[root@localhost conf]# zkServer.sh restart
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

 

5.模拟集群故障
#停止72节点
[root@localhost conf]# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

#依次查看63、66节点状态,确认 66 选举为leader
[root@localhost conf]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Client port found: 8181. Client address: localhost. Client SSL: false.
Mode: leader

 

6.客户端验证
zk自带客户端工具 zkCli.sh,可以实现连接服务、数据增删改查等功能
#连接zk节点
[root@localhost conf]# zkCli.sh -server 192.168.11.72:8181  

#不带端口就采用默认2181端口                
[root@localhost conf]# zkCli.sh -server 192.168.11.72

#不带参数回车默认连接本地IP和2181端口                 
[root@localhost conf]# zkCli.sh                  

 

以下操作全部在 72 执行
#连接72节点
[root@localhost conf]# zkCli.sh -server 192.168.11.72:8181
#创建zk数据
[zk: 192.168.11.72:8181(CONNECTED) 2] create /hello world
Created /hello
#退出72
[zk: 192.168.11.72:8181(CONNECTED) 4] quit
#连接66
[root@localhost conf]# zkCli.sh -server 192.168.11.66:8181
#查询,确认66节点可以查询数据
[zk: 192.168.11.66:8181(CONNECTED) 0] get /hello
world

 

特别关注:系统默认启用了SELinux内核模块(安全子系统),所以在服务绑定/监听某些端口时,提示无访问权限,此时需要禁用SELinux,修改 /etc/selinux/config 文件,设置SELINUX=disabled
Can't start server: Bind on TCP/IP port: Permission denied
 
特别关注:selinux设置完成需要重启生效,如果当前不方便重启,可以执行 setenforce 0 临时关闭selinux,下次重启是配置再生效
 
特别关注:系统默认启用了防火墙,请在启动服务前关闭防火墙,或在防火墙中添加服务端口
 

附录:人工安装zookeeper系统服务

人工创建zookeeper.service文件,存放在 /usr/lib/systemd/system/下,文件内容如下,支持 service 命令:start、stop、restart、reload,最后执行 systemctl daemon-reload 刷新服务缓存即可
[Unit]
Description=Zookeeper service
After=network.target

[Service]
Type=forking
User=root
Group=root
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/jdk/jdk8u322-b06/bin"
ExecStart=/usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/zkServer.sh start
ExecStop=/usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/zkServer.sh stop
ExecStatus=/usr/local/zookeeper/apache-zookeeper-3.7.0-bin/bin/zkServer.sh status
Restart=on-failure

[Install]
WantedBy=multi-user.target

 

安装系统服务后,如果要支持设置开机启动,可以执行如下
systemctl enable/disable zookeeper 指令设置/取消开机启动
该方式实际是在 /etc/systemd/system/xxx/ 或 /etc/systemd/user/下创建 .service文件 的软连接,分别代表系统服务与用户服务。
其中,xxx为该服务的适用模式,如网络服务network-online.target.wants、多用户服务multi-user.target.wants。

 

附录:zkCli客户端支持操作

连接服务节点后,输入help即可
[zk: 192.168.11.66:8181(CONNECTED) 3] help
ZooKeeper -server host:port -client-configuration properties-file cmd args
    addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
    addauth scheme auth
    close 
    config [-c] [-w] [-s]
    connect host:port
    create [-s] [-e] [-c] [-t ttl] path [data] [acl]
    delete [-v version] path
    deleteall path [-b batch size]
    delquota [-n|-b] path
    get [-s] [-w] path
    getAcl [-s] path
    getAllChildrenNumber path
    getEphemerals path
    history 
    listquota path
    ls [-s] [-w] [-R] path
    printwatches on|off
    quit 
    reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
    redo cmdno
    removewatches path [-c|-d|-a] [-l]
    set [-s] [-v version] path data
    setAcl [-s] [-v version] [-R] path acl
    setquota -n|-b val path
    stat [-w] path
    sync path
    version 

 

附录:单节点zookeeper安装

将配置文件中以下配置项移除,移除 myid 文件,启动即可
server.0=192.168.11.63:2888:3888
server.1=192.168.11.66:2888:3888
server.2=192.168.11.72:2888:3888

 

附录:关于zookeeper占用8080端口

官方文档了解到,zookeeper从3.5.0版本后,默认启动一个内嵌的工具系统,由jetty启动,通过http提供服务,主要是执行一些管理和维护相关的指令,通过http返回结果。
该服务默认为8080端口,访问 http://192.168.11.72:8080/commands ,支持的操作如下
 

 比如查看服务器状态

 

特别关注
如果不需要该服务,或者其他服务需要使用8080端口,则可以通过以下操作解决
  • 修改端口,通过启动脚本参数 -Dzookeeper.admin.serverPort= 指定端口,也可以在 zoo.cfg 中增加 admin.serverPort= 指定端口
  • 禁用服务,通过启动脚本参数 -Dzookeeper.admin.enableServer= false,也可以在 zoo.cfg 中增加 admin.enableServer= false
  • 删除jetty,官方说明为“Removing Jetty from the classpath.”,实际路径为zookeeper安装目录下 lib 目录的jar包
[root@localhost apache-zookeeper-3.7.0-bin]# ll lib/jetty*.jar
-rw-r--r-- 1 1000 1000 221941 3月  17 2021 lib/jetty-http-9.4.38.v20210224.jar
-rw-r--r-- 1 1000 1000 170266 3月  17 2021 lib/jetty-io-9.4.38.v20210224.jar
-rw-r--r-- 1 1000 1000 118492 3月  17 2021 lib/jetty-security-9.4.38.v20210224.jar
-rw-r--r-- 1 1000 1000 710389 3月  17 2021 lib/jetty-server-9.4.38.v20210224.jar
-rw-r--r-- 1 1000 1000 145831 3月  17 2021 lib/jetty-servlet-9.4.38.v20210224.jar
-rw-r--r-- 1 1000 1000 571208 3月  17 2021 lib/jetty-util-9.4.38.v20210224.jar
-rw-r--r-- 1 1000 1000  65240 3月  17 2021 lib/jetty-util-ajax-9.4.38.v20210224.jar
 
该服务其他支持配置的参数如下

 

附录:参考资料

 

posted on 2023-09-05 13:54  xiaoyaozhe  阅读(439)  评论(0编辑  收藏  举报