Orleans 2.0 官方文档 —— 6.8.2 部署 -> 多集群支持 -> 多集群配置

多集群配置

多集群配置确定了当前哪些集群是多群集的一部分。它不会自动更改,但可由人员控制。因此,它与集群中使用的成员身份机制完全不同,后者自动确定属于集群一部分的silo集合。

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

  • 如果集群至少有一个活动的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表时间戳)。

群集添加/删除的过程

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

添加群集的过程

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

删除群集的过程

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

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

非连接集群的活动

存在短暂的、临时时间段,此时群集是活动的、且非连接的:

  • 新启动的集群,可能会在进入多集群配置之前,开始执行代码(在添加集群的过程的步骤1和2之间)。
  • 正在退出的集群,可能仍然在管道关闭之前,执行代码(在删除集群的过程的步骤2和3之间)。

在那些中间情况下,以下情况是可能的:

  • 对于全局单实例粒度:grain可能在未连接的集群上,具有重复的激活体。
  • 对于版本控制的grain:非连接的集群上的激活体,当grain状态发生变化时,不会收到通知。

你可能感兴趣的:(Orleans)