Share via


多叢集設定

多叢集設定會決定哪些叢集目前屬於多叢集的一部分。 其不會自動變更,而是由運算子控制。 因此,其與叢集內所使用的成員資格機制相當不同,後者會自動判斷屬於叢集的定址接收器集合。

我們會針對服務中的叢集使用下列術語:

  • 如果叢集至少有一個作用中的定址接收器,則叢集為作用中,否則為非作用中
  • 如果叢集是目前多叢集設定的一部分,則為已聯結,否則為非聯結

作用中/非作用中與已聯結/非聯結無關:這四種組合都是可能的。

特定服務的所有叢集都會由 Gossip 網路連線。 Gossip 網路會傳播設定和狀態資訊。

插入設定

運算子會將設定變更插入多叢集網路,以發出設定變更。 這些設定可以插入任何叢集中,並從該處散佈到所有作用中的叢集。 每個新設定都包含形成多叢集的叢集識別碼清單。 其也具有 UTC 時間戳記,可用來追蹤其透過 Gossip 網路的傳播。

一開始,多叢集設定為 null,這表示多叢集清單是空的 (不包含任何叢集)。 因此,運算子一開始必須插入多叢集設定。 插入之後,此設定會保存在所有已連線的定址接收器 (同時為執行中),以及在所有指定的 Gossip 通道中 (如果這些通道是持續性)。

我們對運算子必須遵循的新設定插入提出一些限制:

  • 每個新設定可能會新增數個叢集,或移除某些叢集 (但不能同時執行這兩種操作)。
  • 運算子不應該在先前的設定變更仍在處理時發出新的設定。

這些限制可確保單一執行個體通訊協定之類的通訊協定,即使在設定變更下,也能正確地維護啟用的相互排除。

管理粒紋

您可以使用 Orleans 管理粒紋,在任何叢集中的任何節點上插入多叢集設定。 例如,若要插入包含三個叢集 { 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) 的第一個引數是叢集識別碼的集合,這會定義新的多叢集設定。 第二個引數是 (選用) 註解字串,此字串可用來標記具有任意資訊的設定,例如插入者及其原因。

選用的第三個引數是名為 checkForLaggingSilosFirst 的布林值,預設為 true。 這表示系統會盡全力進行檢查,以查看是否有任何位置的定址接收器尚未趕上目前設定,並在找到這類定址接收器時拒絕變更。 這有助於偵測限制違規,即一次只能有一個應擱置的設定變更 (但無法保證在所有情況下都是如此)。

預設的組態

在事先知道多叢集設定,且每次 (針對測試時) 部署都是最新的情況下,我們可能會想要提供預設設定。 全域設定支援選用屬性 DefaultMultiCluster,其採用以逗號分隔的叢集識別碼清單:

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

從這個設定開始定址接收器之後,其會檢查目前的多叢集設定是否為 Null,如果是,則會以目前的 UTC 時間戳記插入指定的設定。

警告

除非明確刪除,否則持續性多叢集 gossip 通道 (以 AzureTable 為基礎) 會保留最後插入的設定。 在此案例中,指定 DefaultMultiCluster 在重新部署叢集時沒有任何作用,因為儲存在 Gossip 通道中的設定不是 Null。>

Gossip 通道

運作子也可以直接將設定插入 Gossip 通道。 定期背景 gossip 會自動擷取並傳播通道中的變更,不過速度可能非常慢 (使用管理粒紋的速度會快很多)。 傳播時間的粗略估計值是 30 秒 (或全域設定中所指定的任何 Gossip 間隔) 乘以所有叢集中定址接收器總數的二進位對數。 但是,由於 Gossip 配對是隨機選取,因此兩者速度可能更快或更慢。

如果使用 Azure 資料表型 Gossip 通道,運算子只要編輯 OrleansGossipTable 中的設定記錄,使用某些工具來編輯 Azure 資料表中的資料,即可插入新的設定。 設定記錄的格式如下:

名稱 類型
PartitionKey String ServiceId
RowKey String "CONFIG"
叢集 String 以逗號分隔的叢集識別碼清單,例如「us1,eu1,us2」
註解 String 選用註解
GossipTimestamp Datetime 設定的 UTC 時間戳記

注意

在儲存體中編輯此記錄時,GossipTimestamp 也必須設定為比目前更新的值 (否則會忽略變更)。 若要這樣做,最方便且建議的方式是刪除 GossipTimestamp 欄位 - Gossip 通道實作,接著會自動將其取代為正確的目前時間戳記 (其使用 Azure 資料表時間戳記)。

叢集程序

從多叢集新增或移除叢集通常需要在一些較大內容內的協調。 建議您一律遵循在從多叢集新增/移除叢集時所述的程序。

新增叢集的程序

  1. 啟動新的 Orleans 叢集,並等候所有定址接收器啟動和執行。
  2. 插入包含新叢集的設定。
  3. 開始將使用者要求路由傳送至新的叢集。

移除叢集的程序

  1. 停止將使用者要求路由傳送至叢集。
  2. 插入不再包含叢集的設定。
  3. 停止叢集的所有定址接收器。

以這種方式移除叢集之後,您可以遵循新增叢集的程序來重新新增叢集。

非聯結叢集上的活動

叢集同時為作用中和非聯結的短暫暫時期間:

  • 全新啟動的叢集可能會在多叢集設定中開始執行程式碼 (在新增叢集程序的步驟 1 到 2 之間)
  • 正在解除委任的叢集仍可能會在定址接收器關閉之前執行程式碼 (在移除叢集程序的步驟 2 到 3 之間)。

在這些中繼情況下,有以下幾種可能性:

  • 針對全域單一執行個體粒紋:粒紋在非聯結叢集上可能會有重複的啟用。
  • 針對已設定版本的粒紋:非聯結叢集上的啟用不會在粒紋狀態變更時收到通知。