次の方法で共有


マルチクラスター構成

マルチクラスター構成は、現在どのクラスターがマルチクラスターの一部であるかを決定します。 これは自動的には変更されず、オペレーターによって制御されます。 そのため、クラスター内で使用されるメンバーシップ メカニズム (クラスターの一部であるサイロのセットが自動的に決定される) とは大きく異なります。

サービス内のクラスターについては、次の用語を使用します。

  • クラスターは、少なくとも 1 つのアクティブなサイロがある場合は "アクティブ" であり、それ以外の場合は "非アクティブ" です。
  • クラスターは、現在のマルチクラスター構成の一部である場合は "参加済み" であり、それ以外の場合は "非参加" です。

アクティブまたは非アクティブであることは、参加済みまたは非参加とは無関係です。4 つの組み合わせのすべてが可能です。

特定のサービスのすべてのクラスターは、ゴシップ ネットワークによって接続されます。 ゴシップ ネットワークで構成と状態の情報が伝達されます。

構成を挿入する

オペレーターは、構成変更をマルチクラスター ネットワークに挿入することによって発行します。 構成は、任意のクラスターに挿入し、そこからすべてのアクティブなクラスターに分散できます。 新しい各構成は、マルチクラスターを形成するクラスター ID の一覧で構成されます。 また、ゴシップ ネットワーク経由の伝達を追跡するために使用される UTC タイムスタンプも含まれます。

最初は、マルチクラスター構成は null です。つまり、マルチクラスター リストは空です (クラスターは含まれていません)。 したがって、オペレーターは最初にマルチクラスター構成を挿入する "必要があります"。 この構成は、挿入されると、接続されているすべてのサイロ (実行中) および指定されたすべてのゴシップ チャネル (それらが永続チャネルである場合) で保持されます。

新しい構成の挿入に関しては、一定の制限を設けており、オペレーターはそれに従う必要があります。

  • 新しい構成ごとに、複数のクラスターを追加することや、一部のクラスターを削除することができます (ただし、両方同時にはできません)。
  • 以前の構成変更がまだ処理されている間は、オペレーターは新しい構成を発行すべきではありません。

これらの制限により、シングルインスタンス プロトコルなどのプロトコルで、構成変更中でもアクティブ化の相互排他性を正しく維持できます。

管理グレイン

マルチクラスター構成は、Orleans 管理グレインを使用して、任意のクラスター内の任意のノードに挿入できます。 たとえば、3 つのクラスター { 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 のコレクションです。 2 番目の引数は (省略可能な) コメント文字列です。この文字列を使用して、構成に任意の情報 (構成を挿入したユーザーや理由など) をタグ付けできます。

省略可能な 3 番目の引数は、checkForLaggingSilosFirst というブール値で、既定値は true です。 つまり、システムはベスト エフォートでのチェックを実行して、現在の構成が反映されていないサイロがあるかどうかを確認し、このようなサイロが見つかった場合は変更を拒否します。 これは、一度に 1 つの構成変更のみを処理中にする必要があるという制限に対する違反の検出に役立ちます (ただし、すべての状況でそれを保証できるわけではありません)。

既定の構成

マルチクラスター構成が事前にわかっていて、デプロイが毎回 (テスト用に) 新しく行われる場合は、既定の構成を指定できます。 グローバル構成では、クラスター ID のコンマ区切りリストを受け取る省略可能な属性 DefaultMultiCluster がサポートされています。

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

この設定を使用してサイロを開始すると、現在のマルチクラスター構成が null であるかどうかがチェックされ、そうである場合は、指定された構成と現在の UTC タイムスタンプが挿入されます。

警告

永続的なマルチクラスター ゴシップ チャネル (AzureTable に基づく) では、明示的に削除されない限り、最後に挿入された構成が保持されます。 その場合、ゴシップ チャネルに格納されている構成が null ではないため、クラスターを再デプロイするときに DefaultMultiCluster を指定しても効果はありません。>

ゴシップ チャネル

オペレーターは、ゴシップ チャネルに構成を直接挿入することもできます。 チャネル内での変更は、定期的なバックグラウンド ゴシップによって自動的に取得され、伝達されますが、かなり時間がかかる可能性があります (管理グレインを使用する方がはるかに高速です)。 伝達時間の大まかな見積もりは、30 秒 (またはグローバル構成で指定されているゴシップ間隔) に、すべてのクラスター内のサイロの合計数の 2 進対数を掛けたものになります。 しかし、ゴシップ ペアはランダムに選択されるため、それよりもはるかに速くなったり、はるかに遅くなったり、両方の可能性があります。

Azure テーブルベースのゴシップ チャネルを使用している場合、オペレーターは Azure テーブル内のデータを編集するためのツールを使用して、OrleansGossipTable 内の構成レコードを編集するだけで新しい構成を挿入できます。 構成レコードの形式は次のとおりです。

名前 Type
パーティション キー String ServiceId
行キー 文字列 "CONFIG"
クラスター String クラスター ID のコンマ区切りリスト。例: "us1,eu1,us2"
コメント String 省略可能なコメント
GossipTimestamp DateTime 構成の UTC タイムスタンプ

Note

ストレージ内のこのレコードを編集するときは、GossipTimestamp を現在設定されているよりも新しい値にすることも必要です (そうしないと変更は無視されます)。 これを行う最も便利でお勧めの方法は、"GossipTimestamp フィールドを削除する" ことです。そうすると、ゴシップ チャネルの実装により、正しい現在のタイムスタンプに自動的に置き換えられます (Azure Table Timestamp が使用されます)。

クラスターの手順

多くの場合、マルチクラスターのクラスターを追加または削除するには、より大きなコンテキストでの調整が必要です。 マルチクラスターのクラスターを追加または削除する場合は常に、以下に説明する手順に従うことをお勧めします。

クラスターを追加する手順

  1. 新しい Orleans クラスターを開始し、すべてのサイロが稼働するまで待ちます。
  2. 新しいクラスターを含む構成を挿入します。
  3. 新しいクラスターへのユーザー要求のルーティングを開始します。

クラスターを削除する手順

  1. クラスターへの新しいユーザー要求のルーティングを停止します。
  2. そのクラスターを含まない構成を挿入します。
  3. クラスターのすべてのサイロを停止します。

この方法で削除したクラスターは、新しいクラスターを追加する手順に従って再度追加できます。

非参加クラスターでのアクティビティ

クラスターがアクティブと非参加の両方になる短い一時的な期間が存在することがあります。

  • 新しく開始したクラスターがマルチクラスター構成になる前 (クラスターを追加する手順の手順 1 と 2 の間) に、コードの実行が開始されることがあります
  • 使用停止中のクラスターで、サイロがシャットダウンされる前 (クラスターを削除する手順の手順 2 と 3 の間) に引き続きコードが実行されることがあります。

このような中間的な状況では、次のことがあり得ます。

  • グローバルなシングルインスタンス グレインの場合: 非参加クラスターでグレインが重複してアクティブ化される可能性があります。
  • バージョン管理されたグレインの場合: 非参加クラスターでのアクティブ化では、グレインの状態が変更されたときに通知を受け取りません。