📝

haproxyを使って利用可能なサーバがない時にバックアップサーバに振り分ける

2021/04/21に公開

haproxyを使ってバックエンドのサーバに指定したサーバが全台死んだ時に、バックアップのサーバにリクエストを流す方法を調べました。
ユースケースとしては、haproxy経由でDBのリードレプリカに接続している構成で、リードレプリカが全台死んだ(あるいはレプリケーションの遅延などでリードレプリカとしての役割を果たさなくなった)時に、復旧まで一時的にマスターに向けたい場合などを想定しています。

設定方法

configに以下の修正をおこないます。

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