Closed leakey0626 closed 1 year ago
非常感谢莫那·鲁道给我们提供了如此优秀的raft开源项目! 我是raft的初学者大东,在学习您的项目的过程中,我发现了该项目存在一定的优化空间,于是我对代码进行了一些增改,希望能达到锦上添花的效果。下面是我对优化点的说明:
在原项目中,跟随者接收到 append entry 请求后,会立即将日志内容应用到状态机,个人认为这种做法有风险。
假设日志还未分发到多数节点时,【领导者A】宕机,并且下一任【领导者B】恰好不含该日志,那么该日志将会在【领导者B】发出它的 append entry 请求时被清除。但原先持有该日志的节点已经将其应用到状态机了,并且无法撤销 apply。所以,该机制会导致状态机数据与日志数据的不一致。
apply
这种不一致一方面会导致我们无法通过日志准确地恢复出状态机的数据,不利于备份和分析;另一方面,若后期对项目进行扩展,让跟随者承担一部分“读操作”的职责时,会产生严重的数据不一致问题。
跟随者提交日志的逻辑修改为:
引入 no-op 空日志来解决补充①里提到的可用性问题:
command
非常感谢莫那·鲁道给我们提供了如此优秀的raft开源项目!
我是raft的初学者大东,在学习您的项目的过程中,我发现了该项目存在一定的优化空间,于是我对代码进行了一些增改,希望能达到锦上添花的效果。下面是我对优化点的说明:
日志提交
问题描述
在原项目中,跟随者接收到 append entry 请求后,会立即将日志内容应用到状态机,个人认为这种做法有风险。
假设日志还未分发到多数节点时,【领导者A】宕机,并且下一任【领导者B】恰好不含该日志,那么该日志将会在【领导者B】发出它的 append entry 请求时被清除。但原先持有该日志的节点已经将其应用到状态机了,并且无法撤销
apply
。所以,该机制会导致状态机数据与日志数据的不一致。这种不一致一方面会导致我们无法通过日志准确地恢复出状态机的数据,不利于备份和分析;另一方面,若后期对项目进行扩展,让跟随者承担一部分“读操作”的职责时,会产生严重的数据不一致问题。
优化
跟随者提交日志的逻辑修改为:
no-op 空日志
问题描述
优化
引入 no-op 空日志来解决补充①里提到的可用性问题:
command
为 null 的日志并提交客户端
优化