raft游戏下载 raft(14)


接收者实现:1. 如果term < currentTerm就?立即回复2. 如果是第?一个分块(offset 为 0)就创建?一个新的快照3. 在指定偏移量量写?入数据4. 如果 done 是 false,则继续等待更更多的数据5. 保存快照?文件,丢弃具有较?小索引的任何现有或部分快照6. 如果现存的?日志条?目与快照中最后包含的?日志条?目具有相同的索引值和任期号,则保留留其后的?日志条?目并进?行行回复
7. 丢弃整个?日志8. 使?用快照重置状态机(并加载快照的集群配置)
参数 解释
term 领导?人的任期号
leaderId 领导?人的 Id,以便便于跟随者重定向请求
lastIncludedIndex 快照中包含的最后?日志条?目的索引值
lastIncludedTerm 快照中包含的最后?日志条?目的任期号
offset 分块在快照中的字节偏移量量
data[] 原始数据
done 如果这是最后?一个分块则为 true
结果 解释
term 当前任期号(currentTerm),便便于领导?人更更新?自?己
图 13:?一个关于安装快照的简要概述 。为了了便便于传输,快照都是被分成分块的;每个分块都给了了跟随者?生命的迹象,所以跟随者可以重置选举超时计时器器 。在这种情况下领导?人使?用?一种叫做安装快照的新的 RPC 来发送快照给太落后的跟随者;?见图 13 。当跟随者通过这种 RPC 接收到快照时,他必须?自?己决定
对于已经存在的?日志该如何处理理 。通常快照会包含没有在接收者?日志中存在的信息 。在这种情况下,跟随者丢弃其整个?日志;它全部被快照取代,并且可能包含与快照冲突的未提交条?目 。如果接收到的快照是?自?己?日志的前?面部分(由于?网络重传或者错误),那么被快照包含的条?目将会被全部删除,但是快照后?面的条?目仍然有效,必须保留留 。这种快照的?方式背离了了 Raft 的强领导?人原则,因为跟随者可以在不不知道领导?人情况下创建快照 。但是我们认为这种背离是值得的 。领导?人的存在,是为了了解决在达成?一致性的时候的冲突,但是在创建快照的时候,?一致性已经达成,这时不不存在冲突了了,所以没有领导?人也是可以的 。数据依然是从领导?人传给跟随者,只是跟随者可以重新组织他们的数据了了 。我们考虑过?一种替代的基于领导?人的快照?方案,即只有领导?人创建快照,然后发送给所有的跟随者 。但是这样做有两个缺点 。第?一,发送快照会浪费?网络带宽并且延缓了了快照处理理的时间 。每个跟随者都已经拥有了了所有产?生快照需要的信息,?而且很显然,?自?己从本地的状态中创建快照?比通过?网络接收别?人发来的要经济 。第?二,领导?人的实现会更更加复杂 。例例如,领导?人需要发送快照的同时并?行行的将新的?日志条?目发送给跟随者,这样才不不会阻塞新的客户端请求 。还有两个问题影响了了快照的性能 。?首先,服务器器必须决定什什么时候应该创建快照 。如果快照创建的过于频繁,那么就会浪费?大量量的磁盘带宽和其他资源;如果创建快照频率太低,他就要承受耗尽存储容量量的?风险,同时也增加了了从?日志重建的时间 。?一个简单的策略略就是当?日志?大?小达到?一个固定?大?小的时候就创建?一次快照 。如果这个阈值设置的显著?大于期望的快照的?大?小,那么快照对磁盘压?力力的影响就会很?小了了 。第?二个影响性能的问题就是写?入快照需要花费显著的?一段时间,并且我们还不不希望影响到正常操作 。解决?方案是通过写时复制的技术,这样新的更更新就可以被接收?而不不影响到快照 。例例如,具有函数式数据结构的状态机天然?支持这样的功能 。另外,操作系统的写时复制技术的?支持(如 Linux 上的 fork)可以被?用来创建完整的状态机的内存快照(我们的实现就是这样的) 。


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。