分布式协调服务-zookeeper
目录
初步认识zookeeper
zookeeper是一个开源的分布式协调服务,是由雅虎创建的,基于google chubby。
zookeeper是什么
分布式数据一致性的解决方案
zookeeper能做什么
数据分布订阅/配置中心
实现配置信息的集中式管理和数据的动态更新
实现配置中心有两种模式:push、pull 推模式和拉模式。推模式一般是服务器主动向客户端推送消息,拉模式是客户端主动去服务器获取数据(通常是定时轮询的)
zookeeper采用的是推拉相结合的方式。客户端向服务器端注册自己需要关注的节点。一旦节点数据发生变化,那么服务器端就会向客户端发送watcher事件通知。客户端收到通知后,主动到服务器端获取更新后的数据
负载均衡
请求/数据分摊多个计算机单元上
分布式锁
master选举
角色:
leader
leader是zookeeper集群的核心
- 事务请求的唯一调度者和处理者,保证集群事务处理的顺序性
- 集群内部各个服务器的调度者
follower
- 处理客户端非事务请求,以及转发事务请求给leader服务器
- 参与事务请求提议的投票(客户端的一个事务请求,需要半数服务器投票通过以后才能通知leader commit;leader会发起一个提案,要求follow投票)
- 参与leader选举的投票
observer
- 观察zk集群中最新状态的变化并将这些状态同步到observer服务器上
- 增加observer不影响集群中事务处理能力,同时还能提升集群中非事务处理的能力
选举:
概念:
- Zookeeper的服务器三种角色:
Leader,Follower,Observer
。Leader提供读和写,Follower提供读,参与过半投票,Observer只提供读,不参与投票,可以提高读性能。 -
ZXID
,事务ID,用来唯一标识一次服务器状态的变更 -
myid
,服务器SID,一个数字,通过配置文件配置,唯一
选举有两种情况,一是服务器启动的投票,二是运行期间的投票。
启动时投票
- 每个服务器发送一个投票(SID,ZXID),其中sid是自己的myid,初始阶段都将自己投为Leader。
- 接收来自其他服务器的投票。首先判断投票有效性,包括验证是否是来自
Looking
状态的服务器。 - 处理投票,针对每个投票都按以下规则与自己的投票PK,PK后依据情况是否更新投票,再发送给其他机器。
- 优先检查ZXID,ZXID较大者优先为Leader
- 如果ZXID相同,检查SID,SID较大者优先为Leader
- 统计投票:每次投票后,服务器统计所有投票,判断是否有过半的机器收到相同的投票,如果某个投票达到一半的要求,则认为该投票提出者可以成为Leader。
- 改变服务器状态:一旦确定了Leader,每个服务器都更新自己的状态,Leader变更为Leading,Follower变更为
Following
正常情况下一旦选出一个Leader则一直会保持,除非Leader服务器宕掉☭,则再进行重新选举。
运行时投票
- 变更状态
- 当Leader宕机后,余下的所非Observer的服务器都会将自己的状态变更为Looking,然后开启新的Leader选举流程。
- 每个服务器发出一个投票。生成
(SID,ZXID)
信息,注意运行期间的ZXID可能是不同的,但是在投票时都会将自己投为Leader,然后发送给其他的服务器。 - 接收来自各个服务器的投票
- 处理投票,规则与初次启动时相同。
- 统计投票
- 改变服务器状态
概念
数据模型
zookeeper的数据模型和文件系统类似,每一个节点称为:znode. 是zookeeper中的最小数据单元。每一个znode上都可以保存数据和挂载子节点。 从而构成一个层次化的属性结构
zookeeper节点分为四种
- 持久化节点 : 节点创建后会一直存在zookeeper服务器上,直到主动删除,创建节点的客户端与zk断开连接后,该节点依旧存在
- 持久化有序节点 :每个节点都会为它的一级子节点维护一个顺序,在创建节点时,zk根据创建的时间顺序该该节点名称进行编号
- 临时节点 : 临时节点的生命周期和客户端的会话保持一致。当客户端会话失效,该节点自动清理。当创建临时节点的客户端与zk断开连接时,临时节点会被删除
- 临时有序节点 : 在临时节点上多了一个顺序性特性
会话
客户端和服务器建立连接的时候就属于一个会话
Watcher
zookeeper提供了分布式数据发布/订阅,zookeeper允许客户端向服务器注册一个watcher监听。当服务器端的节点触发指定事件的时候会触发watcher。服务端会向客户端发送一个事件通知 watcher的通知是一次性,一旦触发一次通知后,该watcher就失效
ACL
zookeeper提供控制节点访问权限的功能,用于有效的保证zookeeper中数据的安全性。避免误操作而导致系统出现重大事故。
ACL是Access Control Lists 的简写, ZooKeeper采用ACL策略来进行权限控制,有以下权限:
CREATE:创建子节点的权限
READ:获取节点数据和子节点列表的权限
WRITE:更新节点数据的权限
DELETE:删除子节点的权限
ADMIN:设置节点ACL的权限