2PC(Two Phase Commit),二阶段提交,顾名思义,将请求的完成过程拆分成了2个阶段
在2PC算法中,包含了两类角色:协调者(negotiator)和参与者(participants)
过程
2PC只会执行两个阶段:请求-提交,请求-中止
2PC的核心思想是"一票否决"
2PC的优势和劣势都非常明显
2PC提供了一种思路:在分布式环境中,如何就一个请求达成所有节点的一致性
原子广播,依赖于ZAB协议来实现了数据一致性。基于ZAB协议,Zookeeper实现了一种类似于主从结构的特点
不同于PAXOS算法的地方在于,在ZAB协议中,只允许一个角色(leader)进行提案,并且在集群中只能有一个leader(全局唯一),从而避免产生活锁问题
过程
日志文件的位置由dataLogDir
属性决定,但是dataLogDir
的值默认和dataDir
一致
查看log文件
# 从Zookeeper3.5.5开始,提供了zkTxnLogToolkit.sh;在3.5.5之前,通过LogFormatter类来查看
zkTxnLogToolkit.sh log.200000001
查看快照文件
zkSnapShotToolkit.sh snapshot.100000000
如果follower记录失败,那么还需要执行这个请求,此时follower会给leader发送请求,请求获取刚才任务的事务id,重新记录,记录成功,则执行这个任务;如果记录失败,那么会重新请求重新记录
如果一个节点加入了Zookeeper,这个节点会先找到自己最大的事务id,然后自己的最大事务id发送给leader,leader收到之后,会将欠缺的事务放入队列中发送给这个follower,follower收到之后,回依次从队列中取出请求依次记录执行。这个节点在补齐期间,不对外接收写操作
注意:Zookeeper所有的节点都能接收请求,如果是读请求,那么直接处理回复;如果follower接收到了写请求,会将这个请求转给leader,进行原子广播