如何通过命令行从haproxy中删除平衡节点?


46

我有haproxy作为负载均衡器运行,并且从haproxy附带的stats Web界面中,我可以将Web服务器置于维护模式(并再次退出)-太好了!

但是,我也希望能够从命令行执行相同的操作(以在某些自动化部署工作流中使用)。这有可能吗?

非常感谢

Answers:


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 socat在Ubuntu上)。

现在,您需要做的就是关闭此命令以断开节点:

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

要将其备份,请在上面的命令中将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”。由于libreadline(GPL)与OpenSSL之间的许可冲突,他们对其进行了修补。在这种情况下,你使用socat /var/run/haproxy.stat stdio的每一个命令
bentolor

7

如果您几乎只能访问netcat(nc),则可以使用netcat()以类似的方式使用它与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的文件,则将Web服务器配置为返回503代码。使用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-将haproxy后端配置为检查URL,而不是仅如下检查端口:

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


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.