引言
EPaxos(Egalitarian Paxos)作为工业界备受瞩目的下一代分布式一致性算法,具有广阔的应用前景。但纵观业内,至今仍未出现一个EPaxos的工程实现,甚至都没看到一篇能把EPaxos讲得通俗一点的文章。EPaxos算法理论虽好,但由于其实在晦涩难懂,工程实现上也有很多挑战,实际应用落地尚未成熟。
本文旨在通俗易懂地介绍EPaxos算法,由浅入深、一步一步的让只有Paxos或Raft等分布式一致性算法基础的同学都能轻易看懂EPaxos,真正将晦涩难懂的EPaxos,变的平易近人,带入千万家。
在《一文了解分布式一致性算法EPaxos》中,从Paxos的问题引出EPaxos,介绍了EPaxos的基本概念与直观理解,相信读者已经对EPaxos有了整体的印象。
本文将从Paxos与EPaxos对比的角度,介绍EPaxos核心协议流程。上一篇文章最后留下的思考题,相信在阅读完本文后,都能找到答案。阅读本文需要一些Paxos或Raft等分布式一致性算法背景。
一 EPaxos基本思想
EPaxos是一个Leaderless的一致性算法,无需选举Leader,任意副本均可发起提议。
Leaderless也可以看作每个副本都是Leader,从Multi-Paxos或Raft的角度看,如果使用多Group,将每个Leader划分到不同的Group,每个副本担任一个Group的Leader,同时担任其它所有Group的Follower,好像也可以做到类似Leaderless的效果。
使用多Group实现的Leaderless,每个Group独立的对一系列Instance达成一致,每个Group产生一条Instance序列,不同Group产生的Instance彼此独立,不能确定先后顺序。因此跨Group的一致性是一大问题,在一致性层面无法解决,往往需要在上层使用分布式事务来解决。
EPaxos解决了这个问题,实现了真正的Leaderless。EPaxos通过跟踪Instance之间的依赖关系,确定不同Group产生的Instance的相对顺序,然后通过排序将多Group产生的多条Instance序列合并成一条全局的Instance序列,实现了跨Group的一致性,也即实现了真正的Leaderless。
EPaxos先运行共识协议,使各副本对Instance的值和Instance依赖的相对顺序达成一致,随后运行排序算法,基于前面已经达成共识的Instance的相对顺序,对Instance进行全局排序,最终得到一致的全局Instance序列。
以上是站在Multi-Paxos或Raft使用多Group实现Leaderless的角度引出EPaxos的基本思想,实际Group是一致性算法之外的概念,这里引入Group只是为了方便介绍,实际EPaxos中并没有Group的概念,但与Paxos或Raft类似,可以在EPaxos之上实现多Group。
二 EPaxos的Instance
EPaxos的Instance与Paxos有所不同,Paxos的Instance事先分配序号,但EPaxos的Instance不事先分配序号,各副本可以并发的乱序提交,但跟踪记录Instance之间的依赖关系,最后根据依赖关系排序。这里先总结一下不同点:
EPaxos的Instance与Paxos的不同点
Paxos的Instance由全局连续递增的InstanceID标识,InstanceID也是Instance的序号,全局唯一,连续递增。
EPaxos的Instance空间是二维的,每个副本拥有其中一行,因此由二维的R.i标识,其中R为副本标识,i为副本内连续递增的整数,每开始一个新的Instance就加一。副本R拥有的Instance序列为R.1,R.2,R.3,...... R.i,......
EPaxos的Instance相对Paxos还有一些额外的属性:
- state标识Instance当前的状态&