HAProxyのアクティブヘルスチェック機能を試してみる

はじめに

みなさんこんにちは。サイオステクノロジーの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 webserver指定したサーバに転送します。上記の設定では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

 

 

 

 

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です