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 登陆之后就能看到管理页面了:
二、管理功能
因为我们还配置了管理功能,所以在各个 backend 都能看到如下管理功能:
我们在左侧勾选好对应的后端节点,选择需要转换的状态点击 Apply 就能完成后端节点的状态切换。
三、平滑发布
对于平滑发布来说,这里用得比较多的 2 个选项是 READY(就绪状态)和 MAINT(维护状态)。
READY 表示被勾选的节点已经完成维护,Apply 进入就绪状态后,Haproxy 会自动发起健康检查,如果检查通过,这些节点将进入映射状态,接受映射请求了。 MAINT 表示被勾选的节点需要进行维护,Apply 进入维护状态后,Haproxy 将会停止往这些节点转发请求,并等待已有的请求结束连接。
通过这个功能,我们就能对业务进行从容发布了,比如我们有一个业务有 2 个节点,我们可以先将其中一个节点改为 MAINT 状态,刷新 Haproxy 管理页面,当看到 Session 里面的 Cur(当前连接)为 0 个时,我们就可以从容的对这个节点进行发布、重启等维护操作,完成维护后我们在将这个节点改为 READY 状态即可。接着,我们同样操作剩下节点即可(节点剔除后带来的性能下降问题,这里就不展开了讨论了)。
四、命令行操作
很明显,这个功能非常实用,但是并不方便,因为需要手工操作,没法嵌入到自动化发布流程当中。不过通过分析 POST 请求,可以得出 curl 命令行操作方法:
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,可能出现业务请求异常问题。
- HDUOJ-----1098 Ignatius's puzzle
- 转--shell脚本备份mysql数据库
- NYOJ——————数的长度(斯特林公式的应用)
- 关于ssh命令的几个使用小技巧(r11笔记第27天)
- Golang语言社区--消息触发服务器启动基础模块分享
- NYOJ------汉诺塔(一)
- HDUOJ----Coin Change
- Golang语言社区--列出目录和遍历目录的方法
- HDUOJ-------单词数
- insert导致的性能问题大排查(r11笔记第26天)
- NYOJ-----最少乘法次数
- nyOJ-----韩信点兵
- HDUOJ-----A == B ?
- 用Oracle的眼光来学习MySQL 5.7的sys(上)(r11笔记第24天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 2.1 Kubernetes--Pod
- 3. Kubernetes集群安装
- macOS VirtualBox 桥接模式 设置静态ip 且能和联网
- 重新初始化k8s master节点
- 5.k8s基本命令汇总
- 6. k8s + jenkins 实现持续集成(完)
- 7. 复制k8s Node节点 并重新初始化k8s-nodes2节点 (k8s连载)
- 8.k8s连载--重新生成k8s token(kubeadm join报错及解决)
- 3. dcoker容器的命令
- 4. 镜像的原理
- 5.docker容器数据卷
- 6. Dockerfile详解
- 3.docker搭建一个博客平台
- 4. Docker 私有仓库搭建
- 抓包工具Charles