本文产生于自己读DDIA一书时的困惑:

如果链式复制和RAFT同样支持多节点读,而且CRAQ还可以有效降低带宽需求依次复制,为何主要还是使用RAFT

翻了下前面的博客,发现自己有记录过这个问题的一些思考和答案,还是对于分布式的理解不深,没有把整个流程串起来。之后还是需要互相印证加强学习

顺便感慨:数据库(mysql、redis、分布式)整体处理逻辑还是相通的,版本号、主从复制的各种技巧、快速恢复日志持久化的思路都有相通之处。

另外值得注意的是,MIT6.824里面主要考虑的是单主复制的情况,而没有过多分析多主复制的情况,多主复制的应用依然需要自己后续进行大量研究。

问题1:CRAQ各个节点都支持读操作,而RAFT只有主节点支持,为何还是RAFT更为流行?

答:实际上从节点是否支持读操作取决于一致性的要求。如果没有强一致性要求,即允许节点读取落后于当前进度的数据的话,那么RAFT各个从节点也可以支持读操作。

与此相反,如果有强一致性要求,即各个节点必须直接返回当前最新结果,那么CRAQ通过dirty/clean标记机制使得各个节点都可以支持读操作,读操作的吞吐量会高很多。

问题2:对读操作提供更强的支持是否表示CRAQ算法优于一般的RAFT算法?

答:不是。CRAQ各个节点都需要参与写commit流程,如果链里一个节点挂掉,那么整个过程就会暂停,写操作的响应时间会小很多。

问题3:如何对CRAQ分布式系统进行优化?

答:维护多个craq链路作为raft、使用版本号机制进行维护等。

!分布式目前来看没有最优的方案,始终需要根据业务场景做出取舍(类似mysql隔离级别的选择)