1 是什么?
1.1 百度百科
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件。
1.2 怎么理解呢?
分布式应用程序协调服务?为分布式应用提供一致性服务的软件?
分布式系统为什么需要它协调?
- 单个节点的共享资源并发访问控制可以简单加锁(例如:java中synchronized关键字)控制,多个节点就需要一个可靠的中间人来避免访问冲突?
- 分布式系统中,每个服务都维护一份配置信息,不利于统一维护。因此,我们需要一个存储工具统一管理配置信息,确保所有节点使用一致的配置。
- 某个存储业务集群中,有多个存储节点。为了实现数据的高效读写和一致性管理,需要选举出一个主存储节点来协调数据的写入操作,从节点则负责数据的读取和备份等操作。ZooKeeper能够帮助系统自动进行Leader选举,确保在需要集中控制时有一个明确的领导者节点。
详细内容参考:: 【Zookeeper-04】zookeeper应用场景实践
2 有什么特点?
-
顺序一致性
- 描述:来自客户端的更新请求将按发送的顺序被应用。这意味着如果一个客户端发送了两个更新请求 A 和 B,那么系统将确保 A 在 B 之前被处理。
- 意义:顺序一致性保障了客户端在发送多个更新请求时,能够按照预期的顺序看到更新结果。这对于确保操作的逻辑顺序非常重要。
-
原子性
- 描述:任何更新操作要么完全成功,要么完全失败,而不会出现部分成功的情况。
- 意义:原子性确保了系统的一致性。即使在操作失败时,系统状态也不会处于不确定或不一致的状态。这对于事务性操作和数据的完整性尤为重要。
-
单个系统映像
- 描述:无论客户端连接到哪个服务器,所有客户端都应该看到相同的服务视图。这意味着即使客户端在会话期间连接到不同的服务器,它也不会看到系统的过时视图。
- 意义:这保证了系统的一致性和可靠性,特别是在服务器故障或客户端故障转移的情况下,客户端仍然能够获得最新的系统状态。
-
可靠性
- 描述:一旦更新被应用,它就会一直存在,直到被新的更新覆盖。这意味着数据不会丢失,并且可以持久存储。
- 意义:可靠性保证了数据的持久性,即使在系统故障时,数据也不会丢失。这对于持久化存储和日志记录等应用场景非常重要。
-
及时性
- 描述:系统保证在特定的时间范围内,客户端看到的视图是最新的。
- 意义:及时性保证了客户端能够在合理的时间内获取到系统的最新状态变化。这对于动态配置更新和实时系统监控非常关键。
3 数据模型
ZooKeeper 提供的命名空间与标准文件系统的命名空间非常相似。名称是一系列由斜杠 (/) 分隔的路径元素。ZooKeeper 命名空间中的每个节点都有路径标识。
分层命名空间
ZooKeeper 的数据节点是树状结构,树中的各节点被称为 Znode,一个 Znode 可以有多个子节点,ZooKeeper 中的所有存储的数据是由 znode 组成,并以 key/value 形式存储数据。整体结构类似于 linux 文件系统的模式以树形结构存储,其中根路径以/开始。
节点类型
- 持久化目录节点(默认)
客户端与Zookeeper断开连接后,该节点依旧存在 - 持久化顺序编号目录节点
客户端与Zookeeper断开连接后,该节点依旧存
在,只是Zookeeper给该节点名称进行顺序编号 - 临时目录节点
客户端与Zookeeper断开连接后,该节点被删除 - 临时顺序编号目录节点
客户端与Zookeeper 断开连接后,该节点被删除 ,只是
Zookeeper给该节点名称进行顺序编号
说明:创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护
注意:在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序
节点详细信息
- czxid:创建节点的事务 zxid
每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有修改总的次序。每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。 - ctime:znode 被创建的毫秒数(从 1970 年开始)
- mzxid:znode 最后更新的事务 zxid
- mtime:znode 最后修改的毫秒数(从 1970 年开始)
- pZxid:znode 最后更新的子节点 zxid
- cversion:znode 子节点变化号,znode 子节点修改次数
- dataversion:znode 数据变化号
- aclVersion:znode 访问控制列表的变化号
- ephemeralOwner:如果是临时节点,这个是 znode 拥有者的 session id。如果不是
临时节点则是 0。 - dataLength:znode 的数据长度
- numChildren:znode 子节点数量
4 环境安装
4.1 安装包下载
自己选一个稳定版本: zookeeper download
4.2 目录介绍
解压安装包,可以看到如下目录
- bin:主要的一些运行命令
- conf:存放配置文件,提供了配置模板文件zoo_sample.cfg
- docs:API文档
- lib:需要依赖的jar包
- LICENSE.txt、NOTICE.txt、README.md、README_packaging.md:Apache开源项目许可证说明、打包等说明
4.3 配置简介
可以看到zookeeper给我们提供了一个配置模板zoo_sample.cfg,大部分情况下我们只需要在当前目录下复制该文件,然后编辑其中的少数几个配置即可。
# ZooKeeper 使用的基本时间单位(以毫秒为单位)。
# 它用于执行心跳(zk 服务器之间或客户端与服务器之间维持心跳的时间间隔),
# 最小会话超时将是 tickTime 的两倍。
tickTime=2000
#存储内存数据库快照的位置,除非另有说明,否则存储数据库更新的事务日志。
dataDir=/var/lib/zookeeper
# 用于侦听客户端连接的端口
clientPort=2181
详细内容参考:zookeeper官网配置项介绍
5 基本操作
5.1 命令操作
- 启动服务
[root@xxx bin]# cd ..
[root@xxx apache-zookeeper-3.8.3-bin]# ls
bin conf docs lib LICENSE.txt logs sNOTICE.txt README.md README_packaging.md
[root@xxx apache-zookeeper-3.8.3-bin]# bin/zkServer.sh start:
ZooKeeper JMX enabled by default
Using config: /root/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- 客户端连接
bin/zkCli.sh -server 127.0.0.1:2181
[root@xxx apache-zookeeper-3.8.3-bin]# bin/zkCli.sh -server 127.0.0.1:2181
Connecting to 127.0.0.1:2181
.....日志略...
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2181(CONNECTED) 0]
- CURD
# 查询znode: ls /xx,-w 监听节点内容变化 -s 附加次级信息
# 增加znode:create /xx,-s 含有序列 -e 临时(重启或者超时消失)
# 删除znode:delete /xx
# 修改znode: set /xx data
# 查看znode: get /xx data,-w 监听节点内容变化 -s 附加次级信息