いくつかのn層サービスのアプリケーションサーバーである同一のノードがいくつかあるとします。そして、Apache ZooKeeperを使用して、分散アプリケーションのすべての構成を保持するとします。さらに、このアプリケーションの前にロードバランサーとリバースプロキシとしてnginxがあります。
したがって、node1でのみデータを変更するコマンドを実行し、ある期間、node2がnode1と異なるとしましょう。そして、すべての情報がnode2に移行され、node2がnode1と同じデータを持つまで、プロキシがすべての特別な要求(その特定のデータを必要とする)をnode1にリダイレクトする必要があります。
Nginx(または他のプロキシ)にApache ZooKeeperから構成を読み取らせる方法はありますか?またはもっと広い:プロキシ構成をオンザフライで効果的に切り替える方法はありますか?そしてもちろん、システム全体のダウンタイムなしで(または最小限の状態で)実行する必要があります。したがって、nginxを再起動することはできません。
Nginxには、構成を変更する2つの方法があります。
マスタープロセスへのHUP
シグナルは、「リロード」をもたらします。 Nginxは多数の新しいワーカーを開始し、古いワーカーが正常にシャットダウンできるようにします。つまり、既存のリクエストを完了します。 noサービスの中断はありません。この構成変更方法は非常に軽量で迅速ですが、いくつかの制限があります。キャッシュゾーンを変更したり、Perlスクリプトを再コンパイルしたりすることはできません。
USR2
シグナル、次にWINCH
、次にQUIT
をマスタープロセスに送信すると、「実行可能アップグレード」が実行されます。このシーケンスにより、構成全体を完全に再読み込みし、Nginx実行可能ファイルをアップグレードすることもできます。ディスクキャッシュもリロードします(時間がかかる場合があります)。この方法では、noサービスの中断も発生します。
Nginx-Clojure を試してください。 clojure/Java/groovyリライトハンドラーを使用してzookeeperにアクセスし、いくつかのnginx変数を更新してプロキシターゲットを動的に変更できます。例えば.
Nginx.confで
set $mytarget "";
location / {
rewrite_handler_type Java;
## We will change $mytarget in MyRewriteHandler
rewrite_handler_name my.MyRewriteHandler;
proxy_pass $mytarget;
}
MyRewriteHandler.Javaで
public static class MyRewriteHandler implements NginxJavaRingHandler {
@Override
public Object[] invoke(Map<String, Object> request) {
//access zookeeper
...............
//change nginx variable mytarget
((NginxJavaRequest)request).setVaraible("mytarget", "http://some-Host-or-url");
}
更新として: Hipache ホスト構成をredisに保存します。これは、実行時に簡単に操作できます。また、node.jsとnode-http-proxyに基づいています。
HAProxyとそのUNIXドメインソケットインターフェイスを使用して可能です: http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#9.2 。
サーバーまたはフロントエンド全体をダウンからアップに切り替えたり、オンザフライで元に戻したりすることができます。フロントエンドの2つのセットを定義し、それぞれが1つの特定の状態用に構成されている構成ファイルを使用すると、目的を達成できます。
Nginx Luaを使用してnginxの動的構成を可能にし、必要なことを正確に実行できる興味深いプロジェクトがあります( https://github.com/samalba/hipache-nginx )
それはHipacheの背後にいる人たちによって書かれています。
これは遅いかもしれませんが、お金があれば。 Nginx plusはまさにあなたにぴったりです。 単純なURL呼び出しを使用して、新しい構成をその場で取得します。
サーバーを再起動せずにnginx
構成を動的に変更できるかどうかわからない。
同じ要件がある場合は、おそらくnodejs
とzookeeper
の統合を掘り下げたでしょう。
いくつかの興味深いオープンソースプロジェクトがあります。
node-zookeepernodejs
をzookeeper
と統合します。
node-http-proxy 負荷分散に使用できるプロキシhttpサーバー。
もちろん、それらは成熟度に欠けますが、あなたにとって興味深いかもしれません。