简介
-
ZooKeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper通过其简单的架构和API解决了这个问题。
-
ZooKeeper允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。
-
Apache ZooKeeper是由集群(节点组)使用的一种服务,用于在自身之间协调,并通过稳健的同步技术维护共享数据。ZooKeeper本身是一个分布式应用程序,为写入分布式应用程序提供服务。
数据存储结构
Zookeeper 数据以树形式存储
- 每个节点上可以存储数据,最大1M
- 非临时节点可包含N个子节点
- 每个节点有自己属性:版本号、时间戳、数据长度、ACL
监听
- 根节点监听:监听整个树结构
- 父节点监听:监听子节点变化
- 数据监听:监听指定某一个节点数据变化
监听事件
- 创建、修改、删除
实现方式
- 循环监听
- 回调
节点
节点属性
- cZxid: 节点创建时事务id
- mZxid: 数据节点最后一次更新时的事务ID
- pZxid: 数据节点的子节点列表最后一次被修改事务ID(子节点列表变更,而非内容)
- cversion: 子节点的版本号
- dataVersion: 数据节点的版本号
- aclVersion: 数据节点的ACL版本号
- ephemeralOwner: 临时节点为会话id,非临时为0
- datalengh: 数据内容的长度
- numChildren: 数据节点当前的子节点个数
节点类型
- persistent(持久节点)
在创建该特定znode的客户端断开连接后,持久节点仍然存在
- sequential(顺序序列)
客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除,只有临时节点不允许有子节点
- ephemeral(临时节点)
顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径
节点常用命令
创建持久节点(默认是持久节点)
create /persistent persistent_data
创建顺序节点
create -s /sequential sequential_data
创建临时节点
create -e /ephemeral ephemeral_data
节点查看
ls /persistent
节点值获取去
get /persistent
节点删除
delete /persistent
deleteall /persistent
修改节点值
set /persistent new_persistent _data
仲裁
在仲裁模式中,zookeeper 复制集群中所有数据。如果客户端需要等待每个服务器完成数据的保存后在继续,会出现延时的问题,延时在大流量的访问中,是不可接受的,为了尽可能降低延时,ZK采用法定人数思想,保证ZK正常工作的小集群数量。
选主
- 那些情况下选主
集群中已存在leader,新节点加入
节点无法与leader 通信或主节点已崩溃
选主过程
- 每个服务器彼此会接收到一张由选票voteId, zxid 组成唯一标识选票
- 收方获取选票zxid 与自己选票(myNoteId, myZxid)比较,如果(zxid > myZxid)或者(zxid = myZxid 并且 voteId > myNoteId), 修改自己选票为对方选票标识,否则保留自己选票
- 依次选举,经过仲裁机制,选出leader。 完成后每个节点与leader 同步状态
总结
以上是对zookeeper 简单介绍,springboot与zookeeper 集成请参考另一篇博客