chain replication
保证了 linearibility strong consistency
对于raft,如果客户端发起了一个写请求,leader得把它发送给每个replica。raft中leader把信息发送给每个replica的代价非常昂贵。这就意味着raft leader的工作负载要比chain replication高很多。在chain replication的情况下,leader只需要在head发送一次请求即可。
随着client每秒请求数的增加,raft leader就会达到处理能力的极限,并且它的处理速度不再比chain replication head节点来的更快了。
在raft中,为了保证数据的一致性,读和写都要在leader上处理。在chain replication中,负载更加均衡,写在HEAD上处理,读在tail上处理。
写请求只在head上处理,读请求只在tail上处理。
如果head故障 ,写请求不会到达tail处,我们不会对写请求做出响应,client会重新发出请求。
如果tail故障,它的前一个节点会接管tail的工作。因为tail知道的事情,它的前一个节点也必然知道。
chain replication无法单独使用,它独自无法解决脑裂的问题。需要一个第三方来辅助。通过调用一个第三方的服务来判断哪些服务器还活着或者已经creash了。
第三方服务 configuration manager (配置管理器) 监控节点是否活着。
每当configuration manager觉得某个机器crash了,它就会向外发送新的配置。那么这个链就会有了新的定义,比如谁是head,谁是tail。节点之间的顺序关系等。
config mgr通常会使用raft,paxos或者zookeeper。具备容错能力,不受脑裂影响。
// 假设有2000台服务器
Chain A: S1 S2 S3
Chain B: S4 S5 S6
Chain C: S7 S8 S9
使用chain replication,可以提升系统的效率,它减轻了leader的工作量。
如果chain replication其中一台机器变慢了,它会拖累链中其他机器的速度。
在raft中,如果一个follower变慢了,没关系。leader只需要等待多数派就行了。raft能更好的应对网络瞬间抖动或硬件问题引发的网络降速所带来的影响。