次の方法で共有


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

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

ここで 同様のソリューションとの比較を含む Consul の詳細な概要があります。

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

Consul を選択する理由

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

Consul の設定

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

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

  2. サブフォルダー C:\Consul\Data を作成します (Consul では、このディレクトリが存在しない場合は作成されません)。

  3. をダウンロードし、C:\ConsulConsul.exe 解凍します。

  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'クラスター管理プロトコルによって必要なコンカレンシー制御が提供されます。

Silo が実行されると、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を使用して、クラスター内のすべてのサイロの CSV を 1 つの HTTP GET で読み取ります。

制限

Consul をメンバーシップ プロバイダーとして使用する場合は、いくつかの制限事項に注意してください。

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

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

複数のデータセンター

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

Windows で実行する場合

Consul が Windows で起動すると、次のメッセージがログに記録されます。

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

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

将来の拡張機能の可能性

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