多集群配置确定了当前哪些集群是多群集的一部分。它不会自动更改,但可由人员控制。因此,它与集群中使用的成员身份机制完全不同,后者自动确定属于集群一部分的silo集合。
我们对服务中的集群使用以下术语:
活动/非活动状态独立于连接/未连接:所有四种组合都是可能的。
对一个特定服务的所有集群而言,它们通过一个gossip网络来连接。gossip网络传播配置和状态信息。
通过将配置更改注入多群集网络,作业人员发布配置更改。可以将配置注入任何集群,并从那里传播到所有活动集群。每个新配置,都包含一个构成多群集的群集ID列表。它还具有UTC时间戳,用于跟踪其通过gossip网络的传播。
最初,多群集配置为空,这意味着多集群列表为空(不包含集群)。因此,作业人员必须首先注入多集群配置。一旦注入,此配置将持续存在于所有连接的silo(运行时)和所有指定的gossip通道中(如果这些通道是持久的)。
我们新配置的注入提出了一些限制,作业人员必须遵循这些限制:
这些限制,确保了即使在配置更改下,诸如单实例协议之类的协议,也可以正确地保持激活的互斥。
通过管理grain
使用Orleans 管理Grain,可以在任何集群中的任何节点上,注入多群集配置。例如,要注入由三个集群{us1,eu1,us2}组成的多集群配置,我们可以将可枚举的字符串,传递给管理Grain:
var clusterlist = "us1,eu1,us2".Split(',');
var mgtGrain = client.GetGrain(0);
mgtGrain.InjectMultiClusterConfiguration(clusterlist, "my comment here"));
第一个参数InjectMultiClusterConfiguration
,是一个可枚举的集群ID,它将定义新的多集群配置。第二个参数是一个(可选的)注释字符串,可用于标记具有任意信息的配置,例如谁注入了它们、为什么注入。
第三个参数是可选的,一个名为checkForLaggingSilosFirst
的布尔值,默认为true。这意味着,系统将尽最大努力,检查是否有任何silo尚未赶上当前配置,如果找到这样的silo,则拒绝更改。这有助于检测违反这种限制的情况,即一次只应挂起一个配置更改(尽管不能在所有情况下保证它)。
通过默认配置
在预先知道多集群配置,并且每次部署都很新的情况下(例如,用于测试),我们可能希望提供默认配置。全局配置支持可选属性DefaultMultiCluster
,该属性采用以逗号分隔的群集ID列表:
var silo = new SiloHostBuilder()
[...]
.Configure(options =>
{
[...]
options.DefaultMultiCluster = new[] { "us1", "eu1", "us2" };
[...]
})
[...]
使用此设置启动silo后,它会检查当前多集群配置是否为null,如果为null,则以当前UTC时间戳,注入给定的配置。
警告:持久化的多群集gossipi通道(例如,基于AzureTable)保留最后一次注入的配置,除非它们被显式地删除。在这种情况下,在重新部署群集时指定一个DefaultMulticluster,是没有效果的,因为存储在gossip通道中的配置不为null。
通过gossip通道
作业人员还可以将配置直接注入到gossip通道中。通过周期性的后台的gossip,通道中的变化,会被自动拾取和传播,尽管可能非常缓慢(使用管理grain要快得多)。传播时间的粗略估计是30秒(或全局配置中指定的任何gossip间隔)乘以所有集群中silo总数的以2为底的对数。但由于gossip对是随机选择的,所以它既可能快得多,也可能慢得多。
如果使用Azure基于表的gossip通道,作业人员只需在OrleansGossipTable
中编辑配置记录,即可注入新的配置,例如使用某些工具编辑Azure表中的数据。配置记录的格式如下:
名称 | 类型 | 值 |
---|---|---|
PartitionKey | String | ServiceId |
RowKey | String | “CONFIG” |
Clusters | String | 以逗号分隔的群集ID列表,例如“us1,eu1,us2” |
Comment | String | 可选的注释 |
GossipTimestamp | DateTime | 配置的UTC时间戳 |
注意:在存储中编辑此记录时,还必须将GossipTimestamp设置为比当前更新的值(否则忽略更改)。最方便和推荐的方法是删除GossipTimestamp字段 ——然后我们的gossip通道实现,会自动用正确的当前时间戳替换它(它使用Azure表时间戳)。
从多集群中添加或删除集群,通常需要在更大的上下文中进行协调。从多群集添加/删除群集时,我们建议始终遵循下述过程。
添加群集的过程
删除群集的过程
以这种方式删除群集后,可以按照添加新群集的过程,重新添加群集。
存在短暂的、临时时间段,此时群集是活动的、且非连接的:
在那些中间情况下,以下情况是可能的: