文章目录
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