ZooKeeper作用
解决分布式环境下多个进程之间的同步控制,让他们有序地去访问某个临界资源,防止读取"脏数据"。可利用分布式锁的方式解决该问题,而分布式锁会面临网络不可靠等问题,所以诞生ZooKeeper来解决上述问题。其有着通用性号,伸缩性好,高可靠,高可用的特点。
Zookeeper集群
leader角色(Paxos协议):接受client请求,也接受其他server转发的请求,负责更新系统状态(Zab协议)。
Follwer角色:也可以接受client请求,如果是写请求将转发给Leader来跟新系统状态,读请求则由Follower的内存数据直接响应。
Zookeeper功能
- 数据发布和订阅(即配置管理):将数据发布到ZK节点上,给client动态获取数据。实现配置信息的集中式管理和动态更新。常用:更新全局配置信息,地址列表,应对不同应用集群对于共享各自配置的需求,并且在配置更变时能够通知到集群中的每一个机器。比如自动copy配置文件到从节点中,使集群更加可靠,一致。
- 统一命名服务:提供一套方便记忆的命名规则,使用树形的名称结构。通过使用命名服务,客户端应用能够根据指定的名字来获取资源服务的信息。Name Service是ZK的内置功能,只需调用API就可以使用。
- 分布通知/协调:利用ZK中特有的watcher注册和异步通知机制,能够很好的实现分布式环境下不用系统之间的通知与协调,实现数据的实时更新处理。ZK使用分布式通知和协调能够大大降低系统间的耦合。
Zookeeper数据模型
1. Znode:Znode是ZK树形数据存储结构的每个节点。通过绝对路径的引用。每个Znode由三个部分组成
- stat:状态信息,描述znode的版本,权限等信息。
- data:与该Znode关联的数据。
- children:该Znode下的子节点。
2. ZK时间:
- Zxid:Zk节点状态改变都将使节点接收到一个Zxid格式的时间戳(全局有序),每个节点的改变产生一个唯一Zxid,随时间流逝Zxid递增。
- 版本号:对节点的每个操作都会导致系欸但的版本号增加,每个节点维护三个版本号version(该节点版本),cversion(子节点版本号),aversion(节点拥有的ACL版本)
3. watch触发器:ZK为所有读操作设置watch触发器,当watch的对象发生变化时,将会触发此对象的watch所对应的时间,watch时间异步的发送给客户端。主要应用于两类事件
- 连接状态事件,这类事件不需要注册,也不需要连续触发,只需要处理即可。
- 节点时间,包括节点的建立,删除和数据修改。是一次性触发,需要不停的注册触发。