シンプルなロードバランサ/フェールオーバー 'IPサービスのコンセプト

1つの技術的な問題を解決する過程で、IPでアクセスできる理論的にはあらゆるサービスを使用して、多くのマシンに負荷を分散する普遍的な方法のアイデアが生まれました。



おそらく次のバイクですが、以前に出くわしたことはありませんでした。 アイデアが実行可能になった場合、誰かがそれを実現する可能性があります-無駄になりません。残念ながら、私は本当に試してみたいのですが、自分のための時間はありません これが既にどこかに実装されている場合は、厳密に判断しないようお願いします。自分では見つけられませんでしたが、今は長い検索時間はあまりありません。



要するに:

1.ホストのnsswitch.confで、ファイルとdnsの前にライブラリを登録します。 / etc / hostsおよびDNSで、システムは、ライブラリがNSS_STATUS_UNAVAILを返す場合にのみ検索します。

2. 1つのint int関数gethostbyname_r(...)を使用してライブラリを作成します(実装方法の詳細については、 www.gnu.org / s / hello / manual / libc / Name-Service-Switch.htmlName-Service-Switchを参照してください) ) 関数は、要求された名前が共有メモリにあるかどうかを確認し、存在する場合はそこからIPアドレスを返し、共有メモリでこの名前を使用するためのカウンタを1増やします。共有メモリにそのような名前がない場合、NSS_STATUS_UNAVAILを返します。

3.ライブラリがNSS_STATUS_UNAVAILを返した場合-システムは、IPの名前を通常の方法でさらに解決し続けます(/ etc / hosts、DNS)。

4.マルチキャストソケットを開き、共有メモリと名前付きソケットを操作できる言語では、次のような小さなサービスが記述されます。

4.1は、サービスに関する情報を使用してその構成(初期構成)を読み取り、「初期」とマークされたマルチキャストグループに転送し、共有メモリに配置します。

4.2マルチキャストグループの他のメンバーからのすべてのものが共有メモリにロードされます(または削除され、削除されます)。 「初期」とマークされている場合は、初期構成に応じて既知の変更を送信します。

4.3共有メモリから何かを追加/削除/再配置し、マルチキャストグループに複製した結果として、名前付きソケットを介していくつかのコマンドをリッスンします。

4.4オプション:カウンターが共有メモリ内の特定の値に達すると、ホストはそこから削除し、マルチキャストグループ内のコマンドを複製します。

5.特定のサービスを使用する必要がある人は誰でも名前で接続します-ライブラリは共有メモリから即座にそれを提供します。



基本的にgethostbyname()システムの標準機能をインターセプトするため、理論上は、IPプロトコルで機能し、ホスト名(IPだけでなく)の使用に応じて機能するすべてのものを使用します。ほとんどのクライアントアプリケーションが動作します。 解決されたIPをキャッシュするクライアント(Webブラウザーなど)で問題が発生する場合がありますが、それでもプラスになる場合があります-セッションは中断しません。



したがって、任意のスケルトンを取得し、名前付きソケットにコマンドをスローするだけで、サービスの負荷と可用性を簡単に管理(および/またはサービス間で負荷を分散)することができます。 これは、スマートスクリプト/監視システム/ Webインターフェイス、特定のファイルの愚かな 'cat'を使用して、cronによる名前付きソケットのコマンドで実行できます。



さらに、nssライブラリ自体は非常に原始的で、小さくて愚かであるため、非常に迅速かつ確実に動作します(このような原始的なコード部分で深刻なエラーを起こすことはかなり困難です)。 確かに、管理サービスの混乱や、アクセスしているという事実を妨げるものは何もありません...



どう思いますか?



All Articles