📝
haproxyを使って利用可能なサーバがない時にバックアップサーバに振り分ける
haproxyを使ってバックエンドのサーバに指定したサーバが全台死んだ時に、バックアップのサーバにリクエストを流す方法を調べました。
ユースケースとしては、haproxy経由でDBのリードレプリカに接続している構成で、リードレプリカが全台死んだ(あるいはレプリケーションの遅延などでリードレプリカとしての役割を果たさなくなった)時に、復旧まで一時的にマスターに向けたい場合などを想定しています。
設定方法
configに以下の修正をおこないます。
- バックアップサーバとしてマスターサーバを
server
に設定します -
backend
セクションのserver
設定にbackup
オプションを追記します。
backup
オプションを指定すると、バックアップ以外のサーバがunavailableになった時にそのサーバにバランシングされるようになります。
backend
セクションのサンプルを紹介します。
backend read_repl
mode tcp
balance roundrobin
option mysql-check user haproxy
server slaves1 read-repl01.test.in:3306 weight 1
server slaves2 read-repl02.test.in:3306 weight 1
server master master-server:3306 backup
バックアップ以外のサーバが利用不可能になった場合、次のログと共にバックアップサーバにバランシングされ始めます。
[WARNING] 109/070615 (1) : Server ead_repl/slaves1 is DOWN, reason: Layer4 wrong status, check duration: 4ms. 0 active and 1 backup servers left. Running on backup. 1 sessions active, 0 requeued, 0 remaining in queue.
サーバのステータスがhealthyに戻ったことを検知するとhaproxyは再度リクエストをバックアップサーバ以外のサーバにバランシングし始めます。
その他
複数のバックアップサーバーを利用したい場合、これに加えてallbackups
オプションを指定する必要があります。
Ref:https://cbonte.github.io/haproxy-dconv/2.0/configuration.html#option allbackups
Discussion