MIT 6.824 Lec5&6&7. Fault Tolerance: Raft

本文深入探讨了分布式系统中的故障容忍,特别是针对split-brain现象。介绍了Majority Voting的概念和重要性,以及如何在Raft算法中实现领导者选举、日志同步和持久化。Raft保证线性一致性,确保在分布式环境中正确处理并发请求。
摘要由CSDN通过智能技术生成

Split-Barin

Fault-tolerant System

目前我们已经学习了多个Fault-tolerant System:

  • MapReduce:会对compute tasks进行复制,但是依赖single master来实现该机制
  • GFS:GFS会对data进行复制,但是依赖single master来选择primary
  • VM-FT:VM-FT会对服务进行复制,但是依赖test-and-set single server

单个结点来进行重要决策的好处:可以防止split-brain现象。

What is Split-brain

假设我们将VM-FT中的test-and-set server进行备份,实例如下:

clients	     servers
c1 			 s1
----------------- network partition
c2           s2

假设由client c1,c2和server s1,s2,但是由于网络故障c1只能和s1通信,c2只能和s2通信,这样就会造成c1和c2都认为自己获得了test-and-set server上的primary lock,从而出现两个primary node,这就是所谓的split-brain现象。

Majority Voting

一种多servers间解决split brain的方法是majority voting。 任何系统的决策都需要集群间多数servers的同意。Majority Voting能解决split-brain的重要原因是,在network partitioning中,majority partitioning有且仅有一个。

majority voting具有一个重要的性质,就是任何一个leader的决策log中肯定包含之前leader的log,因为每次投同意票的servers中肯定会有相同servers

基于Majority Voting的系统主要有两类:Paxos和Raft。

Raft

Leader Election

Leader保证了所有servers以相同的顺序执行相同的commands。 Raft用term number来标识leader,每个term内只能有一个leader。每个server都有一个random election timeout,定时器时间一到就开始新一轮选举。new leader选出后,通过heart break来抑制新的选举出现(比较term),servers收到heart break会重置election timeout。

选举失败可能由两个原因造成:

  • less than a majority of servers are reachable
  • simultaneous candidates split the vote, none gets majority

选举失败时会在election timeout后开始新的一轮选举。election timeout的选择通常需要考虑以下因素:

  • at least a few heartbeat intervals (in case network drops a heartbeat) to avoid needless elections, which waste time
  • random part long enough to let one candidate succeed before next starts
  • short enough to react quickly to failure, avoid long pauses

如果因为network partition导致old leader不知道new leader的存在,可能会导致日志的不一致性。但是由于old leader持有的term小于网络中的大多数servers,因此client发向old leader的请求都不会被处理,所以old leader并不会添加新的log entry。

Raft Log

当leader启动时,client只与leader进行交互,client看不见followers的状态和日志。为了保证一致性,如果任何一个server在index处执行了任何一个log entry,则其他server不会在相同的index处执行其它的log entry。

例子如下所示:

S1: put(k1,v1) | put(k1,v2) 
S2: put(k1,v1) | put
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值