![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Raft
文章平均质量分 61
Rajahn1886
这个作者很懒,什么都没留下…
展开
-
实现拜占庭容错的Raft算法-总结
n个节点中存在f个拜占庭节点, 选举和日志提交需要quorum个节点的确认(n-f)/2 -f>f 半数以上的正常节点的共识不会被f个拜占庭节点推翻得出n=5f+1. quorum=3f+1共识结点, 客户端, 互相持有对方公钥。原创 2024-04-28 23:28:36 · 722 阅读 · 1 评论 -
实现拜占庭容错的Raft算法-防篡改
如果Follower在添加日志时进行篡改, 对BRaft的安全性无影响, 因为剩下的节点依然能够达成共识, 而篡改了日志的Follower将不具备成为Leader的能力。BRaft中任意节点需要给返回客户端的响应进行数字签名, 客户端持有所有节点的公钥, 它负责校验所有响应确保响应的消息未被篡改且每个节点只响应一次。恶意Leader节点可以拒绝客户端请求, 因此BRaft的客户端交互不再仅依赖Leader, 而是需要所有参与共识的节点参与;4 如果客户端收到f+1个一致的响应, 则将其视为正确的响应。原创 2024-04-28 23:12:38 · 181 阅读 · 0 评论 -
实现拜占庭容错的Raft算法-日志分发2
在AppendEntries中, 移除原本Follower根据Leader的CommitIndex更新自己提交记录的逻辑, 在AppendEntriesCommit中根据map记录的日志接收数量判断是否已在集群内达成共识。在日志分发1中, 构造了AppendEntries和AppendEntriesCommit的基本逻辑, 还有一些细节需要调整。移除Leader更新CommitIndex的代码, 采用和Follower一样的更新方式。增加一行applyCond.signal, 通知日志应用状态机。原创 2024-04-27 23:11:36 · 107 阅读 · 0 评论 -
实现拜占庭容错的Raft算法-日志分发1
BRaft中Follower不能直接相信Leader的CommitIndex, 因此需要在Leader完成追加后发送一条AppendEntriesCommit广播, 告知其他节点某日志已被我添加记录到map, 当一条日志确实已被多数节点添加, 根据map记录推进CommitIndex的更新, 这对于Leader来说也一样, 因为不能相信Follower确实添加了日志, 也就不能直接更新CommitIndex。增加了一轮广播后On^2复杂度, 性能大幅下降, PartB原本的一些测试会无法通过。原创 2024-04-27 03:58:31 · 434 阅读 · 0 评论 -
实现拜占庭容错的Raft算法-领导选举部分
先发起一次PreRequestVote, Follower响应自身最新的已提交日志Term, Index作为验证要求, 然后Leader发送RequestVote, 其中带上自己算出来的要求日志hash签名, Follower校验后进行投票。新增预投票RPC调用, Follower响应自身持有的最新日志Term和Index, Leader据此找出该日志项进行哈希签名返回给Follower, 包含在RequestVote请求中。领导选举部分需要防范的是, 候选人是拜占庭节点,伪造持有最新的日志骗取选票。原创 2024-04-25 22:40:31 · 243 阅读 · 0 评论