Zookeeper的底层算法机制(上)
1.关于分布式环境下数据一致性问题
对于在分布式环境下的数据一致性问题,主要目的是确保分布式环境下每个节点的数据的一致性,如果在某个节点上数据进行更新后,儿其他的节点或某几个节点的数据没有进行更新,那么就会造成脏数据的问题,这个就是在分布式环境下的数据的一致性问题。
那么为了解决分布式环境下的数据一致性的问题,产生了二阶段提交算法、Paxos算法等保证数据的一致性。
2.二阶段提交算法
二阶段提交算法的简称是2PC(Two Phase Commit),是计算机网络尤其是在数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务处理过程中能够保持原子性和一致性而设计的一种算法。通常,二阶段提交协议也被认为是一种一致性协议,用来保证分布式系统数据的一致性。目前,绝大部分的关系型数据库都是采用二阶段提交协议来完成分布式事务处理的,利用该协议能够非常方便地完成所有分布式事务参与者的协调,统一决定事务的提交或回滚,从而能够有效地保证分布式数据一致性,因此二阶段提交协议被广泛地应用在许多分布式系统中。
2.1二阶段协议的提交过程
阶段一:提交事务请求+执行事务
a.事务询问
协调者向所有参与者发送事务内容,询问各个参与者是否可以执行事务提交操作,并且等待各个事务参与者的响应
b.执行事务
各个参与者执行事务操作,并将事务操作记入事务日志中
c.各个参与者向协调者反馈事务询问的响应
在此过程中,如果参与者向协调者反馈了yes响应,则表示事务可以执行。如果参与者向协调者反馈了No响应,表示事务不可执行。因此二阶段提交算法阶段一是协调者组织参与者参加了一次执行事务的投票,因此阶段一也可以称为"投票阶段"。
阶段二:事务提交
在阶段二中,协调者会根据参与者的反馈情况来决定最终是否可以进行事务提交操作,正常情况下,包含以下两种可能。
执行事务提交
加入所有参与者向协调者反馈的都是ACK的YES响应,那么就会执行事务提交。
1.发送提交请求
协调者向所有参与者节点发送commit请求
2.事务提交
参与者接收到commit请求后,会正式执行事务提交操作。并在提交完成之后释放整个事务执行期间占用的事务资源。
3.反馈事务的提交结果
参与者在完成事务提交之后,向协调者发送ACK确认消息
4.事务完成
协调者接收到所有的参与者的ACK消息,完成事务提交
事务中断
假如任何一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者尚无法接收到所有参与者的反馈响应,那么就会中断事务。
- 发送回滚请求。
协调者向所有参与者节点发出Rollback请求。
-
事务回滚。
参与者接收到Rollback请求后,开始执行事务rollback操作,执行完回滚事务之后,释放整个事务执行期间占用的资源。
-
反馈事务回滚结果。
参与者在完成事务回滚之后,向协调者发送Ack消息。
- 中断事务。
协调者接收到所有参与者反馈的Ack消息后,完成事务中断。
2pc算法简单示意图如下:
3. 2pc算法的缺点
1.单点问题
在整个过程中,只有一个协调者,如果在执行过程中协调者宕机或发生异常,则整个节点集群,会发生故障
2.同步阻塞问题
在整个事务提交过程中,协调者需要等待所有的参与者的ACK消息,才能执行下一步操作,发生同步阻塞。
4. Paxos算法
Paxos算法具体的发展历程,可以自己去关注一下, 在这里主要讲解和2pc算法的区别
a.paxos算法在2pc算法的基础上增加了过半思想,就是有过半的节点给协调者反馈了消息,即可以执行下一步操作,减缓了同步阻塞.
b.在2pc算法的基础上增加了角色轮换,即避免了单点故障问题,zookeeper的底层算法机制就是在此基础上实现的。
好了,今天就到这里了,具体Zookeeper实现算法,最近几天会更新啦。