コマンドライン経由でhaproxyからバランスの取れたノードを削除するにはどうすればよいですか?


46

ロードバランサーとしてhaproxyを実行しており、haproxyに付属のstats Webインターフェースから、Webサーバーをメンテナンスモードにすることができます(そして、再びそれを元に戻します)-これは素晴らしいことです!

ただし、コマンドラインから同じアクションを実行できるようにしたい(一部の自動展開ワークフローで使用するため)。これは可能ですか?

どうもありがとう

回答:


59

更新(2012年8月28日):最近ではhaproxyctlを使用する傾向があり、以下で説明する方法を利用しています。


同じ問題を抱えている他の人のために、もう少し調査してから修正しました。

構成にUnixソケットを追加してから、それと対話することができます可能なコマンドは次のとおりです)。

設定する:

sudo nano /etc/haproxy/haproxy.cfg

「グローバル」セクションに以下を追加します。

stats socket /etc/haproxy/haproxysock level admin

haproxyデーモンを再起動します(例sudo service haproxy restart

今、あなたはsocatを必要としています(もし持っていないなら、apt-get install socatUbuntuで)。

あとは、このコマンドを実行してノードを停止するだけです。

echo "disable server yourbackendname/yourservername" | socat stdio /etc/haproxy/haproxysock

それを元に戻すには、上記のコマンドのdisableをenableに置き換えます。


21

beardwizzleのechoメソッドに加えて、これをインタラクティブに行うこともできます。

root@ny-lb01:/etc/haproxy# sudo socat readline /var/run/haproxy.stat 

prompt
> set timeout cli 1d
> disable server foo/web01
> help
Unknown command. Please enter one of the following commands only :
  clear counters : clear max statistics counters (add 'all' for all counters)
  clear table    : remove an entry from a table
  help           : this message
  prompt         : toggle interactive mode with prompt
  quit           : disconnect
  show info      : report information about the running process
  show stat      : report counters for each proxy and server
  show errors    : report last request and response errors for each proxy
  show sess [id] : report the list of current sessions or dump this session
  show table [id]: report table usage stats or dump this table's contents
  get weight     : report a server's current weight
  set weight     : change a server's weight
  set timeout    : change a timeout setting
  disable server : set a server in maintenance mode
  enable server  : re-enable a server that was previously in maintenance mode

6
ここでの大きな落とし穴は、Debianのsocatが「readline」をサポートしていないことです。ただし、manページではそうです。彼らは、libreadline(GPL)とOpenSSLの間のライセンス衝突のためにそれを修正しました。この場合socat /var/run/haproxy.stat stdio、すべてのコマンドに使用します
ベントロール

7

netcat(nc)にしかアクセスできないという偶然の機会に、これを使用してに似た方法でHAProxyのソケットファイルと対話できますsocat

$ echo "show info" | nc -U /var/lib/haproxy/stats | head -10
Name: HAProxy
Version: 1.5.2
Release_date: 2014/07/12
Nbproc: 1
Process_num: 1
Pid: 29745
Uptime: 0d 0h14m35s
Uptime_sec: 875
Memmax_MB: 0
Ulimit-n: 8034

サーバーを無効にするには:

$ echo "enable server bk_dservers/ds02" | nc -U /var/lib/haproxy/stats

上記を実行するには、ソケットファイルに適切なレベルのアクセス権があることを確認してください。主にこのようなもの:

stats       socket /var/lib/haproxy/stats level admin

それ以外の場合は、アクセス許可拒否エラーが発生します。

$ echo "disable server bk_dservers/ds02" | nc -U /var/lib/haproxy/stats
Permission denied

$

参照資料


7

簡単な方法は次のとおりです。

1-たとえば、maintenance.htmlという名前のファイルが存在する場合、503コードを返すようにWebサーバーを構成します。Apacheを使用すると、次のように実行できます。

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{ENV:REDIRECT_STATUS} !=503
  RewriteCond "/var/www/maintenance.html" -f
  RewriteRule ^(.*)$ /$1 [R=503,L]
</IfModule>

2-次のようにポートのみをチェックするのではなく、URLをチェックするようにhaproxyバックエンドを設定します。

backend site
    balance roundrobin
    option httpchk GET /index.html
    server myserver1.example.com 192.0.2.1:80 cookie S1 check inter 2000 fall 3
    server myserver2.example.com 192.0.2.2:80 cookie S2 check inter 2000 fall 3

3-Webサーバーとロードバランサーを再起動します。

4-Webサーバーをメンテナンスモードにします。

touch /var/www/maintenance.html

5-Webサーバーをメンテナンスモードから削除します。

rm -f /var/www/maintenance.html

2

また、1つのサーバーからヘルスチェックページを一時的に「削除」して、エンドポイントを停止してからアプリケーションを公開することもできます。


0

あなたがdebianを持っている場合、readlineは動作しません、netcatはインタラクティブのためのより良いオプションです:

user@server:/etc/haproxy$ sudo nc -U /etc/haproxy/haproxysock
prompt
> show info
Name: HAProxy
Version: 1.7.11-1ppa1~xenial
Release_date: 2018/04/30
Nbproc: 1
Process_num: 1
Pid: 12307
Uptime: 0d 10h33m22s
...

非インタラクティブ:

echo "show info;show stat" | sudo nc -U /etc/haproxy/haproxysock
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.