2018年6月5日22:40:04 这周内在进行整理
初识 zookeeper
-
什么是 zookeeper
zookeeper 是一个开源的分布式协调服务,也是一个提供了分布式数据一致性解决方案的软件。 -
zookeeper 有哪些应用
数据的发布/订阅(配置中心:disconf、apollo)、负载均衡、集群的 master 选举、分布式队列、分布式锁。 - zookeeper 的特性
- 顺序一致性
从客户端发送的请求,会严格按照顺序被应用到服务器端。 - 原子性
事务在整个集群中所有机器的应用情况是一致的,要么所有机器都应用,要么所有机器都不应用。 - 可靠性
一旦服务器对某个事务进行了处理,并做出了返回,那么将会在整个集群中进行同步。 - 实时性
一旦事务在服务器端被应用,客户端能立刻从服务端读到数据的变更。(近实时性)
zookeeper 安装
前面说 zookeeper 是开源的软件,安装起来也非常简单,即开即用,解压后可以立即使用。
安装步骤
-
下载 zookeeper
-
上传后进行解压,因为 zookeeper 是 java 编写的,所以我们需要优先安装 java 环境。
-
复制一份 zoo_sample.cfg 文件到 zoo.cfg
-
启动 zookeeper 服务端,并尝试通过自带的客户端访问服务端
zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
zookeeper 集群
zookeeper 集群中有三种成员 leader/flower/(observer),一般系统较大的话,会配置 observer 服务器,observer 不参与集群中的投票及选举。
搭建步骤
- 配置 myid
- 每台机器的 zoo.cfg 配置文件中加入
server.id=host:port1:port2
配置 - 重启服务
zookeeper 数据模型
zookeeper 有两类节点,一类就存储时间而言,一类就存储规律而言。所以一共有四种节点,分别为下面的 4 种:
-
临时节点
生命周期与客户端的会话保持一致,会话失效,节点自动清理
-
临时有序节点
临时节点加上顺序的特性
-
持久化节点
创建后一直存在于服务器上,直到主动清理
-
持久化有序节点
持久化节点加上了有序的特性
zookeeper Watcher 机制
zookeeper 允许客户端向服务器端注册一个 watcher 监听,当服务器端触发了指定事件后会触发 watcher,watcher 通知是一次性的,当服务器端对客户端通知后,watcher 就会失效。使用 watcher 机制可以做我们的配置中心,配置存放在 zookeeper 上,客户端向配置节点注册监听,当节点内容发生变化后,服务器端会对通知客户端,与此同时 watcher 也失效了。
zookeeper ACL
zookeeper 提供了控制节点访问权限的功能,用于保证 zookeeper 中数据的安全性,避免错误操作带来的严重后果。
权限控制分为三个维度:scheme id permission
-
scheme 授权策略
- digest 用户授权
- ip ip授权
- world 开放式
- super 超级用户
-
id 验证模式
-
permission 权限授权
CREATE (c) / READ (r) / WRITE (w) / DELETE (d) / ADMIN (a)
zookeeper 会话
zookeeper 客户端与服务端建立会话一般会有下面几种状态
- NOT_CONNECTED
- CONNECTING
- CONNECTED
- CLOSE
zookeeper 操作命令
下面有一些常用的命令
create [-s] [-e] path data acl
get path [watch]
set path data [version]
delete path [version]
ls path [watch]
stat path [watch]
setAcl path acl
getAcl path
addauth scheme auth
zookeeper API
- zookeeper
- zkClient
- curator
zookeeper 应用实现
- 配置中心
- 分布式队列
- 分布式锁
- 负载均衡
- master 选举
术语
- 中性化、去中心化
- 冷备、热备
- CAP、BASE 理论
- ACID
附录
zoo.cfg 配置解析
# 心跳时间
tickTime=2000
# 数据目录
dataDir=/tmp/zookeeper
# server 端与 client 端通信的端口号
clientPort=2181
# log 存放目录
dataLogDir=/tmp/log/zookeeper
# 集群初始化连接时,follow 与 leader 之间的最长心跳时间
initLimit=10
# leader 与 follower 之间的最长心跳时间
syncLimit=5
# 集群服务器配置
server.id=host:port1:port2
maxClientCnxns=60
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
stat 属性解析
# 节点创建的事务ID
cZxid = 0x30
# 节点创建时间
ctime = Fri May 25 19:03:21 CST 2018
# 节点最后一次被更新的事务ID
mZxid = 0x30
# 节点最后一次的更新时间
mtime = Fri May 25 19:03:21 CST 2018
# 当前节点下的子节点最后一次被修改的事务ID
pZxid = 0x30
# 子节点的版本号
cversion = 0
# 当前节点的数据的版本号
dataVersion = 0
# acl 权限控制的版本号
aclVersion = 0
# 创建临时节点时,用于存放 sessionId
ephemeralOwner = 0x0
# 数据长度
dataLength = 2
# 子节点数
numChildren = 0
网友评论