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 をすぐに実行できるように、このガイドが含まれています。
Consul をインストールするフォルダーを作成します (例: C:\Consul)。
サブフォルダー C:\Consul\Data を作成します (Consul では、このディレクトリが存在しない場合は作成されません)。
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 のドキュメントを参照してください。
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();
上記のコード:
- Host.CreateDefaultBuilder()の既定値を使用して IHostBuilder を作成します。
- UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) への呼び出しをチェーンして Orleans サイロを設定します。
- ISiloBuilder が UseConsulSiloClustering 呼び出します。
- Consul
address
を指定して、Consul を使用するようにクラスター メンバーシップ プロバイダーを構成します。
クライアントを構成するには、同じ 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 が適切な選択であるかどうかを判断する前に、ディスカッション を読んでください。
将来の拡張機能の可能性
- Consul KV レプリケーション プロジェクトが、複数の Consul データ センター間の WAN 環境で Orleans クラスターをサポートできることを証明します。
- Consul で Reminder テーブルを実装します。
- 拡張メンバーシップ プロトコルを実装します。 Consul の背後にあるチームは、アトミック操作の実装を計画しています。この機能を利用できるようになったら、プロバイダーの制限を取り除く可能性があります。
.NET