保持在群组通信服务或paxos中记录消息是否实用?

Is keep logging messages in group communication service or paxos practical?

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

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

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

你真的不需要记住整个日志。想象一下,例如,您在节点之间同步的状态类似于 SQL table,其中一行的形式为 (id: int, name: string) 以及将写入的命令日志的格式为 "insert row with id=x and name=y"、"delete row where id=z"、"set name=a where id=1000"、...

一旦提交了此类命令,您真正关心的就是最后的 table。那么一旦一个长时间离线的节点上线,它只需要从日志中下载 table + 几个在下载 table 时提交的条目。

这叫做 "log compaction",请查看 Raft paper 中的第 7 章了解更多信息。