由以上介绍,分布式系统主要面临一致性和可用性的权衡,所以出现了一系列分布式一致性解决方案,zookeeper是一个典型的分布式数据一致性的解决方案。分布式应用程序可以基于它实现如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。
zookeeper
ZooKeeper致力于提供一个高性能、高可用,且具有严格的顺序访问控制能力的分布式协调服务。
ZooKeeper的基本概念
集群角色
在分布式系统中构成一个集群的每台机器都有自己的角色,最典型的集群模式就是Maste/Slave 模式,而在Zookeeper中颠覆了这些概念,没有沿用M/S模式,而是引入了Leader、Follower和Observer三种角色。
- Leader: 需要通过选举,且Leader服务器为客户端提供读和写服务。
- Follower和Observer都能提供读服务,唯一区别在于,Observer 机器不参与Leader选举过程,也不参与写操作“过半写成功”策略,因此Observer在不影响写性能的情况下提升集群的读性能。
会话(Session)
Session 是指客户端会话,首先说下客户端连接,客户端连接是指客户端和服务器之间的一个TCP长连接,ZK对外的服务端口默认是2181,客户端启动时首先会与服务端建立一个TCP长连接,从第一次建立连接开始,客户端会话生命周期就开始了,通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向zk服务器发送请求并接受响应,同时还能通过该连接接收来自服务器的Watch事件通知。sessionTimeout可设置会话的超时时间,当由于服务器压力大,网络故障或客户端主动断开连接时,只要在sessionTimeout周期内能够重新连接上集群中的任意一台,之前创建的会话仍然有效。
数据节点
ZK将所有数据存储在内存中,数据模型是一棵树(ZNode Tree),由斜杠(/)进行分割的路径就是一个ZNode,每个ZNode上都会保存自己的数据内容,同时会保存一系列属性信息,ZNode分为持久节点和临时节点。
持久节点,就是指一旦创建,除非主动移除,否则这个ZNode节点一直保存在ZK上,而临时节点是与客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点将会被清除。
版本
ZK每个ZNode上都会存储数据,对应于每个ZNode,ZK都会维护一个叫做Stat的数据结构,Stat中记录了这个ZNode的三个数据版本,分别是vesion(当前ZNode的版本)、cversion(当前ZNode子节点的版本)和aversion(当前ZNode的ACL版本)。
Watcher
Watcher,事件监听器,该机制是ZK实现分布式协调服务的重要特性。
ACL
ZK采用ACL策略进行权限控制