我有关于实现RAFT的以下查询:
请考虑以下方案\实现:
-
RAFT领导者收到一个命令条目,它将该条目附加到内存数组中然后将条目发送给粉丝(具有心跳)
-
关注者接收条目并将其附加到其内存数组中,然后发送已收到条目的响应
-
然后领导者通过将其写入持久存储(文件)来提交条目领导者在心跳中发送最新的提交索引
-
关注者然后通过将条目存储到其持久存储(文件)中来提交基于leader的提交索引的条目
RAFT的一个实现(链接:https://github.com/peterbourgon/raft/)似乎以这种方式实现它 . 我想确认这是否正常 .
如果条目由领导者和关注者“保留在内存中”直到它被提交,这样可以吗?在什么情况下这种情况会失败?
2 回答
我通过发布到raft-dev谷歌小组找到了问题的答案 . 我已经添加了答案以供参考 .
请参考:https://groups.google.com/forum/#!msg/raft-dev/_lav2NeiypQ/1QbUB52fkggJ
引用迭戈的答案:
引用Ben Johnson's回复我的电子邮件相同:
我不同意接受的答案 .
磁盘不是'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重新启动,然后请求加入群集 . 在这一点上,丢失承诺写入的问题在一阵烟雾中消失了 .