辅助副本在 Service Fabric 中是否必不可少

Are secondary replicas essential in Service Fabric

我是有状态服务的新手。我需要使用可靠的集合在我的集群中传播我的数据。

这很好。

我对次要副本感到困惑。我的系统将数据写入数据库。

查看文档,辅助副本也被设计为保存状态。但是,它们永远不会真正准确,因为我不希望它们写入数据库。

所以我的情况真的需要它们吗?我如何使用有状态服务来跨集群分区我的数据而不用担心副本?我是不是误会了什么?

如果您使用 Reliable Collections 作为主存储,是的,辅助副本对于跨不同节点复制数据并在节点发生故障时保持数据可用性至关重要。

因为您也在将相同的数据添加到数据库中,所以您不会有丢失数据的相同风险,但是将副本保留在集群中是有益的,因为万一一个节点出现故障您的数据(在主机更新和硬件故障期间非常常见),您将不得不将数据库与新服务实例同步,并且当此数据太大时同步可能需要很长时间,因此您的服务将不得不等待在您再次开始使用它之前同步完成,如果您已经在其他节点上复制了副本,则发生故障时唯一需要的过程是选择一个辅助节点作为主要节点,并以尽可能短的停机时间继续处理。

在我看来,你所做的只是增加了进程的额外开销,因为当你必须将数据写回数据库时,你将数据保存在节点中所获得的性能会丢失,除非这是静态的数据仅供查询。此外,保持它们同步的复杂性,您可能会遇到一些问题,例如,将其保存到数据库并已将其写入 Reliable Collection,反之亦然,必须处理不同存储上的回滚或使它们不同步。

也许您可以考虑将有状态服务替换为无状态服务,并在您的服务和数据库之间添加一个缓存层,每次调用以获取数据库中的项目时,您都会检查它是否尚未在缓存中,如果不,从数据库中获取并添加到缓存中,对于你可以使用的情况:

  • 如果您使用的是 .Net,则通过 MemoryCache 进行 InProcess 缓存;
  • Azure Redis 缓存在您的集群region\zone 中
  • Redis缓存与GuestExecutable在同一个集群(独立节点)
  • Redis 缓存作为 sidecar,与您的服务一起部署在同一节点上

您还可以使用无状态服务获得服务结构的分区概念,其中每个服务将负责一组数据,this documentation 的第一部分对此进行了解释。

关于您关于使用 Redis 的论点:Redis 是目前最可靠的缓存解决方案之一,我认为并发性对您来说不是问题,它也可以作为集群的一部分进行部署GuestExecutble 或作为容器(首选)。

除非 DB+Cache 是你当前情况的瓶颈,否则 100000 项几乎没有,任何数据库系统都可以很好地处理,我建议你只坚持使用 DB 解决方案,因为它更多成熟,互联网上载有涵盖大多数用例的内容。采用 Reliable Collections 会增加您的解决方案的复杂性和维护性,在这种规模上不会带来太多好处。