# ZooKeeper

## 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 临时节点：临时节点的生命周期和客户端会话绑定在一起，客户端会话失效，则这个节点就会被自动清除。

{% hint style="info" %}
可以根据 get 节点时返回的信息的 ephemeralOwner 字段判断是否是临时节点

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

当ephemeralOwner 值为0时，表明这个节点是持久节点。.
{% endhint %}

## 6 安全

### 6.1 设置 iptables

{% hint style="info" %}
**提示**

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

#### 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
```
