はじめに
みなさんこんにちは。サイオステクノロジーのNakayaです。
今回、HAProxyという多機能ロードバランサーのアクティブヘルスチェック機能を試してみました。
パラメータの詳細については以下のHAProxyドキュメントを参照していただくと良いかと思います。
http://cbonte.github.io/haproxy-dconv/2.5/intro.html#3.1
アクティブヘルスチェックとは
アクティブヘルスチェックとはロードバランサーがバックエンドの稼働状況をチェックする方法の一つです。ロードバランサーはバックエンドのサーバに対し、定期的にヘルスチェックのためのリクエストを送り、そのレスポンスを確認します。
今回はヘルスチェックとしてバックエンドサーバに対しHTTPリクエストを送信するL7レベルのヘルスチェックを試してみます。
検証環境の構築
今回は簡単にDocker、docker-composeを使用して検証します。
以下がディレクトリ構成です。
.
├── docker-compose.yaml
└── haproxy
└── haproxy.cfg
docker-compose.yamlはhaproxyコンテナが1台、nginxコンテナを2台立てます。nginxはどちらのコンテナなのかを判別しやすいようにentorypointでコンテナ名をindex.htmlを起動時に書き込むようにしています。
version: '3'
services:
haproxy:
image: haproxy:lts-alpine3.19
container_name: haproxy
ports:
- '127.0.0.1:8080:8080'
- '127.0.0.1:8081:8081'
volumes:
- ./haproxy:/usr/local/etc/haproxy/
tty: true
web1:
image: nginx:alpine
container_name: web1
entrypoint: >
sh -c "
echo 'web1' > /usr/share/nginx/html/index.html
nginx -g 'daemon off;'
"
expose:
- '80'
tty: true
web2:
image: nginx:alpine
container_name: web2
entrypoint: >
sh -c "
echo 'web2' > /usr/share/nginx/html/index.html
nginx -g 'daemon off;'
"
expose:
- '80'
tty: true
haproxy.cfgは以下のようにしています。
global
log stdout format raw daemon debug
defaults
log global
mode http
maxconn 5000
timeout connect 5s
timeout client 20s
timeout server 50s
frontend public
bind *:8080
default_backend web
option forwardfor
frontend stats
bind *:8081
stats enable
stats uri /
stats refresh 1s
backend web
option httpchk
http-check send meth GET uri /
http-check expect status 200
server web1 web1:80 check inter 3s fall 3 rise 2
server web2 web2:80 check backup inter 3s fall 3 rise 2
8081ポートではステータスボードを表示します。ステータスボードではヘルスチェックの状態や、統計情報が表示できます。
8080ポートはアクセスがあった際、
backend web
のserver
指定したサーバに転送します。上記の設定ではweb1をマスターとし、web2をマスターサーバーのバックアップサーバとして機能させています。アクティブヘルスチェック機能を有効にするにはbackendセクションの
server
部分にcheck
とつけます。check
と記載したサーバにはアクティブヘルスチェックが有効になり、server
で指定したサーバを死活監視してくれます。上記の設定の場合、HTTPのGETメソッドを用いて
/
にアクセスし、返却されるステータスコードが200であることを期待しています。ヘルスチェックは3秒毎に実行され、3回連続で失敗すると、サーバがダウンしたと判定し、web2のサーバに切り替わります。
また、ダウンしたと判断されてから2回連続でヘルスチェックが成功すると、サーバが復旧したと判定し、web1のサーバに切り替わります。
起動
以下のコマンドでコンテナを起動させます。
docker compose up -d
ブラウザを開き、
http://localhost:8081
に アクセスしてみます。アクセスすると、WEB UIが開き、web1、web2がそれぞれUP状態であることが確認できます。また、ブラウザで、
http://localhost:8080
に アクセスしてみます。アクセスすると、web1と表示されているのがわかります。検証
ここまででWeb1に対してアクセスできることが確認できたので、いよいよアクティブヘルスチェックの機能を確認していきたいと思います。以下のコマンドでweb1のサーバを停止します。
docker stop web1
10秒ほどまち、再度ブラウザから、
http://localhost:8080
に アクセスしてみます。アクセスすると、web2と表示されているのがわかります。また、
http://localhost:8081
にアクセスしてみると、web1がDOWN状態になっていることが確認できます。次に再度Web1を起動させてみます。以下のコマンドでWeb1を起動させます。
docker start web1
10秒ほどまち、再度ブラウザから、
http://localhost:8080
に アクセスしてみます。アクセスすると表示がweb1に戻っていることがわかります。また、
http://localhost:8081
にアクセスしてみると、web1がUP状態になっていることが確認できます。さいごに
今回はHAProxyを利用してアクティブヘルスチェックの機能を検証してみました。
Nginxの商用版(NGINX Plus)でも同様の機能がありますが、HAProxyであれば無償で利用できるので、SSLの終端サーバ + アクティブヘルスチェック ぐらいの利用用途であればHAProxyは有力な選択肢になるかと思います。 m(_ _)m