本文主要是介绍ceph mon中的paxos应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近听到分布式系统中用paxos的地方不少,比如最近蚂蚁金服的oceanBase都提到使用了paxos,而笔者最近也在可以理解paxos和其工程使用,注意到ceph中的Mon组件也是用paxos来实现Mon集群的一致性,所以阅读和分析了其代码,但本文仅仅分析paxos类本身的代码,至于paxos持久化日志的底层实现,以及Mon上层的业务类如何使用paxos,这个是后续的工作。
最开始,几个mon启动起来,并且建立连接之后,会开始竞选leader,其实paxos协议是允许多个leader,但在系统正常的情况下,没有必要有多个leader,多个leader各自运行自己的流程,会增加整个系统的负载。而竞选的主要依据就是每个Mon都有一个全局唯一的数字rank,所以这个数字中肯定存在最小的,竞选的流程类似于paxos协商值时候的prepare阶段,rank最小的Mon会竞选成功成为leader,不成功的就是peon。
然后就可以对外面提过来的value或者之前尝试commit过的value进行协商,commit了。
需要说明的是:
- 为了系统的可靠性,在发出OP_COLLECT和OP_BEGIN之后,leader都会设置超时器,来超时重试。
- peon上的lease_timeout超时器,如果超时,会认为之前的leader死亡,会清除运行中的一些临时变量,重新发起选举和初始化。所以leader需要定时发送OP_LEASE消息,更新peon的lease time。
- leader和peon会持久化一些消息过程中几个重要的值,比如accepted_pn, first_committed,last_committed等,用来:
1) 运行过程中需要一些数据,比如peon需要比较accepted_pn来决定是不是要accept新的pn(proposer number),
而这些数据是应该被持久化的。
2) 在重试或者Mon重启之后,恢复之前协商中但没有commit的值。
3)leader根据peon返回的first_committed,last_committed,来确定是不是需要把一些已经记录了日志
但没有commit的值,commit掉,或者把peon上面连日志都没有但已经被大多数accept的值同步给peon。
这篇关于ceph mon中的paxos应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!