Ubuntu14.04でCorosync、Pacemaker、およびFloatingIPを使用して高可用性HAProxyセットアップを作成する方法
序章
このチュートリアルでは、フローティングIPとCorosync / Pacemakerクラスタースタックをサポートして、DigitalOceanで高可用性HAProxyロードバランサーのセットアップを作成する方法を示します。 HAProxyロードバランサーはそれぞれ、2つのバックエンドアプリケーションサーバー間でトラフィックを分割するように構成されます。 プライマリロードバランサーがダウンすると、フローティングIPが自動的にセカンドロードバランサーに移動し、サービスを再開できるようになります。
ノート: DigitalOceanロードバランサー are a fully-managed, highly available load balancing service. The Load Balancer service can fill the same role as the manual high availability setup described here. Follow our ロードバランサーの設定に関するガイド if you wish to evaluate that option.
前提条件
このガイドを完了するには、 Ubuntu 14.04 チュートリアルでCorosync、Pacemaker、およびフローティングIPを使用して高可用性セットアップを作成する方法を完了する必要があります(オプションのAddNginxをスキップする必要がありますリソースセクション)。 これにより、プライマリおよびセカンダリと呼ばれる2つのドロップレットが残り、それらの間で遷移できるフローティングIPがあります。 まとめて、これらのサーバーをロードバランサーと呼びます。 これらは、ロードバランサーであるHAProxyをインストールするドロップレットです。
また、HAロードバランサーのセットアップが機能することを示すために、プライベートネットワークを有効にして同じデータセンターに2つの追加のUbuntu14.04ドロップレットを作成できる必要があります。 これらは、HAProxyによって負荷分散されるサーバーです。 Nginxをインストールするこれらのアプリケーションサーバーをapp-1およびapp-2と呼びます。 負荷分散したいアプリケーションサーバーがすでにある場合は、代わりにそれらを自由に使用してください。
これらの各サーバーでは、sudo
アクセスで構成されたroot以外のユーザーが必要になります。 Ubuntu 14.04初期サーバーセットアップガイドに従って、これらのユーザーのセットアップ方法を学ぶことができます。
アプリのドロップレットを作成する
最初のステップは、プライベートネットワークを有効にして2つのUbuntuドロップレットをロードバランサーと同じデータセンターに作成することです。これは、説明されているapp-1およびapp-2サーバーとして機能します。その上。 両方のドロップレットにNginxをインストールし、それらのインデックスページをそれらを一意に識別する情報に置き換えます。 これにより、HAロードバランサーのセットアップが機能していることを簡単に示すことができます。 負荷分散したいアプリケーションサーバーがすでにある場合は、このチュートリアルの適切な部分を自由に調整して、それを機能させることができます(セットアップに関係のない部分はスキップしてください)。
セットアップ例に従う場合は、2つのUbuntu 14.04ドロップレット、app-1とapp-2を作成し、次のbashスクリプトをユーザーデータとして使用します。
ユーザーデータの例
#!/bin/bash apt-get -y update apt-get -y install nginx export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname) export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address) echo Droplet: $HOSTNAME, IP Address: $PUBLIC_IPV4 > /usr/share/nginx/html/index.html
このユーザーデータはNginxをインストールし、index.htmlの内容をドロップレットのホスト名とパブリックIPアドレスに置き換えます(メタデータサービスを参照することにより)。 いずれかのドロップレットにアクセスすると、ドロップレットのホスト名とパブリックIPアドレスを含む基本的なWebページが表示されます。これは、ロードバランサーがトラフィックを転送しているアプリサーバーをテストするのに役立ちます。
サーバーネットワーク情報を収集する
インフラストラクチャコンポーネントの実際の構成を開始する前に、各サーバーに関する情報を収集することをお勧めします。
このガイドを完了するには、サーバーに関する次の情報が必要です。
- アプリサーバー:プライベートIPアドレス
- ロードバランサープライベートおよびアンカーIPアドレス
プライベートIPアドレスを検索する
ドロップレットのプライベートIPアドレスを見つける最も簡単な方法は、curl
を使用して、DigitalOceanメタデータサービスからプライベートIPアドレスを取得することです。 このコマンドは、ドロップレット内から実行する必要があります。 各ドロップレットに次のように入力します。
curl 169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo
正しいIPアドレスがターミナルウィンドウに出力されます。
Private IP address:10.132.20.236
4つのドロップレットすべてに対してこの手順を実行し、簡単に参照できる場所にプライベートIPアドレスをコピーします。
アンカーIPアドレスを検索する
アンカーIPは、フローティングIPがDigitalOceanサーバーに接続されたときにバインドするローカルプライベートIPアドレスです。 これは、ハイパーバイザーレベルで実装された、通常のeth0
アドレスの単なるエイリアスです。
この値を取得する最も簡単でエラーが発生しにくい方法は、DigitalOceanメタデータサービスから直接取得することです。 curl
を使用すると、次のように入力して、各サーバー上のこのエンドポイントにアクセスできます。
curl 169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/address && echo
アンカーIPは独自の行に印刷されます。
Output10.17.1.18
両方のロードバランサドロップレットでこの手順を実行し、簡単に参照できる場所にアンカーIPアドレスをコピーします。
アプリサーバーを構成する
上記のデータを収集したら、サービスの構成に進むことができます。
ノート
このセットアップでは、Webサーバーレイヤー用に選択されたソフトウェアはかなり互換性があります。 このガイドでは、一般的で構成がかなり簡単なNginxを使用します。 Apacheまたは(本番環境に対応した)言語固有のWebサーバーに慣れている場合は、代わりにそれを自由に使用してください。 HAProxyは、直接クライアント接続を処理するのと同じように要求を処理できるバックエンドWebサーバーにクライアント要求を渡すだけです。
まず、バックエンドアプリサーバーをセットアップします。 これらのサーバーは両方とも、名前とパブリックIPアドレスを提供するだけです。 実際のセットアップでは、これらのサーバーは同じコンテンツを提供します。 プライベートIPアドレスを介したWeb接続のみを受け入れます。 これにより、後で構成する2つのHAProxyサーバーのいずれかを介してトラフィックが排他的に送信されるようになります。
ロードバランサーの背後にアプリサーバーを設定すると、リクエストの負担をいくつかの同一のアプリサーバーに分散できます。 トラフィックのニーズが変化した場合、この層にアプリサーバーを追加または削除することで、新しい需要に合わせて簡単に拡張できます。
ロードバランサーからのリクエストのみを許可するようにNginxを構成する
例に従っていて、アプリサーバーの作成時に提供されたユーザーデータを使用した場合、サーバーにはすでにNginxがインストールされています。 次のステップは、いくつかの構成変更を行うことです。
サーバーのプライベートIPアドレスでのみリクエストをリッスンするようにNginxを構成したいと思います。 さらに、2つのロードバランサーのプライベートIPアドレスからのリクエストのみを処理します。 これにより、ユーザーはロードバランサー(フローティングIPアドレスを介してのみアクセスできるように構成されます)を介してアプリサーバーにアクセスするように強制されます。
これらの変更を行うには、各アプリサーバーでデフォルトのNginxサーバーブロックファイルを開きます。
sudo vi /etc/nginx/sites-available/default
まず、listen
ディレクティブを変更します。 listen
ディレクティブを変更して、ポート80で現在のアプリサーバーのプライベートIPアドレスをリッスンします。 余分なlisten
行を削除します。 次のようになります。
/ etc / nginx / sites-available / default(1/2)
server { listen app_server_private_IP:80; . . .
listen
ディレクティブのすぐ下に、2つのallow
ディレクティブを設定して、2つのロードバランサーのプライベートIPアドレスから発信されるトラフィックを許可します。 これをdeny all
ルールでフォローアップして、他のすべてのトラフィックを禁止します。
/ etc / nginx / sites-available / default(2/2)
allow load_balancer_1_private_IP; allow load_balancer_2_private_IP; deny all;
終了したら、ファイルを保存して閉じます。
次のように入力して、行った変更が有効なNginx構文を表していることをテストします。
sudo nginx -t
問題が報告されていない場合は、次のように入力してNginxデーモンを再起動します。
sudo service nginx restart
これらのすべての手順を(適切なアプリサーバーのプライベートIPアドレスを使用して)両方のアプリサーバーで実行することを忘れないでください。
変更のテスト
アプリサーバーが正しく制限されていることをテストするために、さまざまな場所からcurl
を使用してリクエストを行うことができます。
アプリサーバー自体で、次のように入力して、ローカルコンテンツの簡単なリクエストを試すことができます。
curl 127.0.0.1
Nginxサーバーブロックファイルに設定した制限のため、このリクエストは実際には拒否されます。
Outputcurl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
これは予想されたものであり、実装しようとした動作を反映しています。
これで、ロードバランサーのいずれかから、アプリサーバーのパブリックIPアドレスのいずれかをリクエストできます。
curl web_server_public_IP
繰り返しますが、これは失敗するはずです。 アプリサーバーはパブリックインターフェイスをリッスンしていません。さらに、パブリックIPアドレスを使用している場合、アプリサーバーはロードバランサーからのリクエストで許可されたプライベートIPアドレスを認識しません。
Outputcurl: (7) Failed to connect to app_server_public_IP port 80: Connection refused
ただし、アプリサーバーのプライベートIPアドレスを使用してリクエストを行うように呼び出しを変更すると、正しく機能するはずです。
curl app_server_private_IP
Nginxindex.html
ページが返されます。 サンプルのユーザーデータを使用した場合、ページには、アクセスされているアプリサーバーの名前とパブリックIPアドレスが含まれている必要があります。
app server index.htmlDroplet: app-1, IP Address: 159.203.130.34
両方のロードバランサーから両方のアプリサーバーにこれをテストします。 プライベートIPアドレスに対する各要求は成功する必要がありますが、パブリックアドレスに対して行われる各要求は失敗する必要があります。
上記の動作が実証されたら、次に進むことができます。 これで、バックエンドアプリサーバーの構成が完了しました。
ロードバランサーからNginxを削除します
前提条件のHASetup with Corosync、Pacemaker、およびFloating IPs チュートリアルに従うことで、ロードバランサーサーバーにNginxがインストールされます。 リバースプロキシロードバランサーとしてHAProxyを使用するため、Nginxと関連するクラスターリソースを削除する必要があります。
Nginxクラスターリソースを削除する
前提条件のチュートリアルに従ってNginxクラスターリソースを追加した場合は、ロードバランサーの1つで次のコマンドを使用してNginx
リソースを停止および削除します。
sudo crm resource stop Nginx sudo crm configure delete Nginx
これにより、Nginx
リソースに依存するクラスター設定も削除されます。 たとえば、Nginx
リソースを参照するclone
またはcolocation
を作成した場合、それらも削除されます。
Nginxパッケージを削除する
これで、両方のロードバランサーサーバーでNginxをアンインストールする準備が整いました。
まず、Nginxサービスを停止します。
sudo service nginx stop
次に、次のコマンドでパッケージをパージします。
sudo apt-get purge nginx
Nginx構成ファイルを削除することもできます。
sudo rm -r /etc/nginx
これで、HAProxyをインストールして設定する準備が整いました。
HAProxyをインストールして設定する
次に、HAProxyロードバランサーを設定します。 これらはそれぞれWebサーバーの前に配置され、2つのバックエンドアプリサーバー間でリクエストを分割します。 これらのロードバランサーは、アクティブ-パッシブ構成では完全に冗長になります。 常に1つだけがトラフィックを受信します。
HAProxy構成は、両方のWebサーバーに要求を渡します。 ロードバランサーは、アンカーIPアドレスでリクエストをリッスンします。 前述のように、これは、ドロップレットに接続されたときにフローティングIPアドレスがバインドするIPアドレスです。 これにより、フローティングIPアドレスから発信されたトラフィックのみが転送されます。
HAProxyをインストールする
このセクションは、両方のロードバランサーサーバーで実行する必要があります。
デフォルトのUbuntuリポジトリにないHAProxy1.6をインストールします。 ただし、PPAを使用する場合は、次のコマンドを使用して、パッケージマネージャーを使用してHAProxy1.6をインストールできます。
sudo add-apt-repository ppa:vbernat/haproxy-1.6
ロードバランサーのローカルパッケージインデックスを更新し、次のように入力してHAProxyをインストールします。
sudo apt-get update sudo apt-get install haproxy
これでHAProxyがインストールされましたが、今すぐ設定する必要があります。
HAProxyを構成する
メインのHAProxy構成ファイルを開きます。
sudo vi /etc/haproxy/haproxy.cfg
defaults
セクションを見つけて、その下に次の2行を追加します。
/etc/haproxy/haproxy.cfg(1/3)
option forwardfor option http-server-close
forwardfor オプションは、各リクエストにX-Forwarded-For
ヘッダーを追加するようにHAProxyを設定します。これは、アプリサーバーにリクエストを最初に送信したIPアドレスを認識させたい場合に便利です。 http- server-close オプションは、接続を閉じながらキープアライブを維持することにより、HAProxyとユーザー間の遅延を減らします。
次に、ファイルの最後で、フロントエンド構成を定義する必要があります。 これにより、HAProxyが着信接続をリッスンする方法が決まります。 HAProxyをロードバランサーのアンカーIPアドレスにバインドします。 これにより、フローティングIPアドレスから発信されたトラフィックをリッスンできるようになります。 わかりやすくするために、フロントエンドを「http」と呼びます。 また、トラフィックを渡すデフォルトのバックエンドapp_pool
を指定します(これはすぐに構成します)。
/etc/haproxy/haproxy.cfg(2/3)
frontend http bind load_balancer_anchor_IP:80 default_backend app_pool
注:アンカーIPは、ロードバランサーサーバー間で異なる必要があるHAProxy構成の唯一の部分です。 つまり、現在作業しているロードバランサーサーバーのアンカーIPを必ず指定してください。
次に、バックエンド構成を定義できます。 これにより、HAProxyが受信するトラフィックを渡すダウンストリームの場所が指定されます。 この場合、これは、構成した両方のNginxアプリサーバーのプライベートIPアドレスになります。
/etc/haproxy/haproxy.cfg(3/3)
backend app_pool server app-1 app_server_1_private_IP:80 check server app-2 app_server_2_private_IP:80 check
上記の変更が完了したら、ファイルを保存して終了します。
次のように入力して、行った構成の変更が有効なHAProxy構文を表していることを確認します。
sudo haproxy -f /etc/haproxy/haproxy.cfg -c
エラーが報告されなかった場合は、次のように入力してサービスを再起動します。
sudo service haproxy restart
繰り返しになりますが、このセクションのすべての手順を両方のロードバランサーサーバーで必ず実行してください。
変更のテスト
curl
で再度テストすることにより、構成が有効であることを確認できます。
ロードバランサーサーバーから、ローカルホスト、ロードバランサー自体のパブリックIPアドレス、またはサーバー自体のプライベートIPアドレスを要求してみてください。
curl 127.0.0.1 curl load_balancer_public_IP curl load_balancer_private_IP
これらはすべて、次のようなメッセージで失敗するはずです。
Outputcurl: (7) Failed to connect to IP_address port 80: Connection refused
ただし、ロードバランサーのアンカーIPアドレスにリクエストを送信すると、正常に完了するはずです。
curl load_balancer_anchor_IP
いずれかのアプリサーバーのNginxindex.html
ページが表示されます。
app server index.htmlDroplet: app-1, IP Address: app1_IP_address
同じcurlリクエストを再度実行します。
curl load_balancer_anchor_IP
HAProxyはデフォルトでラウンドロビン負荷分散を使用するため、他のアプリサーバーのindex.html
ページが表示されます。
app server index.htmlDroplet: app-2, IP Address: app2_IP_address
この動作がシステムの動作と一致する場合、ロードバランサーは正しく構成されています。 ロードバランサーサーバーが両方のバックエンドアプリサーバー間でトラフィックのバランスを取っていることをテストしました。 また、フローティングIPは、前提条件の HA Setup with Corosync、Pacemaker、およびFloating IP チュートリアルで設定されているため、ロードバランサーサーバーの1つにすでに割り当てられている必要があります。
HAProxyOCFリソースエージェントをダウンロードする
この時点で、基本的なホストレベルのフェイルオーバーが実行されていますが、クラスターリソースとしてHAProxyを追加することで、セットアップを改善できます。 そうすることで、クラスターは、フローティングIPが割り当てられているサーバーでHAProxyが実行されていることを確認できます。 Pacemakerは、HAProxyが実行されていないことを検出すると、サービスを再起動するか、フローティングIPを他のノード(HAProxyを実行している必要があります)に割り当てることができます。
Pacemakerを使用すると、OCFリソースエージェントを特定のディレクトリに配置して追加できます。
両方のロードバランサーサーバーで、次のコマンドを使用してHAProxyOCFリソースエージェントをダウンロードします。
cd /usr/lib/ocf/resource.d/heartbeat sudo curl -O https://raw.githubusercontent.com/thisismitch/cluster-agents/master/haproxy
両方のロードバランサーサーバーで、実行可能にします。
sudo chmod +x haproxy
続行する前に、リソースの内容を確認してください。 これは、HAProxyサービスの管理に使用できるシェルスクリプトです。
これで、HAProxy OCFリソースエージェントを使用して、haproxy
クラスターリソースを定義できます。
haproxyリソースを追加する
HAProxy OCFリソースエージェントをインストールすると、クラスターがHAProxyを管理できるようにするhaproxy
リソースを構成できるようになります。
いずれかのロードバランサーサーバーで、次のコマンドを使用してhaproxy
プリミティブリソースを作成します。
sudo crm configure primitive haproxy ocf:heartbeat:haproxy op monitor interval=15s
指定されたリソースは、クラスターに15秒ごとにHAProxyを監視し、使用できなくなった場合は再起動するように指示します。
sudo crm_mon
またはsudo crm status
を使用して、クラスターリソースのステータスを確認します。
crm_mon:... Online: [ primary secondary ] FloatIP (ocf::digitalocean:floatip): Started primary Nginx (ocf::heartbeat:nginx): Started secondary
残念ながら、Pacemakerは、リソースの制約を定義していないため、haproxy
およびFloatIP
リソースを別々のノードで開始することを決定する場合があります。 HAProxyサービスが他のDropletで実行されているときに、Floating IPが1つのDropletを指している可能性があるため、これは問題です。 フローティングIPにアクセスすると、高可用性が必要なサービスを実行していないサーバーが表示されます。
この問題を解決するために、 clone リソースを作成します。これは、既存のプリミティブリソースを複数のノードで開始する必要があることを指定します。
次のコマンドを使用して、「haproxy-clone」というhaproxy
リソースのクローンを作成します。
sudo crm configure clone haproxy-clone haproxy
クラスタのステータスは次のようになります。
crm_mon:Online: [ primary secondary ] FloatIP (ocf::digitalocean:floatip): Started primary Clone Set: haproxy-clone [Nginx] Started: [ primary secondary ]
ご覧のとおり、クローンリソースhaproxy-clone
が両方のノードで開始されています。
最後のステップは、コロケーション制限を構成して、FloatIP
リソースがアクティブなhaproxy-clone
リソースを持つノードで実行されるように指定することです。 「FloatIP-haproxy」と呼ばれるコロケーション制限を作成するには、次のコマンドを使用します。
sudo crm configure colocation FloatIP-haproxy inf: FloatIP haproxy-clone
crmステータスの出力に違いはありませんが、コロケーションリソースが次のコマンドで作成されたことがわかります。
sudo crm configure show
これで、両方のサーバーでHAProxyが実行されているはずですが、一方のサーバーでFloatIPリソースが実行されています。
いずれかのロードバランサーサーバーでHAProxyサービスを停止してみてください。
sudo service haproxy stop
次の15秒以内に再び起動することに気付くでしょう。
次に、アクティブなロードバランサーサーバー(FloatIP
リソースが現在「起動」されているサーバー)を再起動して、HAセットアップをテストします。
ロードバランサーの高可用性をテストする
新しい高可用性HAProxyセットアップを使用して、すべてが意図したとおりに機能することをテストする必要があります。
ロードバランサー間の移行をより適切に視覚化するために、移行中にアプリサーバーのNginxログを監視できます。
使用されているプロキシサーバーに関する情報はクライアントに返されないため、ログを表示するのに最適な場所は、実際のバックエンドWebサーバーからです。 これらの各サーバーは、どのクライアントがアセットを要求するかについてのログを維持する必要があります。 Nginxサービスの観点からは、クライアントは実際のクライアントに代わってリクエストを行うロードバランサーです。
クラスタステータスを監視する
今後のテストの実行中に、クラスターノードとリソースのリアルタイムステータスを確認することをお勧めします。 このコマンドを使用して、いずれかのロードバランサーサーバーで実行できます(実行中の場合)。
sudo crm_mon
出力は次のようになります。
crm_mon output:Last updated: Thu Nov 5 13:51:41 2015 Last change: Thu Nov 5 13:51:27 2015 via cibadmin on primary Stack: corosync Current DC: secondary (2) - partition with quorum Version: 1.1.10-42f2063 2 Nodes configured 3 Resources configured Online: [ primary secondary ] FloatIP (ocf::digitalocean:floatip): Started primary Clone Set: haproxy-clone [haproxy] Started: [ primary secondary ]
これにより、どのロードバランサーノードがオンラインであり、どのノードでFloatIP
およびhaproxy
リソースが開始されているかがわかります。
FloatIP
リソースがStarted
にあるノード、上記の例では primary は、フローティングIPが現在割り当てられているロードバランサーサーバーであることに注意してください。 このサーバーをアクティブロードバランサーサーバーと呼びます。
フローティングIPへのリクエストを自動化
ローカルマシンでは、2秒に1回、フローティングIPアドレスでWebコンテンツを要求します。 これにより、アクティブなロードバランサーが着信トラフィックをどのように処理しているかを簡単に確認できます。 つまり、トラフィックを送信しているバックエンドアプリサーバーを確認します。 ローカル端末で、次のコマンドを入力します。
while true; do curl floating_IP_address; sleep 2; done
2秒ごとに、バックエンドアプリサーバーの1つからの応答が表示されます。 指定していないHAProxyのデフォルトのバランスアルゴリズムがround-robinに設定されているため、おそらくapp-1とapp-2が交互になります。 したがって、端末には次のようなものが表示されます。
[secondary_label curl loop output: Droplet: app-1, IP Address: app_1_IP_address Droplet: app-2, IP Address: app_2_IP_address ...
このターミナルウィンドウを開いたままにして、リクエストがサーバーに継続的に送信されるようにします。 これらは、次のテスト手順で役立ちます。
Webサーバーのログを追跡する
各バックエンドアプリサーバーで、tail
/var/log/nginx/access.log
の場所を指定できます。 これにより、サーバーに対して行われた各リクエストが表示されます。 ロードバランサーはラウンドロビンローテーションを使用してトラフィックを均等に分割するため、各バックエンドアプリサーバーは行われたリクエストの約半分を確認する必要があります。
クライアントアドレスはアクセスログの最初のフィールドであるため、簡単に見つけることができます。 Nginxアプリサーバーの両方で以下を実行します(別々のターミナルウィンドウで):
sudo tail -f /var/log/nginx/access.log
最初のフィールドには、アクティブなロードバランサーサーバーのプライベートIPアドレスが4秒ごとに表示されます(プライマリロードバランサーであると想定しますが、セカンダリの場合もあります。場合):
Output. . . primary_loadbalancer_IP - - [05/Nov/2015:14:26:37 -0500] "GET / HTTP/1.1" 200 43 "-" "curl/7.43.0" primary_loadbalancer_IP - - [05/Nov/2015:14:26:37 -0500] "GET / HTTP/1.1" 200 43 "-" "curl/7.43.0" . . .
tail
コマンドを両方のアプリサーバーで実行し続けます。
プライマリロードバランサーでHAProxyサービスを中断する
次に、 primary ロードバランサーを再起動して、フローティングIPフェイルオーバーが機能することを確認します。
sudo reboot
次に、両方のアプリサーバーのNginxアクセスログに注意してください。 フローティングIPフェイルオーバーが発生した後、アクセスログには、アプリサーバーが以前とは異なるIPアドレスでアクセスされていることが示されていることに注意してください。 ログは、セカンダリロードバランサーサーバーがリクエストを送信していることを示しているはずです。
Output. . . secondary_loadbalancer_IP - - [05/Nov/2015:14:27:37 -0500] "GET / HTTP/1.1" 200 43 "-" "curl/7.43.0" secondary_loadbalancer_IP - - [05/Nov/2015:14:27:37 -0500] "GET / HTTP/1.1" 200 43 "-" "curl/7.43.0" . . .
これは、プライマリロードバランサーの障害が検出され、フローティングIPがセカンダリロードバランサーに正常に再割り当てされたことを示しています。
ローカル端末(2秒ごとにフローティングIPにアクセスしている)の出力をチェックして、セカンダリロードバランサーが両方のバックエンドアプリサーバーにリクエストを送信していることを確認することもできます。
[secondary_label curl loop output: Droplet: app-1, IP Address: app_1_IP_address Droplet: app-2, IP Address: app_2_IP_address ...
他のロードバランサーが再びオンラインになったら、他の方向でフェイルオーバーを試すこともできます。
実際のクライアントIPアドレスをログに記録するようにNginxを構成する
ご覧のとおり、Nginxアクセスログには、すべてのクライアントリクエストが、最初にリクエストを行ったクライアントの実際のIPアドレスではなく、現在のロードバランサーのプライベートIPアドレスからのものであることが示されています(つまり、 ローカルマシン)。 ロードバランサーサーバーではなく、元のリクエスターのIPアドレスをログに記録すると便利なことがよくあります。 これは、すべてのバックエンドアプリサーバーでNginx構成にいくつかの変更を加えることで簡単に実現できます。
両方のアプリサーバーで、nginx.conf
ファイルをエディターで開きます。
sudo vi /etc/nginx/nginx.conf
[ログ設定]セクション(http
ブロック内)を見つけて、次の行を追加します。
/etc/nginx/nginx.confに追加
log_format haproxy_log 'ProxyIP: $remote_addr - ClientIP: $http_x_forwarded_for - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"';
保存して終了。 これは、haproxy_log
と呼ばれる新しいログ形式を指定します。これにより、$http_x_forwarded_for
値(元の要求を行ったクライアントのIPアドレス)がデフォルトのアクセスログエントリに追加されます。 リバースプロキシロードバランサーのIPアドレスである$remote_addr
も含まれています(つまり、 アクティブなロードバランサーサーバー)。
次に、この新しいログ形式を使用するには、デフォルトのサーバーブロックに行を追加する必要があります。
両方のアプリサーバーで、default
サーバー構成を開きます。
sudo vi /etc/nginx/sites-available/default
server
ブロック内(listen
ディレクティブのすぐ下が適切な場所です)に、次の行を追加します。
/ etc / nginx / sites-available/defaultに追加
access_log /var/log/nginx/access.log haproxy_log;
保存して終了。 これは、最近作成したhaproxy_log
ログ形式を使用してアクセスログを書き込むようにNginxに指示します。
両方のアプリサーバーで、Nginxを再起動して変更を有効にします。
sudo service nginx restart
これで、Nginxアクセスログに、リクエストを行っているクライアントの実際のIPアドレスが含まれているはずです。 前のセクションで行ったように、アプリサーバーのログを追跡してこれを確認します。 ログエントリは次のようになります。
New Nginx access logs:. . . ProxyIP: load_balancer_private_IP - ClientIP: local_machine_IP - - [05/Nov/2015:15:05:53 -0500] "GET / HTTP/1.1" 200 43 "-" "curl/7.43.0" . . .
ログの見栄えが良ければ、準備は完了です。
結論
このガイドでは、可用性が高く、負荷分散されたインフラストラクチャをセットアップする完全なプロセスについて説明しました。 この構成は、アクティブなHAProxyサーバーがバックエンド上のアプリサーバーのプールに負荷を分散できるため、うまく機能します。 需要の拡大または縮小に応じて、このプールを簡単に拡張できます。
FloatingIPとCorosync/Pacemakerの構成により、負荷分散レイヤーでの単一障害点が排除され、プライマリロードバランサーに完全な障害が発生した場合でもサービスが機能し続けることができます。 この構成はかなり柔軟性があり、HAProxyサーバーの背後に優先アプリケーションスタックを設定することで、独自のアプリケーション環境に適合させることができます。