WEB应用

Haproxy进阶管理:命令行控制后端节点上下线

Jager · 2月24日 · 2018年 · · 1374次已读

很多业务系统都用到了 Haproxy 这个高性能反向代理负载均衡器。在日常运维当中,Haproxy 后端节点的上(接入)、下(剔除)线操作绝对是家常便饭,而且人工重启的时候经常有胆颤心惊的感觉。

下面分享一种命令行操作 Haproxy 后端节点平滑上下线的技巧。Haproxy进阶管理:命令行控制后端节点上下线

一、新增配置

Haproxy 自带了一个非常实用的管理页面,我们可以在 harpxoy.cfg 新增如下配置,开启 Haproxy 监控管理页面功能:

listen admin_stats
        stats   enable
        bind    *:8080                        //监听的 ip 端口号
        mode    http
        stats   refresh 30s                   //(可选)统计页面自动刷新时间
        stats   uri  /admin                   //访问的 uri   ip:8080/admin
        stats   realm haproxy_admin           //(可选)密码框提示文本
        stats   auth admin:admin              //(可选)认证用户名和密码
        stats   hide-version                  //(可选)隐藏 HAProxy 的版本号
        stats   admin if TRUE                 //管理界面,成功登陆后可通过 webui 管理节点

配置后,重启 Haproxy,访问 http://ipaddress:8080/admin,使用 admin/admin 登陆之后就能看到管理页面了:

Haproxy进阶管理:命令行控制后端节点上下线

二、管理功能

因为我们还配置了管理功能,所以在各个 backend 都能看到如下管理功能:Haproxy进阶管理:命令行控制后端节点上下线

我们在左侧勾选好对应的后端节点,选择需要转换的状态点击 Apply 就能完成后端节点的状态切换。

三、平滑发布

对于平滑发布来说,这里用得比较多的 2 个选项是 READY(就绪状态)和 MAINT(维护状态)。

READY 表示被勾选的节点已经完成维护,Apply 进入就绪状态后,Haproxy 会自动发起健康检查,如果检查通过,这些节点将进入映射状态,接受映射请求了。

MAINT 表示被勾选的节点需要进行维护,Apply 进入维护状态后,Haproxy 将会停止往这些节点转发请求,并等待已有的请求结束连接。

通过这个功能,我们就能对业务进行从容发布了,比如我们有一个业务有 2 个节点,我们可以先将其中一个节点改为 MAINT 状态,刷新 Haproxy 管理页面,当看到 Session 里面的 Cur(当前连接)为 0 个时,我们就可以从容的对这个节点进行发布、重启等维护操作,完成维护后我们在将这个节点改为 READY 状态即可。接着,我们同样操作剩下节点即可(节点剔除后带来的性能下降问题,这里就不展开了讨论了)。

四、命令行操作

很明显,这个功能非常实用,但是并不方便,因为需要手工操作,没法嵌入到自动化发布流程当中。不过通过分析 POST 请求,可以得出 curl 命令行操作方法:Haproxy进阶管理:命令行控制后端节点上下线

s 表示后端标签名

action 表示状态

b 表示 backend 标签名

通过测试,得出 curl 发起请求格式如下:

curl -u 用户名:密码 -d "s=后端标签名&b=backend 标签名&action=状态"  http://haproxy 管理页面地址

比如,如果 Haproxy 有一个后端如下配置:

backend log_server
    server node1 192.168.1.1:8087 cookie server1 check inter 2000 rise 3 fall 3 weight 3
    server node2 192.168.1.2:8087 cookie server2 check inter 2000 rise 3 fall 3 weight 3

那么,业务系统发布之前,我们将 192.168.1.1 这个节点改为维护状态,则如下发起请求即可:

curl -u 用户名:密码 -d "s=node1&b=log_server&action=maint"  http://haproxy 管理页面地址

Ps:要注意的是,这个 POST 参数必须 URL 转码,比如存在冒号【:】,需要转换为 %3A 才行。

业务系统发布之后,我们再发起 node1 上线请求:

curl -u 用户名:密码 -d "s=node1&b=log_server&action=ready"  http://haproxy 管理页面地址

后面我们只需要重复操作 node2 节点的上下线即可完成无损发布了。这一整套动作就可以整合到自动化发布流程当中,不再需要人工介入。

五、小结

本文介绍了 Haproxy 开启管理功能的配置方法以及命令行操作后端上下线的技巧,为程序平滑部署、系统自动化运维提供了一种更加简单的解决方案。

拓展:在复杂的业务场景中,可能用到了 etcd+confd + haproxy 的统一配置管理方案,原理是通过更改 Haproxy 配置,然后热重启 Haproxy(-st 指令)来上下线节点,是非常不错的方案!不过,根据我个人经验,在高频业务场景中,剔除后端节点再热重启 Haproxy,可能出现业务请求异常问题。

11 条回应
  1. Yvon 2018-2-24 · 21:35

    前排 顶!!!!!!!!!

  2. 趣知识 2018-2-24 · 21:43

    zgboke.com彻底不弄了?

  3. 明月登楼 2018-2-24 · 22:54

    负载均衡这玩意儿不是我们草根能用的上的感觉!太高大上了!
    不过,可以哪天拿公司的服务器和自己的服务器练练手!哈哈!

    • 米扑博客 2018-3-7 · 19:48

      你是大神,博客做得很赞了 :razz:

  4. 西枫里博客 2018-2-25 · 13:38

    太高端了,小小博客用不上,也折腾不来啊 :cry:

  5. 简单生活 2018-2-25 · 20:02

    高玩系列,玩不来!

  6. 龙笑天 2018-2-26 · 9:41

    服务器配置好后就不敢动了... :sad:

  7. 憧憬点滴记忆 2018-2-27 · 19:19

    这种负载均衡一般都是用于分布式服务体系的架构中的,最近在搞分布式开发,还是很好的一个推荐。

  8. 米扑博客 2018-3-7 · 19:48

    实用的技术 :grin:

  9. 北顾 2018-3-8 · 23:39

    签到成功!签到时间:下午11:38:52,每日签到,生活更精彩哦~

  10. uhjjhuj 2018-5-6 · 1:16

    您好,看到您的网站,我也自己制作了一个网站,希望跟您多学习交流,我的网站域名:yuedutop.cn 希望与您友情链接,如果您同意的话,希望您联系我[email protected]