3

在网络分区或节点崩溃的情况下,大多数分布式原子广播协议(如扩展虚拟同步或 Paxos)都需要运行节点来保持记录消息,直到崩溃或分区节点重新加入集群。当一个节点重新加入集群时,重播记录的消息足以重新获得当前状态。

我的问题是,如果分区/崩溃节点需要很长时间才能再次加入集群,那么最终日志会溢出。这似乎是一个非常实际的问题,但他们的论文中仍然没有人谈论它。我缺少一个非常明显的解决方案吗?或者我的理解不正确。

4

2 回答 2

2

无限日志问题有一些潜在的解决方案,但复制状态机更流行的解决方案之一是定期对完整复制的状态机进行快照并删除该点之前的所有历史记录。离线时间过长的节点将丢弃所有信息,下载快照,然后从该点开始重放复制的日志。

于 2016-10-18T16:53:00.667 回答
2

你真的不需要记住整个日志。例如,假设您在节点之间同步的状态类似于 SQL 表,其中一行格式为 (id: int, name: string),而将写入日志的命令格式为“插入行” with id=x and name=y", "delete row where id=z", "set name=a where id=1000",...

一旦提交了此类命令,您真正关心的只是决赛桌。然后一旦一个长时间离线的节点上线,它只需要下载表+在下载表时提交的日志中的几个条目。

这称为“日志压缩”,请查看Raft 论文的第 7 章了解更多信息。

于 2016-10-19T20:36:47.917 回答