ども、cloudpack の かっぱ (@inokara) です。
ニーズの有無は置いといて
HAProxy で HAProxy 自体のプロセスは生かしたまま frontend を有効、無効にするスクリプトを作ったのでメモ。
HAProxy の stats 機能を使う
HAProxy は stats を有効にすればコマンドラインからバックエンドサーバーの切り離しや frontend を有効にしたり無効にしたいすることが出来る。
例えば、以下の様な設定があったとする。
global log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 daemon stats socket /var/run/haproxy.sock mode 644 level admin (snip) defaults log global (snip) frontend balancer-test01 monitor-uri /b1 mode http option forwardfor bind 0.0.0.0:80 listen stats 0.0.0.0:1919 mode http stats enable stats uri /haproxy?stats stats auth admin:AdMiN123
以下のように実行することで frontend balancer-test01
を一時的に無効にすることが出来る。
echo "disable frontend balancer-test01" | sudo socat stdio /var/run/haproxy.sock
確認。
$ echo "show stat" | sudo socat stdio /var/run/haproxy.sock | grep balancer-test01 balancer-test01,FRONTEND,,,0,100,2000,151,144747,27650,0,0,1,,,,,STOP,,,,,,,,,1,2,0,,,,0,0,0,100,,,,0,0,0,100,51,0,,0,100,151,,,0,0,0,0,,,,,,,,
STOP
が確認出来る。
有効にする場合には以下のように実行する。
$ echo "enable frontend balancer-test01" | sudo socat stdio /var/run/haproxy.sock
確認。
$ echo "show stat" | sudo socat stdio /var/run/haproxy.sock | grep balancer-test01 balancer-test01,FRONTEND,,,0,100,2000,181,145557,34010,0,0,1,,,,,OPEN,,,,,,,,,1,2,0,,,,0,1,0,100,,,,0,0,0,100,81,0,,1,100,181,,,0,0,0,0,,,,,,,,
OPEN
が確認出来る。
ということでスクリプト
特になんのひねりもないけど。
#!/bin/bash stats="/var/run/haproxy.sock" function haproxy_maint() { for i in `echo "show stat" | socat stdio ${stats} | grep FRONTEND | awk -F"," '{print $1}'` do if [ $i != "stats" -a $1 != "status" ];then echo "$1 frontend $i" | socat stdio ${stats > /dev/null echo "$i $1d" else status_result=`echo "show stat" | socat stdio ${stats} | grep FRONTEND | grep $i | awk -F"," '{print $18}'` echo "frontend $i $1 $status_result" fi done } case $1 in status_haproxy) haproxy_maint status ;; enable_haproxy) haproxy_maint enable ;; disable_haproxy) haproxy_maint disable ;; *) echo $"Usage: $0 {maint_all|status_haproxy|enable_haproxy|disable_haproxy}" esac
とりあえず実行すると以下のように。 /var/run/haproxy.sock
についている権限次第になるが、今回は sudo
をつけて実行する。
$ sudo ./haproxy-maint.sh Usage: ./haproxy-maint.sh {status_haproxy|enable_haproxy|disable_haproxy}
現在の状態を確認する為に status_haproxy
を実行する。
$ sudo ./haproxy-maint.sh status_haproxy frontend balancer-test01 status OPEN frontend balancer-test02 status OPEN frontend stats status OPEN frontend statistics status OPEN
上記のように、現在の frontend
の状態が出力される。とりあえず、現在は全ての frontend
は OPEN
の状態。
次に frontend
を全て無効にする。
$ sudo ./haproxy-maint.sh disable_haproxy balancer-test01 disabled balancer-test02 disabled frontend stats disable OPEN statistics disabled
listen stats 0.0.0.0:1919
は敢えて無効にしないようにしている(ブラウザでもステータスを確認することがある為)。そして、念のために確認。
$ echo "show stat" | sudo socat stdio /var/run/haproxy.sock | grep FRONTEND balancer-test01,FRONTEND,,,0,100,2000,622,157464,127502,0,0,1,,,,,STOP,,,,,,,,,1,2,0,,,,0,0,0,100,,,,0,0,0,100,522,0,,0,100,622,,,0,0,0,0,,,,,,,, balancer-test02,FRONTEND,,,2,2,2000,46,0,8228,0,0,44,,,,,STOP,,,,,,,,,1,3,0,,,,0,0,0,1,,,,0,0,0,44,0,0,,0,1,44,,,0,0,0,0,,,,,,,, stats,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,6,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,0,0,0,0,,,,,,,, statistics,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,STOP,,,,,,,,,1,7,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,0,0,0,0,,,,,,,,
ALL STOP
になっている。
次に frontend
を一気に有効に。
$ sudo ./haproxy-maint.sh enable_haproxy balancer-test01 enabled balancer-test02 enabled frontend stats enable OPEN statistics enabled
念のため確認。
$ echo "show stat" | sudo socat stdio /var/run/haproxy.sock | grep FRONTEND balancer-test01,FRONTEND,,,0,100,2000,608,157086,124534,0,0,1,,,,,OPEN,,,,,,,,,1,2,0,,,,0,1,0,100,,,,0,0,0,100,508,0,,1,100,608,,,0,0,0,0,,,,,,,, balancer-test02,FRONTEND,,,2,2,2000,46,0,8228,0,0,44,,,,,OPEN,,,,,,,,,1,3,0,,,,0,0,0,1,,,,0,0,0,44,0,0,,0,1,44,,,0,0,0,0,,,,,,,, stats,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,6,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,0,0,0,0,,,,,,,, statistics,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,7,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,0,0,0,0,,,,,,,,
とりあえず
誰得な内容だけど自分得だからいいや。
元記事はこちらです。
「誰得?HAProxy の frontend を無効にしたり有効にしたりするスクリプト」