多群集配置

多群集配置确定哪些群集当前属于多群集。 它不会自动更改;相反,由操作员控制。 因此,它与群集中使用的成员身份机制大相径庭,该机制会自动确定属于该群集的一组孤岛。

我们对服务中的群集使用以下术语:

  • 如果群集至少有一个活跃的存储仓,它就是活跃的,否则,群集则处于非活跃状态。
  • 如果群集是当前多群集配置的一部分,则为加入群集,否则为未加入群集。

主动/非活动与联接/非联接无关:所有四种组合都是可能的。

特定服务的所有群集都通过信息传播网络进行连接。 八卦网络传播配置和状态信息。

注入配置

操作员通过将配置更改注入多群集网络来进行配置更改。 可以将配置注入到任何群集中,它们从那里传播到所有活动群集。 每个新配置都包含构成多群集的群集 ID 列表。 它还具有 UTC 时间戳,用于通过八卦网络跟踪其传播。

最初,多群集配置为 null,这意味着多群集列表为空(不包含群集)。 因此,操作员 最初必须 注入多集群配置。 注入后,此配置将在所有连接的数据仓(正在运行时)和所有指定的消息通道(如果这些通道是持久的)中保留。

我们对注入作员必须遵循的新配置施加一些限制:

  • 每个新配置可以添加多个群集,或删除一些群集(但不能同时添加两个群集)。
  • 当以前的配置更改仍在处理时,作员不应发出新配置。

这些限制可确保单实例协议等协议可以正确维护激活的相互排斥,即使在配置更改期间也是如此。

管理粒度

可以在任何群集中的任何节点上使用Orleans Management Grain注入多群集配置。 例如,若要注入由三个群集 { us1、eu1、us2 }组成的多群集配置,请将可枚举的字符串传递给管理粒度:

var clusters = "us1,eu1,us2".Split(',');
var mgtGrain = client.GetGrain<IManagementGrain>(0);
mgtGrain.InjectMultiClusterConfiguration(clusters, "my comment here"));

第一个参数 InjectMultiClusterConfiguration(IEnumerable<String>, String, Boolean) 是定义新多群集配置的群集 ID 集合。 第二个参数是一个可选的备注字符串,可以用来标注配置信息,比如谁添加了这些配置以及原因。

有一个可选的第三个参数,一个名为布尔值 checkForLaggingSilosFirst,默认为 true。 这意味着系统会尽最大努力检查,看看任何数据孤岛是否尚未赶上当前配置。 如果发现这种孤岛,它将拒绝更改。 这有助于检测一次只能有一个配置更改处于挂起状态的限制违规,但无法在所有情况下对这一点提供保证。

默认配置

如果提前知道多群集配置,并且每次(用于测试)部署都是全新的,可能需要提供默认配置。 全局配置支持一个可选属性,该属性 DefaultMultiCluster 采用以逗号分隔的群集 ID 列表:

var silo = new HostBuilder()
    .UseOrleans(builder =>
    {
        builder.Configure<MultiClusterOptions>(options =>
        {
            options.DefaultMultiCluster = new[] { "us1", "eu1", "us2" };
        })
    })
    .Build();

在仓库使用此设置启动后,它会检查当前多群集配置是否为 null。 如果是,筒仓将以当前的 UTC 时间戳注入给定的配置。

警告

持久多群集八卦通道(基于 AzureTable)保留上次注入的配置,除非显式删除它们。 在这种情况下,重新部署群集时指定DefaultMultiCluster不会起作用,因为gossip通道中存储的配置不为空。

八卦频道

操作员还可以将配置直接注入到网络扩散通道。 定期的后台消息交换会自动获取和传播通道中的更改,尽管可能非常缓慢(使用管理机制要快得多)。 传播时间的粗略估计为 30 秒(或在全局配置中指定的八卦间隔)乘以所有群集的总仓库数量的二进制对数。 但是,由于八卦对是随机选择的,传播速度可能会更快或更慢。

如果使用基于 Azure 表的八卦通道,操作员只需使用工具编辑 Azure 表数据中的 OrleansGossipTable 配置记录,便可轻松注入新配置。 配置记录的格式如下:

名称 类型 价值
分区键 字符串 服务ID
行键 字符串 “CONFIG”
集群 字符串 以逗号分隔的群集 ID 列表,例如“us1,eu1,us2”
注释 字符串 可选注释
GossipTimestamp 日期时间 配置的 UTC 时间戳

注释

在存储中编辑此记录时,还必须将该值设置为 GossipTimestamp 比其当前值新的值(否则,将忽略更改)。 执行此作的最方便和建议方法是 删除 GossipTimestamp 字段。 然后,八卦通道实现会自动将其替换为正确的当前时间戳(它使用 Azure 表时间戳)。

群集程序

从多群集添加或删除群集通常需要在较大的上下文中进行协调。 建议始终遵循在从多群集添加或删除群集时所述的过程。

添加群集的过程

  1. 启动一个新 Orleans 群集,等待所有孤岛启动并运行。
  2. 注入包含新群集的配置。
  3. 开始将用户请求路由到新群集。

删除群集的过程

  1. 停止将新用户请求路由到群集。
  2. 注入一个不再包含集群的配置。
  3. 停止群集的所有孤岛。

以这种方式删除群集后,可以按照添加新群集的过程重新添加它。

未连接集群上的活动

当群集同时处于活动状态且未加入时,可能会有短暂的临时时段:

  • 新启动的群集可能会在多群集配置中包含代码之前开始执行代码(在添加群集的过程的步骤 1 到步骤 2 之间)。
  • 停用的群集在数据仓关闭之前仍可能执行代码(群集移除过程中的步骤 2 和步骤 3 之间)。

在这些中间情况下,可能发生以下情况:

  • 对于全局单实例粒度:粒度在未加入的群集上可能有重复激活。
  • 对于版本化的粒子:在未加入群集的激活时,当粒子状态更改时将不会收到通知。