次の方法で共有


Consul をメンバーシップ プロバイダーとして使用する

Consul は、分散型の可用性が高いデータセンター対応のサービス検出プラットフォームです。シンプルなサービス登録、正常性チェック、障害検出、キーと値のストレージなどが含まれます。 これは、データ センター内のすべてのノードが、サーバーまたはクライアントとして機能する Consul エージェントを実行していることを前提に構築されています。 各エージェントは、スケーラブルなゴシップ プロトコルを介して通信します。

類似のソリューションとの比較を含む Consul の詳しい概要については、こちらを参照してください。

Consul は Go で記述されており、オープンソースです。macOS X、FreeBSD、Linux、Solaris、Windows 用のコンパイル済みのダウンロードを入手できます

Consul を選ぶ理由

Orleans メンバーシップ プロバイダーである Consul は、潜在顧客が既存のインフラストラクチャと協力的な IT プロバイダーを必要とせずにオンプレミスのソリューションを提供する必要がある場合に適しています。 Consul は軽量な単一の実行可能ファイルです。依存関係がないため、ミドルウェア ソリューションに簡単に組み込むことができます。 マイクロサービスを検出、チェック、保守するためのソリューションとして Consul をお使いの場合、操作をシンプルかつ簡単にするために Orleans メンバーシップと完全に統合することは理にかなっています。 Consul (別名 "Orleans カスタム システム ストア") には、Orleans の クラスター管理と完全に統合されたメンバーシップ テーブルもあります。

Consul の設定

Consul.io 上で、安定した Consul クラスターの設定に関する広範なドキュメントを利用できるため、ここでそれを繰り返しても意味がありません。 しかし、このガイドはスタンドアロンの Consul エージェントを使ってすばやく Orleans を実行できるよう、便宜のために含めています。

  1. Consul をインストールするフォルダーを作成します (C:\Consul など)。

  2. サブフォルダー C:\Consul\Data を作成します (これが存在しない場合、Consul によって作成されることはありません)。

  3. Consul.exeダウンロードして、C:\Consul に解凍します。

  4. C:\Consul でコマンド プロンプトを開き、次のコマンドを実行します。

    ./consul.exe agent -server -bootstrap -data-dir "C:\Consul\Data" -client='0.0.0.0'
    

    上記のコマンドでは次のことが行われます。

    • agent: サービスをホストするエージェント プロセスを実行するように Consul に指示します。 このスイッチがない場合、Consul プロセスは RPC を使用して実行中のエージェントを構成しようとします。
    • -server: クライアントではなくサーバーとしてエージェントを定義します (Consul "クライアント" は、すべてのサービスとデータをホストするエージェントですが、クラスター リーダーを決定する投票権を持たず、クラスター リーダーになることはできません。
    • -bootstrap クラスターのリーダーシップを想定するため、クラスター内の最初の (最初のみです) ノードをブートストラップする必要があります。
    • -data-dir [path]: クラスター メンバーシップ テーブルを含め、すべての Consul データが格納されるパスを指定します。
    • -client='0.0.0.0': サービスを開く IP を Consul に伝えます。

    他にも多くのパラメーターと、JSON 構成ファイルを使用するオプションがあります。 オプションの完全な一覧については、Consul のドキュメントを参照してください。

  5. Consul が実行されており、Orleans からのメンバーシップ要求を受信する準備ができていることを、ブラウザーで http://localhost:8500/v1/catalog/services のサービス エンドポイントを開いて確認します。 正しく機能している場合、ブラウザーには次の JSON が表示されます。

    {
        "consul": []
    }
    

Orleans を構成する

Consul をメンバーシップ プロバイダーとして使用するように Orleans を構成するには、サイロ プロジェクトで Microsoft.Orleans.Clustering.Consul NuGet パッケージを参照する必要があります。 完了したら、次のようにサイロの Program.cs ファイルでメンバーシップ プロバイダーを構成できます。

IHostBuilder builder = Host.CreateDefaultBuilder(args)
    .UseOrleans(silo =>
    {
        silo.UseConsulSiloClustering(options =>
        {
            // The address of the Consul server
            var address = new Uri("http://localhost:8500");
            options.ConfigureConsulClient(address);
        });
    })
    .UseConsoleLifetime();

using IHost host = builder.Build();
host.Run();

上記のコードでは次の操作が行われます。

クライアントを構成するには、同じ NuGet パッケージを参照し、UseConsulClientClustering 拡張メソッドを呼び出します。

クライアント SDK

サービス検出用に Consul を使用することに関心をお持ちの場合は、一般的なほとんどの言語用のクライアント SDK があります。

実装の詳細

メンバーシップ テーブル プロバイダーは、Check-And-Set (CAS) 操作で Consul のキーと値のストア機能を使用します。 各サイロが開始されると、2 つのキーと値のエントリが登録されます。1 つはサイロの詳細を含み、1 つは最後にサイロの稼動が報告された時刻を保持します。 後者は、診断の "I'm alive" エントリを指し、故障検出のハートビートのことではありません。これはサイロ間で直接送信され、テーブルには書き込まれません。 テーブルへのすべての書き込みは CAS で実行され、Orleans のクラスター管理プロトコルで必要とされるコンカレンシー制御を提供します。

サイロが実行されたら、Web ブラウザーで http://localhost:8500/v1/kv/?keys&pretty からこれらのエントリを確認できます。それはこのように表示されます。

[
    "orleans/default/192.168.1.11:11111@43165319",
    "orleans/default/192.168.1.11:11111@43165319/iamalive",
    "orleans/default/version"
]

すべてのキーの前に orleans が付いています。これはプロバイダーでハードコーディングされており、Consul の他のユーザーとのキースペースの競合を回避することを目的としています。 これらのキーのいずれかを使用して、これらの各キーに関する追加情報を取得するには、キー名を (引用符なしで) http://localhost:8500/v1/kv/ の Consul KV ルートに追加すると読み取ることができます。 これにより、次の JSON が表示されます。

[
    {
        "LockIndex": 0,
        "Key": "orleans/default/192.168.1.11:11111@43165319",
        "Flags": 0,
        "Value": "[BASE64 UTF8 Encoded String]",
        "CreateIndex": 321,
        "ModifyIndex": 322
    }
]

Base64 UTF-8 でエンコードされた文字列 Value をデコードすると、実際の Orleans メンバーシップ データが提供されます。

http://localhost:8500/v1/KV/orleans/default/[SiloAddress]

{
    "Hostname": "[YOUR_MACHINE_NAME]",
    "ProxyPort": 30000,
    "StartTime": "2023-05-15T14:22:00.004977Z",
    "Status": 3,
    "SiloName": "Silo_fcad0",
    "SuspectingSilos": []
}

http://localhost:8500/v1/KV/orleans/default/[SiloAddress]/IAmAlive

"2023-05-15T14:27:01.1832828Z"

クライアントが接続するときに、URI http://192.168.1.26:8500/v1/KV/orleans/default/?recurse を使用して、クラスター内のすべてのサイロの KV を 1 つの HTTP GET で読み取ります。

制限事項

Consul をメンバーシップ プロバイダーとして使用する場合に、注意すべき制限がいくつかあります。

Orleans 拡張メンバーシップ プロトコル (テーブル バージョンおよび ETag)

現在、Consul KV ではアトミック更新がサポートされていません。 したがって、Orleans Consul メンバーシップ プロバイダーでは、「Orleans でのクラスター管理」で説明されているように、Orleans 基本メンバーシップ プロトコルのみを実装し、拡張メンバーシップ プロトコルはサポートしていません。 この拡張プロトコルは、追加の (必須ではない) サイロの接続検証として、また、まだ実装されていない機能の基盤として導入されました。

複数のデータセンター

Consul のキーと値のペアは、現在、Consul データセンター間でレプリケートされません。 このレプリケーション作業に対処するための別のプロジェクトがありますが、Orleans をサポートすることがまだ実証されていません。

Windows で実行する場合

Windows 上で Consul を開始すると、次のメッセージがログされます。

==> WARNING: Windows is not recommended as a Consul server. Do not use in production.

この警告メッセージが表示される原因は、Windows 環境で実行する場合のテストに重点を置かなかったためであり、実際に既知の問題があるわけではありません。 ディスカッションを読んでから、Consul が適切な選択肢であるかどうかを判断してください。

将来の機能強化の可能性

  1. Consul KV レプリケーション プロジェクトで、複数の Consul データセンター間の WAN 環境の Orleans クラスターをサポートできることを実証する。
  2. Consul でリマインダー テーブルを実装する。
  3. 拡張メンバーシップ プロトコルを実装する。 Consul を支援するチームでは実際にアトミック操作の実装を計画しています。この機能が利用できるようになったら、プロバイダーでの制限事項を取り除くことができます。