Distributed Systems-选主与同步

在上一篇文章中讨论了leader选举对于基本Paxos算法在实际工程应用中的必要性,这一篇文章首先结合raft的选举算法谈谈leader选举的实质和常用方法,然后结合raft算法选举后的日志恢复以及《Paxos Made Simple》里lamport勾勒的multi-paxos的日志恢复来详细分析一下选主后要做的两件重要事情以及俩算法在这块的差异。


1.raft的选主算法以及选主算法的实质

前面一篇文章中提到,选主本质上就是分布式共识问题,可以用基本Paxos解决,下面就raft选主算法与基本Paxos的对应关系来说明。

关于raft选主的详细描述可以参考原论文

  • raft选主时的term实际上对应基本Paxos中的proposal id
  • raft选主时的要求即每个term期间只能最多有一个leader实际上对应于基本Paxos的每个proposal要么达成决议要么没达成决议
  • raft选主时的随机timeout实际上是为了防止基本Paxos livelock的问题,这也是FLP定理所决定的
  • raft选举时与基本Paxos的区别在于,raft选举不要求在某个term(proposal id)选出一个leader(达成决议后)不需要后续的某个term(proposal id)选出同一台机器作为leader(使用同一个值达成决议),而是可以每次重新选一个机器(proposal选不同值),当然我们可以使用一定方法,增大选某台机器的概率,比如为每台机器设置rank值。
  • raft选举时,当candidate和leader接受到更大的term时立即更新term转为follower,在下一次超时前自然不能再提proposal,实际上对应于基本Paxos第一阶段acceptor接收到proposal id更大的proposal时更新proposal id放弃当前的proposal(在选主中实际上就对应放弃我candidate和leader的身份,本质上就是proposer的身份)

所以选主本质上是可以通过基本Paxos算法来保证的,选主没有完全使用Paxos算法,可以看作使用了Paxos算法的某个子算法解决了比容错分布式一致问题限制稍微小的问题。当然,我们可以在选主时加上额外的限制条件,只要能保证可能选出一个主。


2.选主后日志的同步

选出新的leader后,它至少要负责做两件事情,一件是确定下一次客户请求应该用哪个日志槽位或者说项,另一件是确定整个集群的机器过去已经提交过的最近的项(或者说日志),确定这两个值的过程实际上就是日志恢复的过程,下面对两种算法具体分析。这里补充一点之前文章漏掉的东西,基本Paxos算法实际上有三个阶段,最后一个阶段是提交阶段,只是通常leader-based算法为了优化网络开销,将第三阶段和第二阶段合并了,而在每次执行第二阶段是带上leader已经提交过的日志号,所以新leader还需要确定最近被提交过的日志,而这种优化也引入了另外的复杂性。

  • 对于raft来说

    • 由于选主时额外的限制条件以及log replication时的consistency check保证(关于这两者是什么东西,不细说,基本上这就是raft简化了multi-paxos最核心的东西吧),所以每个新leader一定有最新的日志,所以对于下一条日志槽位的选取,只需要读取最后一条日志来判断就行了。关于raft的log replication,后面有机会再说。

    • 而对于已提交日志的判断,由于存在可能已经形成多数派,也就是在内存中形成了多数派,但是还没有机器commited到磁盘,这时,新的leader无法判断这条日志是已经提交还是没有提交(参见原论文5.4.2节),raft的做法是不管这条可能被新leader覆盖掉的日志,只需要保证在新的term期间,提交一条日志,那么由于consistency check,自然会提交之前的日志。

  • 对于multi-paxos来说

    • 由于在log replication说,不像raft那样保证一个顺序应答(不能保证线性一致性,能保证顺序一致性),也就是保证一个日志槽位达成多数派后才接受下一个请求,multi-paxos可以在一个日志槽位还没有达成多数派时并发处理另外一个日志槽位,所以新leader在恢复确认下一个可用日志槽位以及已提交日志时更麻烦。

    • lamport原论文描述的方法是,对于明确知道已提交的日志(这一点我们可以通过给每一条已提交日志加一个标示,这样可以减少日志恢复的时间),不用再次进行基本Paxos的决议,而对于未明确知道已提交的日志,则进行基本Paxos的二个阶段来确认已达成多数派的值,对于中间空洞且之前没有达成过多数派的,直接写一条空操作的日志,至于为什么会产生这种情况,可以参考原论文。一旦所有日志都经过这种方法恢复后,下一个可用日志槽位和最近已提交日志号也就能确定了。

对比上面两者恢复的过程,我们可以看到raft是怎么简化multi-paxos的。一旦新的leader确定了上面那两件事情,就可以进入正常的log replication阶段了,也就仅仅是多数派的事情了。


3.log replication,客户端交互,membership管理,leader lease等

这一节为后面的文章做个铺垫,对于log replication实际上不会涉及太多状态的reason,所以也就比较容易理解,基本上是类似简化的两阶段提交,后面会介绍下raft的log replication。对于客户端交互,leader什么时候返回结果,客户端怎么超时重试,以及怎么保证请求的幂等,membership management,以及leader lease等一些优化手段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分布式系统是一种由多个独立的计算机节点组成的系统,这些节点通过网络互相通信和协调,共同完成任务。分布式系统的原则和范例可以总结如下。 首先,容错性是分布式系统的重要原则之一。由于分布式系统由多个节点组成,节点之间的通信可能会遇到错误、故障或延迟。为了提高系统的可靠性,分布式系统需要具备容错机制,能够自动检测和纠正错误,保证系统的正常运行。 其次,一致性是分布式系统的核心原则之一。分布式系统中的数据通常被存储在不同的节点上,这就带来了数据一致性的挑战。为了保证数据的一致性,分布式系统需要使用合适的一致性协议和算法,确保各个节点之间的数据一致性和同步。 同时,可扩展性也是分布式系统的重要原则之一。分布式系统需要具备良好的可扩展性,能够根据用户需求动态地扩展节点数量和处理能力。通过水平扩展和垂直扩展等手段,分布式系统可以实现高性能和高可用性。 此外,安全性也是分布式系统的原则之一。由于分布式系统中的节点和网络是开放的,容易受到安全攻击和数据泄露的威胁。为了保障系统的安全,分布式系统需要实现合适的安全机制,包括身份认证、数据加密和访问控制等。 最后,弹性性是分布式系统的原则之一。分布式系统需要具备弹性,能够在节点故障、网络拥塞或大量请求压力下保持正常运行。通过引入负载均衡、流量控制和自动伸缩等机制,分布式系统可以提高其弹性,并能够快速恢复正常运行。 总之,分布式系统的原则和范例包括容错性、一致性、可扩展性、安全性和弹性性。这些原则和范例的应用可以提高分布式系统的可靠性、性能和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值