只是简单写写,有一些具体一点的设计建议去读一下原文。

简介

简单来讲,CR论文介绍了一种用于存储服务的满足线性一致性的复制状态机算法。它通过链式复制来提高算法的吞吐量,通过多副本来保证服务的可用性。

image-20230208232032286

算法的设计很简单巧妙。算法通过链式复制将复制的吞吐均分到所有的CR节点上,每个节点只负责对后续节点的复制。写入请求从头部节向后传播,查询请求交由尾部节点响应。

为了维护Chain上节点之前的前后关系,CR还引入了一个Master服务,用于管理节点之间的关系,以及处理Node Failure的情况。

故障处理

  1. Head Fail:头节点Pending or 没处理完 的请求将被丢失,不影响线性一致性,之后将第二个节点设置为头结点
  2. Tail Fail:倒数第二个节点将成为尾节点,此时原来Tail Pending的请求将被提交
  3. Middle Fail:中间节点故障的处理,类比链表的操作。Node_pre 将指向 Node_next,此时我们需要保证故障Node传递的请求被完整的传递下去。每个CR节点会维护一个SendReqList,记录已传递给后续节点的请求,由于请求是从头到尾传播,所以Node_pre只需要Node_next所缺失的数据即可。当Tail接收到请求时,标识数据被提交,此时会从尾至头传递Ack(req)信息,经过的节点都会把req从SendReqList从去除。

优缺点

最大的优点是,可以单节点提高吞吐量,节点的负载比较均衡,同时相对易于实现。整体设计很简洁有效。

但很明显也会有以下缺点。

  1. 如果传播链条上有一个节点处理慢,将会拖慢整个处理流程。
  2. 除了首尾两个节点,其他节点的数据基本只作为副本存在,而无法提供服务。当然CRAQ里有让中间节点提供只读服务的方法,类似Raft的Read Index,暂不细说。

参考

Chain Replication 论文阅读

CR Paper