分布式协议
《从paxos到zookeeper分布式一致性原理与实践》笔记
- 事务的acid:原子性,一致性,隔离性,持久性
- cap理论:一致性,可用性,分区容错性
- base理论:基本可用,弱状态,最终一致
一 2pc
- 2pc,两阶段提交。协调者负责向各节点发送请求
阶段一 发送事务请求
阶段二 根据各节点响应结果, 发送事务提交或回滚 - 缺点
请求处理过程中所有节点处于同步阻塞
发送事务请求的协调者存在单点问题,可能导致执行节点数据不一致
协调者需要等待所有节点响应结果或请求超时
二 3pc
- 3pc,三阶段提交
阶段一 事务是否可执行询问
阶段二 发送事务预提交请求或中断事务
阶段三 事务正式提交 - 协调者异常
无影响: 阶段一 事务不提交,阶段三 超时后会提交事务
有影响:阶段二 导致收到预提交请求的节点提交事务,未收到的则未执行事务
三 paxos
-
基于消息传递,高度容错的一致性算法
-
拜占庭将军问题
多点通信,通信可能被串改 -
兼职议会
多点通信,通信可能丢失,但不会被串改,节点可能下线 -
角色proposer,acceptor,learner
-
proposer提交提案,包含序号和提案信息。两阶段,第一阶段prepare,第二阶段提交。
-
acceptor在prepare节点不会接受比之前提案序号更低的提案, 高序号prepare,则返回之前接受的最高序号。
-
过半acceptor响应prepare,则表示过半acceptor接受的提案序号中自己的提案序号最大。则发送acceptor请求
-
accpetor若又接到更高序号的prepare,则不响应acceptor请求。
-
过半accpetor响应acceptor请求,则提案协商成功
-
acceptor选中提案后,发送给一组主learner,主learner再同步给其他learner。
四 chubby
-
paxos的工程实现,面向松耦合的分布式系统的锁实现
小文件读写,事件通知 -
架构,服务端+客户端
-
服务端通过paxos算法选举一个master,有效期成为master租期,可以续租。
-
master故障后则重新选举
-
服务端都存储一份数据副本,只有master可以修改,其他节点从master同步
-
修改时,master向所有节点发送请求,过半同意后才可修改
-
使用锁延迟机制,避免获取锁的客户端网络抖动导致服务端认为锁释放,但客户端仍认为在锁的内部进行操作导致并发问题。
-
锁序列器机制,包含锁名字,类型,序号。锁内操作时同时传递锁序列器信息进行检查。
五 zookeeper
-
分布式一致性
-
简单数据模型,文件目录格式,
-
集群模式
-
顺序访问,客户端请求分配全局唯一递增序号
-
高性能,数据内存存储
-
角色
leader, follower, observer -
znode数据节点
数据信息+属性信息
持久节点+临时节点
顺序节点,非顺序节点 -
stat结构保存版本信息,节点版本,子节点版本,acl版本
-
时间监听watcher
-
acl节点管理权限控制
5.1 zab协议
5.1.1 消息广播
- 两阶段提交
- 没有回滚,半数响应就第二阶段提交
- 每个事务分配一个全局单调递增唯一id,zxid
- 按zxid递增顺序处理,保证事务顺序性
leader给每个follower分配一个fifo的队列,按zxid顺序存储事务
follower收到事务请求后,记录事务日志,返回ack
leader收到过半数ack后,发送commit
follower收到commit后,提交事务。
5.1.2 崩溃恢复,leader选举
-
保证选举出的leader,有最高zxid的提交事务
-
选举完成后,数据同步
收到过半ack,发送commit过程中失败,收到commit的会被选为leader。 -
需要丢弃的事务请求
收到请求,未发送prepare时失败, -
丢弃还是提交???
prepare阶段失败。
收到过半ack,未发送commit时失败. -
zxid低32位表示事务唯一递增id,高32位表示本轮leader id。重新选举后leader id加1
5.2 使用
5.3 应用场景
-
配置管理
配置获取,配置变更推拉结合获取 -
负载均衡
动态dns,节点为域名,值为ip
服务调用者从域名节点获取服务ip
服务提供者向域名节点注册本机ip -
命令服务
uuid 长度过长,含义不明
zookeeper通过创建顺序节点+节点前缀,即可获得唯一id -
分布式协调和通知
通过节点变更事件监听watcher,协调不同机器
热备份:多个机器在同一zk节点下创建临时顺序子节点,小序号的机器则获取任务执行权限。大序号的机器则监听变更,若小序号机器当机则触发热备
冷备份:机器周期扫描zk节点,创建顺序临时子节点,获取到最小序号的机器执行任务,其他机器删除子节点继续扫描其他zk任务节点。 -
分布式系统机器通信方式
心跳检测: 注册临时子节点,检查其他机器创建的临时节点是否存在判断存活。不用互相之间发送心跳报文
工作进度汇报:在zk任务节点下创建临时子节点,内容写入工作进度
系统调度:机器监听zk节点事件,控制台变更zk节点,触发客户端机器调度。 -
集群管理
创建临时子节点 -
分布式日志收集系统
收集器注册,收集任务注册 -
master选举
临时顺序子节点 -
分布式锁
排他锁,临时顺序子节点,最小序号获取锁。否则监听变更,等待锁释放。
共享锁,临时顺序子节点,写锁,最小序号则获取成功,否则监听变更等待锁释放。 读锁,检查序号更小的节点,若都为读锁则获取成功可读。否则监听变更,等待锁释放 -
分布式队列
fifo队列,入队创建临时顺序子节点,按序号出队
barrier屏障,监听子节点数量达到目标数量后,所有机器开始执行。