多群集配置确定哪些群集当前属于多群集。 它不会自动更改;相反,由操作员控制。 因此,它与群集中使用的成员身份机制大相径庭,该机制会自动确定属于该群集的一组孤岛。
我们对服务中的群集使用以下术语:
- 如果群集至少有一个活跃的存储仓,它就是活跃的,否则,群集则处于非活跃状态。
- 如果群集是当前多群集配置的一部分,则为加入群集,否则为未加入群集。
主动/非活动与联接/非联接无关:所有四种组合都是可能的。
特定服务的所有群集都通过信息传播网络进行连接。 八卦网络传播配置和状态信息。
注入配置
操作员通过将配置更改注入多群集网络来进行配置更改。 可以将配置注入到任何群集中,它们从那里传播到所有活动群集。 每个新配置都包含构成多群集的群集 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 表时间戳)。
群集程序
从多群集添加或删除群集通常需要在较大的上下文中进行协调。 建议始终遵循在从多群集添加或删除群集时所述的过程。
添加群集的过程
- 启动一个新 Orleans 群集,等待所有孤岛启动并运行。
- 注入包含新群集的配置。
- 开始将用户请求路由到新群集。
删除群集的过程
- 停止将新用户请求路由到群集。
- 注入一个不再包含集群的配置。
- 停止群集的所有孤岛。
以这种方式删除群集后,可以按照添加新群集的过程重新添加它。
未连接集群上的活动
当群集同时处于活动状态且未加入时,可能会有短暂的临时时段:
- 新启动的群集可能会在多群集配置中包含代码之前开始执行代码(在添加群集的过程的步骤 1 到步骤 2 之间)。
- 停用的群集在数据仓关闭之前仍可能执行代码(群集移除过程中的步骤 2 和步骤 3 之间)。
在这些中间情况下,可能发生以下情况:
- 对于全局单实例粒度:粒度在未加入的群集上可能有重复激活。
- 对于版本化的粒子:在未加入群集的激活时,当粒子状态更改时将不会收到通知。