【问题标题】:Are secondary replicas essential in Service Fabric辅助副本在 Service Fabric 中是否必不可少
【发布时间】:2019-01-11 15:05:21
【问题描述】:

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

这很好。

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

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

那么在我的情况下真的需要它们吗?如何使用有状态服务仅在集群中对数据进行分区而不用担心副本?我是不是误会了什么?

【问题讨论】:

  • 我的系统将数据写入数据库 -> 我想你的意思是可靠的集合?否则你应该使用无状态服务
  • 我有超过 100000 条数据。我想将这些数据分布在集群中,以使负载均匀分布。我已经想通了。在我当前的模型中(不使用缩放或可靠的集合)数据由系统接收然后保存到数据库中以用于持久性目的。我正在考虑将数据保存在可靠的集合中并将其写入数据库,以便可以使用常规查询来获取数据
  • 我会这样做的。要么使用可靠的集合,要么使用数据库,但不能同时使用两者。如果您需要对数据库中的数据进行内存访问,请使用简单的并发集合或 redis 缓存。
  • 无论如何,您存储在可靠集合中的数据会被复制,因此当主节点出现故障时,可以在所有数据完好无损的情况下提升辅助节点。所以是的,他们是需要的!但是辅助不接受请求,因此它们纯粹是为了可靠集合的数据安全而存在
  • 我试图寻找可靠的集合,因为数据保留在集群本地,我不知道 redis 如何处理并发。数据库方面更多是因为有习惯于从数据库获取数据的开发人员

标签: c# azure-service-fabric


【解决方案1】:

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

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

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

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

  • 如果您使用的是 .Net,则通过 MemoryCache 进行进程内缓存;
  • Azure Redis 缓存在集群的同一区域\专区中
  • Redis 缓存在与 GuestExecutable 相同的集群中(单独的节点)
  • Redis 缓存作为 sidecar,与您的服务一起部署在同一节点上

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

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

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

【讨论】:

  • 我拼命地试图避免使用 redis - a) 因为不知道它如何处理并发性和 b) 因为它是集群之外的另一个跃点。不过,我对划分无状态服务的想法很感兴趣。我最初真正想做的就是将我的工作分散到集群中
  • 就数据库而言,我可能会丢失它,并且可能有一个每天晚上将数据写入数据库的进程?
  • 我添加了额外的信息,请看一下。您可以使用 MemoryCache 代替 redis,但我仍然认为您正在增加额外的开销和将数据移动到服务的复杂性,因为您拥有的数据量非常低,无法证明这种设计方法的合理性,一个简单的数据库实例可以处理这个量很好。
  • @DiegoMendes 这真的取决于您如何访问数据。如果您需要查询所有 1M 记录,将它们全部更新,并在每次用户单击按钮时将它们保存回 db,那么这可能是可靠集合的情况。像这样的用例存在网络速度等限制,这是任何数据库都无法克服的。有时数据需要与处理处于同一位置。
猜你喜欢
  • 2018-08-30
  • 1970-01-01
  • 2018-07-04
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多