ZooKeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。ZooKeeper可以保证如下分布式一致性特性:
顺序一致性:
从同一客户端发起的事务请求,最终将会严格地按照其发起顺序被应用到ZooKeeper中。
原子性:
所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群所有机器都成功应用了某个事务,要么都没有应用,一定不会出现集群中部分机器应用了该事务,而另外一部分没有应用的情况。
单一视图(单系统镜像Single System Image):
无论客户端连接的是哪个ZooKeeper服务器,其看到的服务器数据模型都是一致的。
可靠性:
一个服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一致保留下来,除非有另一个事务又对其进行了变更。
实时性:
ZooKeeper仅保证在一定时间段内,客户端最终一定能从服务端上读取到最新的数据状态。也就是说ZooKeeper只保证最终一致性。
集群角色
在ZooKeeper中,集群有3个角色:Leader、Follower和Observer三种角色。
Leader:ZooKeeper集群中所有机器通过选举过程选定集群中的一台机器为Leader,Leader服务器为客户端提供读和写服务(只有leader对客户端提供写服务,这样保证集群事务处理的顺序性)
Follower:为客户端提供读服务、参与Leader选举过程、参与写操作的“过半写成功”策略,收到写事务请求直接转发给Leader
Observer:为客户端提供读服务,不参与Leader选举过程,也不参与写操作的“过半写成功”策略,因此Observer可以在不影响集群事务处理能力的前提下提升集群的读性能。
会话
Session指客户端会话,在ZooKeeper中,一个客户端连接指客户端和服务器之间的一个TCP长连接。通过这个连接,客户端能够做以下事情
当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端断开连接时,只要在sessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。
数据节点(Znode)
数据节点(Znode)是指数据模型中的数据单元,ZooKeeper内存数据存储的核心是DataTree,是一个树的数据结构,代表了内存中的一份完整的数据,由斜杠"/"进行分割的路径,就是一个Znode,每个Znode都保存自己的数据内容
ZNode节点类型分为三大类
具体在节点创建过程中,通过组合使用,可以生成以下四种组合型节点类型:
我们看下节点加上顺序后的样子,如下
[zk: localhost:2181(CONNECTED) 0] create -s /zk-test/sub-sequential seq123
Created /zk-test/sub-sequential0000000001
[zk: localhost:2181(CONNECTED) 1] ls /zk-test
[sub-test, sub-sequential0000000001]
[zk: localhost:2181(CONNECTED) 2] create -s /zk-test/sub-sequential seq456
Created /zk-test/sub-sequential0000000002
[zk: localhost:2181(CONNECTED) 3] ls /zk-test
[sub-test, sub-sequential0000000002, sub-sequential0000000001]
[zk: localhost:2181(CONNECTED) 4]
版本(保证分布式数据原子性操作)
每个Znode都有三种类型的版本信息,对节点数据变动会引起版本号变化
version:当前数据节点(Znode)数据内容的版本号
cversion:当前数据节点子节点的版本号
aversion:当前数据节点ACL变更版本号
Watcher(数据变更的通知)
事件监听器(Watcher)是ZooKeeper非常重要的特性,我们可以在节点上注册Watcher,并且在一些特性事件触发时候,服务器将事件通知到客户端上,该机制是ZooKeeper实现分布式协调服务的重要特性。
ACL(保障数据安全)
ZooKeeper使用ACL(Access Control Lists)权限控制机制保证数据安全,有5个权限:
CREATE:创建子节点的权限
READ:获取节点数据和子节点列表的权限
WRITE:更新节点数据的权限
DELETE:删除子节点的权限
ADMIN:设置节点ACL的权限
注意:CREATE和DELETE这两种权限都是针对子节点的权限控制。
参考https://www.cnblogs.com/GrimMjx/p/10922501.html