首页 文章

RAFT共识协议 - 在提交之前条目是否应该是持久的

提问于
浏览
3

我有关于实现RAFT的以下查询:

请考虑以下方案\实现:

  • RAFT领导者收到一个命令条目,它将该条目附加到内存数组中然后将条目发送给粉丝(具有心跳)

  • 关注者接收条目并将其附加到其内存数组中,然后发送已收到条目的响应

  • 然后领导者通过将其写入持久存储(文件)来提交条目领导者在心跳中发送最新的提交索引

  • 关注者然后通过将条目存储到其持久存储(文件)中来提交基于leader的提交索引的条目

RAFT的一个实现(链接:https://github.com/peterbourgon/raft/)似乎以这种方式实现它 . 我想确认这是否正常 .

如果条目由领导者和关注者“保留在内存中”直到它被提交,这样可以吗?在什么情况下这种情况会失败?

2 回答

  • 0

    我通过发布到raft-dev谷歌小组找到了问题的答案 . 我已经添加了答案以供参考 .

    请参考:https://groups.google.com/forum/#!msg/raft-dev/_lav2NeiypQ/1QbUB52fkggJ

    引用迭戈的答案:

    为了安全起见,即使面对相关的电力中断,大多数服务器也需要在其效果外部化之前保留日志条目 . 任何少于多数的服务器都可能永久失败,从而导致数据丢失/损坏

    引用Ben Johnson's回复我的电子邮件相同:

    不,服务器必须先将条目刷新到磁盘,然后再将其视为仲裁的一部分 . 例如,假设您有一个名为A,B和C的节点集群,其中A是领导者 . 节点A将节目复制到节点B.节点B将条目存储在内存中并响应节点A.节点A现在具有仲裁并提交条目 . 然后节点A从节点B和C分开 . 节点B然后死亡并丢失条目的内存中副本 . 节点B恢复正常 . 当节点B&C然后选择领导者时,“已提交”条目将不在他们的日志中 . 当节点A重新加入群集时,它将具有不一致的日志 . 该条目将被提交并应用于状态机,因此无法回滚 . 本

  • 3

    我不同意接受的答案 .

    • 磁盘不是't mystically durable. Assuming the disk is local to the server it can permanently fail. So clearly writing to disk doesn' t拯救你 . 复制是持久性的,前提是复制品存在于不同的故障域中,如果您认真对待它们的持久性 . 当然,磁盘存在许多危险,因为磁盘不是一个问题 .

    • 如果日志存储丢失,则主机标识也应丢失 . A,B,C识别日志 . 新日志,新ID . 在(潜在的)存储丢失之后B“重新加入”只是一个错误的实现 . 新流程无法声明B的身份,因为它无法确定它是否具有B所具有的所有信息 . 就像在我们更换托管B的机器的磁盘时总是刷新到磁盘的情况一样,我们不能只重新启动它配置为具有B标识的进程 . 那是胡说八道 . 它应该在两种情况下都以D重新启动,然后请求加入群集 . 在这一点上,丢失承诺写入的问题在一阵烟雾中消失了 .

相关问题