Azure Service Fabric可靠的集合和内存

tym*_*tam 14 azure-service-fabric

假设我在5 D1类(1核,3.5GB RAM,50GB SSD)VM上运行Service Fabric集群.我正在这个集群上运行2个可靠的服务,一个是无状态的,一个是有状态的.我们假设副本目标是3.

  1. 如何计算我的可靠收藏能保持多少?

  2. 假设我添加了一个或多个有状态服务.由于我真的不知道框架如何分配服务,我需要采取最保守的方法,并假设一个节点可以在一个节点上运行我的所有有状态服务,并且它们的累积内存需要低于可用的RAM.单机?

mas*_*der 27

TLDR - 估计集群的预期容量是部分艺术,部分科学.你可能会得到一个很好的下限,你可能会推高,但在大多数情况下,部署,运行它们,以及在工作负载条件下收集数据是回答这个问题的最佳方法.

1)通常,给定计算机上的集合受可用内存量或节点上可用磁盘空间量(以较低者为准)的限制.今天我们将所有数据保存在内存中,并将其保存到磁盘中.因此,群集中的集合可以容纳的最大量通常是(群集中的可用内存量)/(目标副本集大小).

请注意,"可用内存"是计算机上运行的其他代码(包括操作系统)遗留的任何内容.在上面的示例中,虽然您没有在所有节点上运行 - 但您只能获得其中的3个节点.因此,(不切实际地)从这些其他因素假设0开销,您可以期望能够在运行它的节点上的内存不足之前将大约3.5 GB的数据放入该有状态服务副本中.群集中仍有2个节点留空.

让我们再看一个例子.假设它与上面的示例大致相同,除非在这种情况下您将有状态服务设置为要分区.假设您选择了一个5的分区计数.所以现在每个节点上都有一个主副本和两个来自其他分区的辅助副本.在这种情况下,每个分区最多只能容纳大约1.16 GB的状态,但现在总体而言,您可以将5.83 GB的状态打包到群集中(因为现在可以完全利用所有节点).顺便说一句,只是为了证明数学运算,那就是(每个节点3.5 GB的内存*集群中的5个节点)[17.5] /(目标副本集大小为3)= 5.83.

在所有这些示例中,我们还假设所有分区和所有副本的内存消耗是相同的.很多时候事实证明不是真的(至少是暂时的) - 一些分区最终可能会有更多或更少的工作要做,因此资源消耗不均匀.我们还假设副词总是与初选相同.在国家数量的情况下,可以公平地假设这些将相当均匀地跟踪,但是对于其他资源消耗它可能不是(只是要记住的事情).在消费不均衡的情况下,这正是Service Fabric的其他群集资源管理将有所帮助的地方,因为我们可以了解不同副本的消耗并将它们有效地打包到群集中以利用可用空间.自动报告集合中与州相关的资源消耗是我们想要做的事情,所以将来这将是自动的,但今天你必须自己报告这种消费.

2)默认情况下,我们将根据默认指标平衡服务(此处有关于指标的更多信息).因此,默认情况下,这两种不同服务的不同副本最终可能会出现在计算机上,但在您的示例中,您将最终得到4个节点,其中1个副本来自服务,然后是1个节点,其中包含来自两个不同服务的两个副本.这意味着每个服务(每个服务都有1个分区)根据您的示例,每个服务只能消耗1.75 GB的内存,而群集中的总共3.5 GB.这再次小于集群的总可用内存,因为您没有使用某些节点部分.

请注意,这是最大可能消耗,并假设服务本身之外没有消耗.不建议将此作为最大值.由于多种原因,您需要减少它,但最实际的原因是确保在存在升级和故障的情况下,群集中有足够的可用容量.例如,假设您有5个升级域和5个故障域.现在让我们假设在升级域中进行升级时,故障域的节点价值会失败.这意味着(稍微不到)40%的群集容量可能随时消失,并且您可能希望剩余节点上留有足够的空间来继续.这意味着,如果您的群集以前可以保持5.83 GB的状态(根据我们之前的计算),实际上您可能不希望在其中放置超过大约3.5 GB的状态,因为更多的服务可能无法使用恢复100%健康(另请注意,我们不会立即构建替换副本,因此在遇到此情况之前,必须关闭ReplicaRestartWaitDuration的节点).有一堆约指标,产能的更多信息,缓冲能力(你可以用它来确保房间留在失败的情况下节点)和故障和升级域覆盖在这篇文章.

还有一些其他的东西实际上会限制你能够储存的州的数量.你会想做几件事:

  • 估算数据的大小.通过计算对象所拥有的每个字段的大小,您可以预先估算数据的大小.请务必考虑64位引用.这将为您提供一个下限的起点.
  • 存储开销.存储在集合中的每个对象都会带来一些存储该对象的开销.在可靠的集合中,取决于集合和当前正在运行的操作(复制,枚举,更新等),这种开销可以在集合中存储的每个项目(行)的100到大约700字节之间.我们也知道我们一直在寻找减少引入的开销的方法.

我们还强烈建议您在一段时间内运行服务,并通过性能计数器测量实际资源消耗.模拟某种实际工作负荷然后测量您关心的指标的实际使用情况将很好地为您服务.我们特别建议这样做的原因是,您将能够看到消耗来自哪些CLR对象堆最终放置的对象,GC运行的频率,是否存在泄漏,或者其他会影响金额的事情你可以实际使用的记忆.

我知道这是一个很长的答案,但我希望你发现它有用而且完整.

  • 您必须弄清楚“过时”在该数据和服务的上下文中意味着什么,然后将其删除(通常还将其存档在其他地方,例如 DocDB)。通常这是其他一些字典,它将时间戳(数据修改时的时间戳)作为键,并将字典中数据的键作为值。然后每隔一段时间运行一个任务,将数据保存到冷存储中,然后删除原始字典中的数据。标记和清除是一个很好的模式。在决定应删除某些内容并使其重新变得新鲜的竞争条件时要小心。华泰 (2认同)