zk

1 简介

zookeeper是一个为分布式应用所设计的分布式的、开源的协调服务。它提供了一项基本服务:分布式锁服务,同时也提供了分布式应用数据的维护和管理机制,包括统一命名服务、状态同步服务、集群管理、分布式消息队列、分布式应用配置项的管理等。zookeeper支持独立安装以及集群部署。

zookeeper官方网站:http://zookeeper.apache.org/

zookeeper下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/

2 架构

Zookeeper集群主要角色有Server和Client,其中Server分为Leader、Follower和Observer三个角色:

  • Leader:领导者角色,主要负责投票的发起和决议,以及更新系统状态

  • Follower:跟随者角色,用于接收客户请求并向客户端返回结果,在选主过程中参与投票

  • Observer:Observer可以接收客户端连接,将写请求转发给leader。但observer不参加投票,只同步leader状态。observer的目的是为了扩展系统,提高读取速度。

  • Client:客户端,用于向zk发起请求。

zk集群中每个server在内存中存储一份数据。在zk启动时,将从实例中选举一个server作为leader,leader负责处理数据更新等操作,当且仅当大多数server在内存中成功修改数据,才认为数据修改成功。

zk写的流程:

(1) 客户端首先和一个server或者observer通信,发起写请求
(2) server将写请求转发给leader 
(3) leader再将写请求转发给其他server,其他server在接收到写请求后写入数据并响应leader
(4) leader在接收到大多数写成功回应后,认为数据写成功
(5) server响应client,完成一次写操作

3 下载

apache-zookeeper-3.8.0-bin.tar.gz

tree -L 1
.
├── bin
├── conf
├── docs
├── lib
├── LICENSE.txt
├── NOTICE.txt
├── README.md
└── README_packaging.md

4 directories, 4 files

online env

...
environment:zookeeper.version=1.5.0-2727, built on 02/28/2018 03:25 GMT
environment:java.version=1.6.0_32
...

4 配置

5 访问

5.1 连接 zookeeper

zookeeper-3.4.14/bin/zkCli.sh -server xx.xx.xx.xx:2181
  • ls 查询当前节点列表(/是根节点)path:路径(ls /)

  • create 创建新的 Znode 节点(create /node_1 "test")

  • get 查看节点数据 path:路径(get /node_1)

  • stat 查看数据节点的状态信息 path:路径

  • set 设置数据节点的值,path:路径,data:数据,可以带版本号,可以不带版本号(set /node_1 "11114")

  • delete 删除 node_1_3节点 (delete /node_1/node_1_3)

  • rmr 循环删除有子节点的父节点,例如删除 node_1 (rmr /node_1)

5.2 临时节点和持久节点

  • zookeeper 持久节点:该数据节点被创建后,就会一直存在于 zookeeper 服务器上,直到有删除操作来主动删除这个节点。

  • zookeeper 临时节点:临时节点的生命周期和客户端会话绑定在一起,客户端会话失效,则这个节点就会被自动清除。

可以根据 get 节点时返回的信息的 ephemeralOwner 字段判断是否是临时节点

当ephemeralOwner 值不为0时,表明这个节点是临时节点,值为会话id.

当ephemeralOwner 值为0时,表明这个节点是持久节点。.

6 安全

6.1 设置 iptables

提示

单启用zookeeper的SASL认证,并不能阻止客户端的匿名连接,仍需要防火墙来配合阻断。匿名连接是zookeeper身份认证的一种方式,是zookeeper有意设计的。

6.1.1 Centos7

# 防火墙配置示例
# 以CentOS7为例
# 启动iptables服务
systemctl start iptables.service
# 禁止所有IP TCP连接端口2181
iptables -I INPUT -p tcp --dport 2181 -j DROP
# 允许某个IP连接端口2181
iptables -I INPUT -s 192.168.0.1/24 -p tcp --dport 2181 -j ACCEPT
# 配置保存
iptables save
# 设置iptables开机启动
systemctl enable iptables.service

6.1.2 Centos6

# 检查 iptables 是否正在运行
$ service iptables status

# 增加规则
# 禁止所有IP TCP连接端口2181
$ iptables -I INPUT -p tcp --dport 2181 -j DROP
# 允许某个IP连接端口2181
$ iptables -I INPUT -s 192.168.0.1/24 -p tcp --dport 2181 -j ACCEPT

# 验证规则
$ iptables -L -n
# 保存配置
$ service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

# 查看 iptables 是否开机自动启动
$ chkconfig --list iptables
iptables       	0:off	1:off	2:off	3:off	4:off	5:off	6:off
# 设置 iptables 开机自动启动
$ chkconfig iptables on
$ chkconfig --list iptables
iptables       	0:off	1:off	2:on	3:on	4:on	5:on	6:off

Last updated