多叢集設定
多叢集設定會決定哪些叢集目前屬於多叢集的一部分。 其不會自動變更,而是由運算子控制。 因此,其與叢集內所使用的成員資格機制相當不同,後者會自動判斷屬於叢集的定址接收器集合。
我們會針對服務中的叢集使用下列術語:
- 如果叢集至少有一個作用中的定址接收器,則叢集為作用中,否則為非作用中。
- 如果叢集是目前多叢集設定的一部分,則為已聯結,否則為非聯結。
作用中/非作用中與已聯結/非聯結無關:這四種組合都是可能的。
特定服務的所有叢集都會由 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 資料表時間戳記)。
叢集程序
從多叢集新增或移除叢集通常需要在一些較大內容內的協調。 建議您一律遵循在從多叢集新增/移除叢集時所述的程序。
新增叢集的程序
- 啟動新的 Orleans 叢集,並等候所有定址接收器啟動和執行。
- 插入包含新叢集的設定。
- 開始將使用者要求路由傳送至新的叢集。
移除叢集的程序
- 停止將使用者要求路由傳送至叢集。
- 插入不再包含叢集的設定。
- 停止叢集的所有定址接收器。
以這種方式移除叢集之後,您可以遵循新增叢集的程序來重新新增叢集。
非聯結叢集上的活動
叢集同時為作用中和非聯結的短暫暫時期間:
- 全新啟動的叢集可能會在多叢集設定中開始執行程式碼 (在新增叢集程序的步驟 1 到 2 之間)
- 正在解除委任的叢集仍可能會在定址接收器關閉之前執行程式碼 (在移除叢集程序的步驟 2 到 3 之間)。
在這些中繼情況下,有以下幾種可能性:
- 針對全域單一執行個體粒紋:粒紋在非聯結叢集上可能會有重複的啟用。
- 針對已設定版本的粒紋:非聯結叢集上的啟用不會在粒紋狀態變更時收到通知。