首先你要问自己为什么你的项目的第二阶段要使用共识算法?项目是否需要强一致性?您是否考虑过替代复制协议(八卦、主备份等)
无论您使用哪种 Raft 实现,大多数实现在系统内建模状态的方式都是作为状态机。对系统状态的更改必须通过 Raft 协议传递给领导者并复制到跟随者,并且如果要保持一致性/容错保证,对系统状态的查询也必须通过协议。
如果您想在服务器中嵌入 Copycat,只需使用LocalTransport
允许您与进程内服务器通信的 which。CopycatServer
不必在远程机器上运行。在 Thrift 服务器中嵌入 Copycat 客户端和服务器是完全现实和合理的。在您的 Thrift 服务器中,创建一个CopycatServer
包含可以表示系统状态更改的状态机,以及一个CopycatClient
使用 aLocalTransport
与本地服务器通信的 a。
您也可以考虑使用 Atomix 来AtomixReplica
为您处理本地客户端/服务器嵌入模式。它还包括大量的示例状态机和客户端 API。
但正如我所说,无论您使用 Copycat/Atomix 还是其他 Raft 实现,您仍然必须以相同的方式对状态更改进行建模。对系统状态的每次更改都必须提交给 Raft 领导者,在那里它被记录并复制到追随者并应用于状态机。状态机复制模型非常适合有状态系统。存储大量状态或需要将状态存储在外部数据库中的系统的替代方案是持久状态机。我发现这是许多用户在 Raft 中寻找的东西。但是您必须小心在 Raft 集群中如何实现持久状态机,否则您将面临重复写入的风险。
不过,您应该首先确定是否需要像 Raft 这样的复杂协议来解决您要解决的问题。首先回答这个问题是什么,以及它对复制协议的要求。你需要分区容错吗?你需要强一致性吗?您需要高可用性吗?吞吐量要求是否排除使用基于领导者的协议?为什么不直接写入任何已复制的外部数据库?
我是 Copycat 和 Atomix 的作者。当您回答其中一些问题并确定这是否确实是正确的方向时,请随时加入我们的聊天。