0%

ZooKeeper(1)——安装与简介

背景

ZooKeeper 是目前使用较多的分布式协调手段,通过安装和简单使用 ZooKeeper, 为接下来的研究做准备.

安装

HomeBrew 安装

1
brew install zookeeper

安装完成的 ZK 并不是集群模式, 仅提供 zkCli, 接下来介绍安装 ZK 集群.

Docker安装

推荐使用 Docker for Mac, 基于HyperKit的本地应用

Docker Compose配置集群

参考: 来自Docker Store

编辑配置

以 Visual Studio Code 为例, 执行以下代码

1
code docker-compose.yml

输入内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '2'
services:
zoo1:
image: zookeeper
restart: always
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

zoo2:
image: zookeeper
restart: always
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

zoo3:
image: zookeeper
restart: always
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
启动集群

执行

1
docker-compose up

连接

执行

1
2
# 默认参数
zkCli

简介

常用 API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 帮助
help

# 创建节点并包含数据
create /path data

# 删除节点
delete /path

# 检查节点是否存在
exists /path

# 设置数据
setData /path data

# 获取数据
getData /path data

# 获取子节点列表
getChildren /path

znode类型

持久节点和临时节点
  1. 持久节点只能通过delete删除
  2. 临时节点除主动删除外,当创建该 znode 的客户端的会话超时或主动关闭而中止时也会删除
有序节点

当创建有序(sequential)节点创建时,唯一一个单调递增的证书会被追加到路径后,如 /task/task-,追加后/task/task-1。

监视与通知

为了代替客户端轮询,Zookeeper 使用了基于通知(notification)的机制:客户端向 ZooKeeper 注册需要接收到通知的 znode,通过对 znode 设置监视点(watch)来接收通知。

接收通知为单次操作,接收多个通知需要每次接收后设置一个新的监视点。

另外一个重要保障是,ZooKeeper 先向客户端传送通知,再对节点进行变更。

版本

每一个 znode 都有一个版本号,随着每次数据变化递增,setData 和 delete 会以版本号作为传入参数,一致时才能成功。

架构

ZooKeeper 服务端运行于两种模式下

  • 独立模式(standalone)
  • 仲裁/集群模式(quorum)
ZooKeeper 仲裁

法定人数是指保存了数据的最小客户端数量,为了避免脑裂,法定人数需要超过半数。
服务器个数一般是奇数,偶数会使系统变脆弱,如4个服务器就需要3个可用。

会话

ZooKeeper 所有操作均在关联的会话上,基于 TCP 协议进行通信。
会话提供顺序保证,同一个会话请求中以 FIFO 进行执行,但不保证多个会话。