Zookeeepr设计原理
分布式系统
- 什么是分布式系统
《分布式系统概念与设计》一书定义分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间通过消息传递进行通信和协调的系统
分布式系统的特点
• 分布性
• 对等性
• 并发性
• 缺乏全局时钟
• 故障总是会发生分布式环境的各种问题
• 通信异常
• 网络分区(俗称“脑裂” )
• 三态(成功、失败、超时)
• 节点故障分布式系统-CAP定理
• 分区容错性(Partition tolerance)
• 一致性(Consistency)
• 可用性(Available)
• 一致性和可用性平衡方案
Zookeeper简介
• 一个开源的针对大型分布式系统的可靠协调系统
• 设计目标是:将复杂且容易出错的分布式式一致性服务 封装起来,构成一个高效可靠的原语集,并以简单易用的接口提供给用户使用。
• 提供的功能包括:发布/订阅,分布式协调/通知,配置管理,集群管理,主从协调,分布式锁等。
为什么选择Zookeeper ?
• 开源、免费
• 高效、可靠的解决数据一致性问题
• 工业界大型分布式系统广泛应用
• 简单易用
Zookeeper特性
最终一致性
• 保证最终数据能够达到一致,这是Zookeeper最重要的功能。
顺序性
• 从同一个客户端发起的事务请求,最终会严格地按照其发送顺序被应用到Zookeeper中。
可靠性
• 一旦服务器成功的应用一个事务,并完成了客户端的响应,那么该事 务所引起的服务端状态变更将会被一直保留下去。
实时性
• Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
原子性:
• 一次数据更新要么成功,要么失败。
单一视图:
• 无论客户端连接到哪个服务器,看到的数据模型都是一致的。
Zookeeper架构
zookeeper角色
角色 | 描述 |
---|---|
Leader | 更新系统状态,处理事务请求,负责进行投票的发起和决议 |
Leaner Follower | 处理客户端非事务请求并向客户端返回结果,将写事务请求转发给Leader,同步Leader的状态,选主过程中参与投票 |
Leaner Observer | 接收客户端读请求,将客户端写请求转发给Leader,不参与投票过程,只同步Leader的状态。目的是为了扩展系统,提高读取速度 |
Client | 请求发起方 |
Zookeeper写入
- 数据写入最终一致性核心算法ZAB算法
- Leader负责处理写事务请求
-
Follower负责向Leader转发写请求,响应Leader发出的提议
Zookeeper选举
服务器四种状态:
• LOOKING:寻找Leader状态,处于该状态需要进入选举流程
• LEADING:领导者状态,表明当前服务角色为Leader
• FOLLOWING:跟随者状态,Leader已经选举出来,表明当前服务角色为Follower
• OBSERVER:观察者状态,表明当前服务角色Observer
事务ID:用ZXID表示,是一个64位的数字,由Leader统 一分配,全局唯一,不断递增。
数据模型Znode
• Zookeeper特有的数据节点Znode,视图结构类似 Linux文件系统,没有目录和文件的概念
• Znode是Zookeeper中数据的最小单元
• Znode上可以保存数据,通过挂载子节点构成一个树状的层次化命名空间
• Znode树的根由“/”斜杠开始
Znode - 节点类型
节点类型
• 持久节点(PERSISTENT)
• 临时节点(EPHEMERAL)
• 顺序节点(SEQUENTIAL)
组合节点类型
• 持久节点(PERSISTENT)
• 持久顺序节点( PERSISTENT _ SEQUENTIAL )
• 临时节点(EPHEMERAL)
• 临时顺序节点(EPHEMERAL_ SEQUENTIAL)
Znode - 版本
版本类型
• dataVersion:当前数据节点数据内容的版本号
• cVersion:当前数据节点子节点的版本号ß
• aVersion:当前数据节点ACL权限变更版本号
如何保证分布式数据原子性操作
• 悲观锁
• 乐观锁
• 使用version实现乐观锁机制中的“写入校验”
Znode - 状态
状态属性 | 说明 |
---|---|
cZxid | Znode被创建时的事务ID |
ctime | Znode被创建的时间 |
mZxid | Znode最后一次被更新的事务ID |
mtime | Znode最后一次被更新的时间 |
pZxid | Znode子节点列表最后一次被修改时的事务ID |
cversion | 子节点的版本号 |
dataVersion | 数据节点的版本号 |
aclVersion | 节点的ACL版本号 |
ephemeralOwner | 创建该Znode的会话的sessionID,持久节点该值为0 |
dataLength | 数据内容长度 |
numChildren | 当前Znode的子节点个数 |
Znode - Watcher机制