Java安装
zookeeper依赖于Java环境,所以先自行安装JDK
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
或者二进制包安装。
zookeeper简介
参考: https://www.runoob.com/w3cnote/zookeeper-tutorial.html
ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。
ZooKeeper 的架构通过冗余服务实现高可用性。
Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
zookeeper 数据结构
zookkeeper 提供的名称空间非常类似于标准文件系统,key-value 的形式存储。名称 key 由斜线/分割的一系列路径元素,zookeeper 名称空间中的每个节点都是由一个路径标识。
zookeeper 相关 CAP 理论
CAP 理论指出对于一个分布式计算系统来说,不可能同时满足以下三点:
- 一致性:在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性,等同于所有节点访问同一份最新的数据副本。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致的状态。
- 可用性:每次请求都能获取到正确的响应,但是不保证获取的数据为最新数据。
- 分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。
一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。
在这三个基本需求中,最多只能同时满足其中的两项,P 是必须的,因此只能在 CP 和 AP 中选择,zookeeper 保证的是 CP,对比 spring cloud 系统中的注册中心 eruka 实现的是 AP。
zookeeper BASE 理论
BASE 是 Basically Available(基本可用)、Soft-state(软状态) 和 Eventually Consistent(最终一致性) 三个短语的缩写。
- 基本可用:在分布式系统出现故障,允许损失部分可用性(服务降级、页面降级)。
- 软状态:允许分布式系统出现中间状态。而且中间状态不影响系统的可用性。这里的中间状态是指不同的 data replication(数据备份节点)之间的数据更新可以出现延时的最终一致性。
- 最终一致性:data replications 经过一段时间达到一致性。
BASE 理论是对 CAP 中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
zookeeper单机部署
zookeeper有单机、伪集群、集群三种部署方式,可根据自己对可靠性的需求选择合适的部署方式
1-1、Linux服务器一台、三台、五台、(2*n + 1
),Zookeeper集群的工作是超过半数才能对外提供服务,3台中超过两台超过半数,允许1台挂掉 ,是否可以用偶数,其实没必要。
如果有四台那么挂掉一台还剩下三台服务器,如果在挂掉一个就不行了,这里记住是超过半数。
1-2、zookeeper是用java写的所以他的需要JAVA环境,java是运行在java虚拟机上的
1.1 下载
进入要下载的版本的目录,选择-bin.tar.gz
文件下载
下载链接:
https://downloads.apache.org/zookeeper/stable/
http://archive.apache.org/dist/zookeeper/
http://mirror.bit.edu.cn/apache/zookeeper/
https://zookeeper.apache.org/releases.html/
注意:这里下载bin的包
cd /usr/local/src
curl -O http://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
1.2 安装
使用tar解压要安装的目录即可,以3.6.3版本为例
这里以解压到/usr/local
,实际安装根据自己的想安装的目录修改(注意如果修改,那后边的命令和配置文件中的路径都要相应修改)
tar zxf apache-zookeeper-3.6.3-bin.tar.gz -C /usr/local/
1.3 配置
在主目录下创建data和logs两个目录用于存储数据和日志:
cd /usr/local/apache-zookeeper-3.6.3-bin/
mkdir {data,logs}
zoo_sample.cfg
这个文件是官方给我们的zookeeper的模板文件,复制一份命名为zoo.cfg,zoo.cfg是官方指定的文件命名规则:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/apache-zookeeper-3.6.3-bin/data
dataLogDir=/usr/local/apache-zookeeper-3.6.3-bin/logs
clientPort=2181
admin.serverPort=8080
#部署集群的时候使用
#server.1=192.168.137.7:2888:3888
#server.2=192.168.137.6:2888:3888
#server.3=192.168.137.5:2888:3888
#在zoo.cfg 进行配置
autopurge.snapRetainCount=60
autopurge.purgeInterval=48
参数解释:
#tickTime:
这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
#initLimit:
这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
#syncLimit:
这个配置项标识 Leader 与Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是5*2000=10秒
#dataDir:
快照日志的存储路径
#dataLogDir:
事物日志的存储路径,如果不配置这个那么事物日志会默认存储到dataDir制定的目录,这样会严重影响zk的性能,当zk吞吐量较大的时候,产生的事物日志、快照日志太多
#clientPort:
这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。修改他的端口改大点
#admin.serverPort:
管理后台端口
#server.1 :
这个1是服务器的标识也可以是其他的数字, 表示这个是第几号服务器,用来 标识服务器,这个标识要写到快照目录下面myid文件里192.168.137.7为集群里的IP地址,第一个端口是master和slave之间的通信端口,默认是2888,第二个端口是leader选举的端口,集群刚启动的时候选举或者leader挂掉之后进行新的选举的端口默认是3888
#4lw.commands.whitelist=* :
开启四字命令
zookeeper 的三个端口作用
-
1、2181 : 对 client 端提供服务
-
2、2888 : 集群内机器通信使用
-
3、3888 : 选举 leader 使用
1.4 启动和停止
进入bin
目录,启动、停止、重启分和查看当前节点状态(包括集群中是何角色)别执行:
./zkServer.sh --help
./zkServer.sh start-foreground #前台启动
./zkServer.sh start #后台启动
./zkServer.sh stop
./zkServer.sh restart
./zkServer.sh status
查看监听端口和进程
# ss -nutlp|egrep '2181|8080'
tcp LISTEN 0 50 [::]:2181 [::]:* users:(("java",pid=9511,fd=59))
tcp LISTEN 0 50 [::]:8080 [::]:* users:(("java",pid=9511,fd=51))
# ps aux|grep zookeeper
# jps
9752 QuorumPeerMain
9789 Jps
1.5 配置环境变量并使环境变量立即生效
# vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/apache-zookeeper-3.6.3-bin
export PATH=$ZOOKEEPER_HOME/bin:$PATH
# source /etc/profile
1.6 systemctl管理zookeeper
# cat > /usr/lib/systemd/system/zookeeper.service << EOF
[Unit]
Description=zookeeper server
After=network.target
[Service]
User=root
Group=root
Type=forking
ExecStart=/usr/local/apache-zookeeper-3.6.3-bin/bin/zkServer.sh --config /usr/local/apache-zookeeper-3.6.3-bin/conf start
ExecStop=/usr/local/apache-zookeeper-3.6.3-bin/bin/zkServer.sh --config /usr/local/apache-zookeeper-3.6.3-bin/conf stop
ExecRestart=/usr/local/apache-zookeeper-3.6.3-bin/bin/zkServer.sh --config /usr/local/apache-zookeeper-3.6.3-bin/conf restart
Restart=on-failure
RestartPreventExitStatus=1
RestartSec=10
StartLimitInterval=300
StartLimitBurst=2
TimeoutStartSec=30
TimeoutStopSec=30
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
zookeeper伪集群模式
伪集群模式就是在同一主机启动多个zookeeper并组成集群,下边以在192.168.137.7主机上创3个zookeeper组集群为例。
将通过第一大点安装的zookeeper单机,复制成zookeeper1/zookeeper2/zookeeper3三份
2.1 zookeeper1配置
zookeeper1配置文件conf/zoo.cfg修改如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper1/data
dataLogDir=/usr/local/zookeeper1/logs
clientPort=2181
admin.serverPort=8080
#部署集群的时候使用
server.1=192.168.137.7:2888:3888
server.2=192.168.137.7:4888:5888
server.3=192.168.137.7:6888:7888
zookeeper1的data/myid配置如下:
echo '1' > /usr/local/zookeeper1/data/myid
============================================================================
sever.数字
,这个数字是myid,如果不与myid对应启动会报错My id 6 not in the peer list
192.168.137.7:2888:3888
,是主机名与端口号
2.2 zookeeper2配置
zookeeper2配置文件conf/zoo.cfg修改如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper2/data
dataLogDir=/usr/local/zookeeper2/logs
clientPort=3181
admin.serverPort=8080
#部署集群的时候使用
server.1=192.168.137.7:2888:3888
server.2=192.168.137.7:4888:5888
server.3=192.168.137.7:6888:7888
zookeeper2的data/myid配置如下:
echo '2' > data/myid
2.3 zookeeper3配置
zookeeper3配置文件conf/zoo.cfg修改如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper3/data
dataLogDir=/usr/loca/zookeeper3/logs
clientPort=4181
admin.serverPort=8080
#部署集群的时候使用
server.1=192.168.137.7:2888:3888
server.2=192.168.137.7:4888:5888
server.3=192.168.137.7:6888:7888
zookeeper3的data/myid配置如下:
echo '3' > data/myid
最后把三个zookeeper都启动即可,启动顺序随意没要求。全部节点启动完成就不会报错哈,因为在连接集群,所以日志里面有相关错误信息
zookeeper集群模式
集群模式就是在不同主机上安装zookeeper然后组成集群的模式;下边以在192.168.137.7/6/5三台主机为例。
安装好的zookeeper复制到6和5上:
scp -r apache-zookeeper-3.6.3-bin/ 192.168.137.6:/usr/local/
scp -r apache-zookeeper-3.6.3-bin/ 192.168.137.5:/usr/local/
3.1 conf/zoo.cfg文件修改
三个zookeeper的conf/zoo.cfg修改如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/apache-zookeeper-3.6.3-bin/data
dataLogDir=/usr/local/apache-zookeeper-3.6.3-bin/logs
clientPort=2181
admin.serverPort=8080
#部署集群的时候使用
server.1=192.168.137.7:2888:3888
server.2=192.168.137.6:2888:3888
server.3=192.168.137.5:2888:3888
对于6和5,由于安装目录都是apache-zookeeper-3.6.3-bin所以dataDir和dataLogDir不需要改变,又由于在不同机器上所以clientPort也不需要改变,所以此时6和5的conf/zoo.cfg的内容与7一样即可。
3.2 data/myid文件修改
7的机器上 data/myid修改如下:
echo '1' > data/myid
6的机器上 data/myid修改如下:
echo '2' > data/myid
5的机器上 data/myid修改如下:
echo '3' > data/myid
最后把三个zookeeper都启动即可,启动顺序随意没要求。全部节点启动完成就不会报错哈,因为在连接集群,所以日志里面有相关错误信息
最后显示集群搭建成功!Mode:leader 代表主节点,follower 代表从节点,一主二从。
选举状态:https://www.runoob.com/w3cnote/zookeeper-leader.html
- LOOKING: 竞选状态
- FOLLOWING: 随从状态,同步 leader 状态,参与投票
- OBSERVING: 观察状态,同步 leader 状态,不参与投票
- LEADING: 领导者状态
docker环境搭建zk集群
https://hub.docker.com/_/zookeeper
下载zk镜像
docker pull zookeeper:3.7.0
Docker运行的环境变量
https://hub.docker.com/_/zookeeper?tab=description
https://www.cnblogs.com/yorkwu/p/9858306.html
如果zoo.cfg未提供文件,则使用ZooKeeper推荐的默认值。可以使用以下环境变量覆盖它们。
$ docker run -e "ZOO_INIT_LIMIT=10" --name some-zookeeper --restart always -d zookeeper:3.4
ZOO_TICK_TIME
默认为2000。zk的tickTime,以毫秒为单位。
ZK中所有时间都是以这个时间单元为基础,进行整数倍配置。
ZOO_INIT_LIMIT
默认为5。zk的initLimit。
Zookeeper等待客户端初始化连接的响应时,最长能等待多少个tickTime。例如默认设置为 5,表示超过5个心跳的时间(也就是ZOO_TICK_TIME)长度后 ,Zookeeper 服务器还没有收到客户端的返回信息,就认为这个客户端连接失败。总的超时时间等于ZOO_INIT_LIMITZOO_TICK_TIME=52000=10000毫秒
ZOO_SYNC_LIMIT
默认为2。zk的syncLimit
Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime。例如默认设置为2,表示超过2个心跳的时间(也就是ZOO_TICK_TIME)长度后 ,Leader 与 Follower通信超时。
ZOO_MAX_CLIENT_CNXNS
默认为60。zk的maxClientCnxns
单个客户端与单台zk服务器之间的连接数的限制,是ip级别的,如果设置为0,那么表明不作任何限制。
ZOO_STANDALONE_ENABLED
Defaults to true. Zookeeper\'s standaloneEnabled
Prior to 3.5.0, one could run ZooKeeper in Standalone mode or in a Distributed mode. These are separate implementation stacks, and switching between them during run time is not possible. By default (for backward compatibility) standaloneEnabled is set to true. The consequence of using this default is that if started with a single server the ensemble will not be allowed to grow, and if started with more than one server it will not be allowed to shrink to contain fewer than two participants.
ZOO_ADMINSERVER_ENABLED
Defaults to true. Zookeeper\'s admin.enableServer
The AdminServer is an embedded Jetty server that provides an HTTP interface to the four letter word commands. By default, the server is started on port 8080, and commands are issued by going to the URL \"/commands/[command name]\", e.g., http://localhost:8080/commands/stat.
ZOO_AUTOPURGE_PURGEINTERVAL
Defaults to 0. Zookeeper\'s autoPurge.purgeInterval
The time interval in hours for which the purge task has to be triggered. Set to a positive integer (1 and above) to enable the auto purging. Defaults to 0.(0表示不自动清除)
ZOO_AUTOPURGE_SNAPRETAINCOUNT
Defaults to 3. Zookeeper\'s autoPurge.snapRetainCount
When enabled, ZooKeeper auto purge feature retains the autopurge.snapRetainCount most recent snapshots and the corresponding transaction logs in the dataDir and dataLogDir respectively and deletes the rest. Defaults to 3. Minimum value is 3.
ZOO_4LW_COMMANDS_WHITELIST
Defaults to srvr. Zookeeper\'s 4lw.commands.whitelist
A list of comma separated Four Letter Words commands that user wants to use. A valid Four Letter Words command must be put in this list else ZooKeeper server will not enable the command. By default the whitelist only contains \"srvr\" command which zkServer.sh uses. The rest of four letter word commands are disabled by default.
Advanced configuration
ZOO_CFG_EXTRA
Not every Zookeeper configuration setting is exposed via the environment variables listed above. These variables are only meant to cover minimum configuration keywords and some often changing options. If mounting your custom config file as a volume doesn\'t work for you, consider using ZOO_CFG_EXTRA environment variable. You can add arbitrary configuration parameters to Zookeeper configuration file using this variable. The following example shows how to enable Prometheus metrics exporter on port 7070:
$ docker run --name some-zookeeper --restart always -e ZOO_CFG_EXTRA="metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider metricsProvider.httpPort=7070" zookeeper
复制模式
如果要以复制模式运行Zookeeper,则必须使用下面的环境变量。
ZOO_MY_ID
id必须在整体中是唯一的,并且应该具有介于1和255之间的值。请注意,如果使用/data已包含该myid文件的目录启动容器,则此变量不会产生任何影响。
ZOO_SERVERS
此变量允许您指定Zookeeper集合的计算机列表。每个条目都有server.id=host:port:port。参赛作品以空格分隔。请注意,如果使用/conf已包含该zoo.cfg文件的目录启动容器,则此变量不会产生任何影响。
3.4 数据的存储位置
/data和/datalog分别用来保存内存数据库的快照和更新数据库的事务日志。
放置事务日志的位置要考虑对性能的影响。专用的事务日志设备保持良好性能的关键。将日志置于繁忙的设备上会对性能产生负面影响。
生产环境中zookeeper的数据文件需要保证持久性,可通过挂载数据目录到Gluster FS Volume。
构建zk集群(我草zookeeper:3.6.3镜像有bug,连接集群报错,搞了一天,升级到Apache ZooKeeper, version 3.7.0就ok了。)
192.168.137.7执行:目前zookeeper是3.7.0
docker run -itd \
--name zookeeper_cluster_1 \
--privileged=true \
--restart always \
-p 2181:2181 -p 2888:2888 -p 3888:3888 \
-v /data/zookeeper-cluster/data:/data \
-v /data/zookeeper-cluster/datalog:/datalog \
-v /data/zookeeper-cluster/logs:/logs \
-e ZOO_MY_ID=1 \
-e ZOO_SERVERS="quorumListenOnAllIPs:true server.1=192.168.137.7:2888:3888;2181 server.2=192.168.137.6:2888:3888;2181 server.3=192.168.137.5:2888:3888;2181" \
zookeeper
192.168.137.6执行:
docker run -itd \
--name zookeeper_cluster_2 \
--privileged=true \
--restart always \
-p 2181:2181 -p 2888:2888 -p 3888:3888 \
-v /data/zookeeper-cluster/data:/data \
-v /data/zookeeper-cluster/datalog:/datalog \
-v /data/zookeeper-cluster/logs:/logs \
-e ZOO_MY_ID=2 \
-e ZOO_SERVERS="quorumListenOnAllIPs:true server.1=192.168.137.7:2888:3888;2181 server.2=192.168.137.6:2888:3888;2181 server.3=192.168.137.5:2888:3888;2181" \
zookeeper
192.168.137.5执行:
docker run -itd \
--name zookeeper_cluster_3 \
--privileged=true \
--restart always \
-p 2181:2181 -p 2888:2888 -p 3888:3888 \
-v /data/zookeeper-cluster/data:/data \
-v /data/zookeeper-cluster/datalog:/datalog \
-v /data/zookeeper-cluster/logs:/logs \
-e ZOO_MY_ID=3 \
-e ZOO_SERVERS="quorumListenOnAllIPs:true server.1=192.168.137.7:2888:3888;2181 server.2=192.168.137.6:2888:3888;2181 server.3=192.168.137.5:2888:3888;2181" \
zookeeper
查看集群
查看zk1(follower)
echo stat | nc 127.0.0.1 2181
./zkServer.sh status #也可以查看
zookeeper基本命令使用
以下命令不管是单机、伪集群、集群模式都适用;伪集群和集群模式随便连接其中一个zookeeper即可。
进入zookeeper的bin目录,使用zkCli连接zookeeper:
./zkCli.sh
[zk: localhost:2181(CONNECTED) 0]
# 默认连接localhost:2181,如需指定ip和端口可使用如下形式。
# ./zkCli.sh -server 192.168.137.7:2181
#如果有多个server用逗号隔开
# ./zkCli.sh -server 192.168.137.7:2181,192.168.137.6:2181,192.168.137.5:2181
以下是zkCli中的简单命令使用示例,总的而言zookeeper的组织结构类似于linux的目录结构:
# 查看所有支持的命令。其实输入任一条不支持的命令都会打印帮助
help
# 查看目录下有哪些节点。以根目录为例
[zk: localhost:2181(CONNECTED) 2] ls
ls [-s] [-w] [-R] path
[zk: localhost:2181(CONNECTED) 3] ls /
[zookeeper]
# 创建一个节点。
# 加-s表示创建顺序节点,即会自动在给定的路径后面再加上一个数字串,保证路径不重复。
# 默认是持久节点,加-e是临时节点
#创建节点时,必须要带上全路径
[zk: localhost:2181(CONNECTED) 4] create /example_path "example_data"
Created /example_path
[zk: localhost:2181(CONNECTED) 5] ls /
[example_path, zookeeper]
# 查看节点内容
# 返回第一行即是节点的内容,如果第一行空白或null那就说明该节点创建时就没有值
# 后续的cZxid到numChildren都是该节点的一些属性信息;其中numChildren标识该节点下有多少个子节点
[zk: localhost:2181(CONNECTED) 6] get /example_path
example_data
# 删除一个没有子节点的节点
[zk: localhost:2181(CONNECTED) 7] delete /example_path
[zk: localhost:2181(CONNECTED) 8] ls /
[zookeeper]
# 退出zkCli
quit
Zookeeper 日志清理
https://www.cnblogs.com/baozexu/p/14713245.html
3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能
1.自动清理
#在zoo.cfg 进行配置
autopurge.snapRetainCount=60
autopurge.purgeInterval=48
# 指定每隔48小时清理一次zookeeper事务日志,防止事务日志过多占用空间,清理后保留最近60份
2 .手动清理
zkCleanup.sh -n 60 #清理后保留最近60份
#直接-n 指定保留的文件数即可,不需要指定目录,因为配置文件中已经写了
Zookeeper 备份 恢复
注意该备份工具不支持权限认证
git clone https://github.com/boundary/zoocreeper.git
1、将项目clone 下来之后进行maven 编译
mvn clean package
2、要查看创建备份的可用选项
$ java -jar target/zoocreeper-1.0-SNAPSHOT.jar --help
3、要查看还原备份的可用选项,请运行:
$ java -cp target/zoocreeper-1.0-SNAPSHOT.jar \
com.boundary.zoocreeper.Restore --help
示例:
./zoocreeper dump -z 127.0.0.1 > dumpfile.json # 备份
$ cat dumpfile.json | ./zoocreeper load -z 127.0.0.1 #恢复
由于命令备份太过简单 写了shell脚本 进行封装
备份
#!/bin/bash
Date=$(date +%F-%H-%M)
Dest=/backup
IP=10.7.255.222
Path=/root/zoocreeper
[ -d $Dest/ ] || mkdir -p $Dest/
sh $Path/zoocreeper dump -z $IP > $Dest/zk_backup_${Date}.json
恢复
#!/bin/bash
Dest=/backup
Path=/root/zoocreeper
read -p "【是否进行恢复[Y/N]】" Action
case $Action in
Y)
read -p "【请输入zk的链接地址】" IP
read -p "【请输入备份数据的日期 示例:2021-04-23-19-22】" Date
cd $Dest/ \
if [ ! -f zk_backup_${Date}.json ];then
echo "备份文件不存在"
else
cat zk_backup_${Date}.json | sh $Path/zoocreeper load -z $IP
fi
;;
N)
exit 1
esac
Zookeeper 四字命令
参考: http://www.runoob.com/w3cnote/zookeeper-sc-4lw.html
zookeeper 支持某些特定的四字命令与其交互,用户获取 zookeeper 服务的当前状态及相关信息,用户在客户端可以通过telenet
或者nc
(netcat) 向 zookeeper 提交相应的命令。
安装 nc 命令:
$ yum install nc # centos
或
$ sudo apt install netcat # ubuntu
四字命令格式:
echo [command] | nc [ip] [port]
ZooKeeper 常用四字命令主要如下:
四字命令 | 功能描述 |
---|---|
conf | 3.3.0版本引入的。打印出服务相关配置的详细信息。 |
cons | 3.3.0版本引入的。列出所有连接到这台服务器的客户端全部连接/会话详细信息。包括"接受/发送"的包数量、会话id、操作延迟、最后的操作执行等等信息。 |
crst | 3.3.0版本引入的。重置所有连接的连接和会话统计信息。 |
dump | 列出那些比较重要的会话和临时节点。这个命令只能在leader节点上有用。 |
envi | 打印出服务环境的详细信息。 |
reqs | 列出未经处理的请求 |
ruok | 测试服务是否处于正确状态。如果确实如此,那么服务返回"imok",否则不做任何相应。 |
stat | 输出关于性能和连接的客户端的列表。 |
srst | 重置服务器的统计。 |
srvr | 3.3.0版本引入的。列出连接服务器的详细信息 |
wchs | 3.3.0版本引入的。列出服务器watch的详细信息。 |
wchc | 3.3.0版本引入的。通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表。 |
wchp | 3.3.0版本引入的。通过路径列出服务器watch的详细信息。它输出一个与session相关的路径。 |
mntr | 3.4.0版本引入的。输出可用于检测集群健康状态的变量列表 |
参考官方链接:https://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_4lw
zk配置用户身份验证和访问控制列表
Zookeeper 默认不启用身份验证和权限控制,为了确保 Zookeeper 的安全性,可以配置用户身份验证和访问控制列表。下面介绍一种使用 digest 方式的身份验证方式,即为 Zookeeper 设置密码。
创建一个用户并设置密码,首先需要在 Zookeeper 配置文件中添加如下两行配置:
authProvider.1=org.apache.zookeeper.server.auth.DigestAuthenticationProvider
requireClientAuthScheme=digest
然后可以使用addauth
命令添加用户:
$ bin/zkCli.sh -server localhost:2181
...
[zk: localhost:2181(CONNECTED) 0] addauth digest username:password
其中,username:password
表示要设置的用户名和密码,需要注意的是,这里的明文密码将会以base64编码后保存在 Zookeeper 中。
配置访问控制列表
在 Zookeeper 节点上可以通过配置访问控制列表 (ACLs) 来限制客户端的访问,并授权特定用户或组对节点执行特定操作。ACL 由三部分组成:权限模式、授权对象和权限。例如,下面的 ACL 允许用户 admin 对 /foo/bar 节点进行读写操作:
digest:admin:password:crwda
其中,digest 表示使用 digest 方式进行身份验证,admin 表示用户名,password 表示密码(需要在明文密码前添加password: 前缀
),后面的 crwda 表示授权对象可以执行的权限(c 表示创建、r 表示读取、w 表示写入、d 表示删除、a 表示管理权限)。
要配置 ACL,可以通过setAcl
命令执行,例如:
[zk: localhost:2181(CONNECTED) 1] setAcl /foo/bar digest:admin:password:crwda
这条命令将 /foo/bar 节点的 ACL 设置为了上述示例中的 ACL。
需要注意的是,设置密码和 ACL 只是 Zookeeper 安全控制的一部分,还需要在应用程序中使用正确的身份验证信息,并根据需要控制访问权限,以确保 Zookeeper 的安全性。
通过防火墙控制zk
Zookeeper 是分布式应用程序协调服务的重要组件之一,可以用于管理配置信息、命名服务、集群管理等。为了保证 Zookeeper 的安全性和稳定性,有时候需要通过 iptables 控制对 Zookeeper 的访问。
下面是一些具体的 iptables 规则示例,可以用来控制对 Zookeeper 的访问:
允许本地服务器访问 Zookeeper
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 2181 -j ACCEPT
这条规则允许从本地主机(即 127.0.0.1)访问 Zookeeper,要求使用 TCP 协议,目标端口为 2181。
允许指定 IP 地址范围访问 Zookeeper
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 2181 -j ACCEPT
这条规则允许指定 IP 地址范围(例如 192.168.1.0/24)的主机访问 Zookeeper,要求使用 TCP 协议,目标端口为 2181。
这条规则允许 IP 地址在 192.168.1.0 到 192.168.1.255 范围内的主机访问 Zookeeper,要求使用 TCP 协议,目标端口为 2181。其中,-A INPUT 表示添加规则到 INPUT 链;-s 192.168.1.0/24 表示源地址为 192.168.1.0/24,即一个以 192.168.1 开头的 C 类网络;-p tcp 表示使用 TCP 协议;--dport 2181 表示目标端口为 2181;-j ACCEPT 表示接受匹配的数据包。
需要注意的是,iptables 规则是按顺序执行的,因此需要确保该规则位于任何拒绝访问的规则之前。如果有多个允许访问的规则,应当按照具体的实现需要进行适当地排序和配置。
允许所有主机访问 Zookeeper
iptables -A INPUT -p tcp --dport 2181 -j ACCEPT
这条规则允许所有主机访问 Zookeeper,要求使用 TCP 协议,目标端口为 2181。但是需要注意的是,这种无限制的访问方式可能存在安全隐患,需要谨慎使用。
拒绝所有主机访问 Zookeeper
iptables -A INPUT -p tcp --dport 2181 -j DROP
这条规则禁止所有主机访问 Zookeeper,要求使用 TCP 协议,目标端口为 2181。在实际应用中,可以根据具体的需要,调整该规则,例如允许某些 IP 地址范围的主机访问,或者允许本地主机访问等。
需要注意的是,以上规则只是一些示例,具体如何控制对 Zookeeper 的访问,需要根据实际情况进行调整。此外,在修改 iptables 规则时,需要确保不会影响到其他服务的正常运行,建议先在测试环境进行验证,然后再应用到生产环境中。
免责声明: 本文部分内容转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。