在服务结构集群中存储大量状态

Storing a large amount of state in a service fabric cluster

我有一个场景需要存储 x*100 GB 的数据。对于服务结构集群本身中的参与者(分区良好,仅由特定参与者使用),数据通常是持久状态的良好候选者。

对于这种规模的数据,是否推荐使用 Service Fabric 持久状态存储? (我们的计算负载将相当低,因此仅仅为了存储状态而增加 VM 不是一个理想的选择。)

持久状态的数量如何影响集群中节点之间移动分区的延迟?

好吧,让我们看看状态是如何存储在服务中的(这也适用于参与者)。

在您的服务中存储数据的组件称为状态提供程序。状态提供者可以仅在内存中或在内存中 + 本地磁盘。您通过 actor 服务获得的默认状态提供者是内存 + 本地磁盘,但它只将热数据保存在内存中,因此您的存储需求不受内存限制。与 Reliable Collections state provider 相比,它目前将所有数据都存储在内存中和本地磁盘上,尽管在未来的版本中它也可以选择仅将热数据保留在内存中并将其余数据卸载到本地磁盘。

鉴于您使用的是 actors,您可以使用默认的 actor 状态提供程序,这意味着您的数据容量受机器或 VM 上的本地磁盘存储限制,这对于存储 100 GB 的数据应该是合理的。我们通常不会移动整个分区,但偶尔 Service Fabric 确实需要重建您的服务的副本,并且您拥有的数据越多,构建副本所需的时间就越长。然而,这并不会真正影响您的服务的延迟,因为您在有状态服务中有多个副本,并且您通常有足够的副本,您不需要等待另一个副本被重建。重建副本通常会发生 "off to the side."

的确,仅仅为了存储状态而添加 VM 并不经济,但请记住,您可以根据需要将任意数量的服务打包到 VM 上。因此,即使您的 actor 服务没有使用太多计算,您始终可以在这些 VM 上打包其他服务​​以使用该计算,以便您最大限度地利用 VM 上的计算和存储,这实际上非常经济。