首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将分布式数据系统(客户端、服务器)与Raft协议集成在一起

将分布式数据系统(客户端、服务器)与Raft协议集成在一起
EN

Stack Overflow用户
提问于 2017-07-30 09:42:19
回答 2查看 296关注 0票数 0

所以,首先,我为我的英语道歉。我不是母语人士。

问题是..我已经使用Thrift实现了一个具有分布式数据(3个服务器)的客户端-服务器应用程序。现在(项目的最后阶段)是使用Raft的一些实现(因为我正在使用Java,一个选项是copycat)来复制每个服务器。但是节俭以他的方式创建服务器和客户端(类似于Grafosd.Client client = new...)而Grafosd是由Thrift生成的。另外,Thrift将数据存储在Handler?中。和copycat以不同的方式创建服务器和客户端(类似于CopycatClient client = builder.build();)。数据存储在StateMachine?中。

所以我很难把这两个都集成起来。有人已经使用过带有Raft协议实现的Thrift Client-Server吗?(不需要模仿,它可以是Java中的任何Raft实现)。

EN

回答 2

Stack Overflow用户

发布于 2017-07-31 02:31:14

首先,你必须问自己,为什么你的项目的第二阶段要使用共识算法?项目是否需要很强的一致性?您是否考虑过替代复制协议(八卦、主备份等)

无论您使用哪种Raft实现,大多数实现在系统中建模状态的方式都是作为状态机。

如果您想在服务器中嵌入Copycat,只需使用允许您与进程内服务器通信的LocalTransport即可。CopycatServer不必在远程机器上运行。将复制客户端和服务器嵌入到Thrift服务器中是非常现实和合理的。在Thrift服务器中,创建一个CopycatServer,其中包含一个可以表示系统状态更改的状态机,以及一个使用LocalTransport与本地服务器通信的CopycatClient

您还可以考虑使用AtomixReplica来处理这种本地客户机/服务器嵌入模式。它还包括过多的示例状态机和客户端API。

但正如我所说的,无论您使用的是Copycat/Atomix还是另一个Raft实现,您仍然必须以相同的方式对状态更改进行建模。对系统状态的每次更改都必须提交给Raft领导者,在那里它被记录下来,复制给追随者,并应用于状态机。状态机复制模型非常适合有状态系统。对于存储大量状态或需要在外部数据库中存储状态的系统,另一种选择是持久状态机。我发现这正是许多用户在Raft中寻找的东西。但您必须注意如何在Raft集群中实现持久状态机,否则会有重复写入的风险。

尽管如此,您应该首先确定对于您正在尝试解决的问题,是否需要一个像Raft这样的复杂协议。首先回答这个问题是什么,以及它对复制协议的要求。你需要分区容错吗?你需要强一致性吗?您是否需要高可用性?吞吐量要求是否排除了使用基于领导者的协议?为什么不直接写入任何被复制的外部数据库呢?

我是Copycat和Atomix的作者。当您回答其中一些问题并确定这是否确实是正确的方向时,请随时加入我们的聊天。

票数 2
EN

Stack Overflow用户

发布于 2017-08-01 20:29:16

从我的角度对你的问题有一些更一般的评论:

,但Thrift以他的方式创建服务器和客户端(类似于Grafosd.Client client = new...)而Grafosd是由Thrift生成的。

Thrift本身是(唯一)使用的序列化和RPC机制。更复杂的协议或API通常设计在Thrift之上,使用Thrift -但不在Thrift内部。这就像是用一辆车把材料运到建筑工地。并不是汽车决定了架构。汽车只是完成这项工作的手段。

在这方面,Thrift (或任何其他类似机制)在这种情况下只是一个工具。我建议首先在头脑中弄清楚,拼图的哪一块属于哪里,才能最大限度地利用系统的设计。

还有,Thrift将数据存储在处理器中?

我建议始终将处理程序设置为无状态。如果您需要一个状态,这是很好的,但它存储在其他地方。节俭本身不储存任何东西。它是处理程序实现,它掌握在服务器端开发人员手中,可能需要存储状态或其他信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45395593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档