apache不支持动态增删节点,需通过外部脚本生成独立balancer配置+graceful重载实现平滑扩缩容;上线用脚本生成含status/loadfactor/hcmethod的balancermember并graceful,下线先drain再删配。

用独立配置文件 + graceful 实现节点上线
新节点不能靠 DNS 自动加入(无法控制权重与健康状态),推荐脚本化生成配置:
- 把所有 BalancerMember 集中写在单独文件里(如
/etc/apache2/mods-enabled/balancer-dynamic.conf),不混在主配置中 - 用脚本监听服务注册中心(如 Nacos/Etcd)变化,生成含
status=Ok、loadfactor和hcmethod的完整BalancerMember行 - 写入后执行
apache2ctl graceful—— 启动新工作进程,旧进程处理完现有请求再退出,连接不断、session 不丢
用 drain 状态 + 观察指标完成节点下线
直接删配置 reload 会中断长连接。必须分两步:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 先通过
balancer-manager或 POST 请求标记节点为status=+D(drain),Apache 停止分发新请求,但保留已有连接 - 访问
/balancer-manager页面,观察该节点的 Busy 和 Elected 数值是否归零;也可用 curl 查询:curl -s "http://localhost/balancer-manager?b=mygroup" | grep "192.168.1.10" - 确认无活跃连接后,再从配置文件中删除该行,并再次
graceful
启用 balancer-manager 并安全使用
这个界面不是万能的,但能辅助运行时操作:
- 必须显式启用:
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so,并添加<location>SetHandler balancer-manager Require ip 192.168.1.10</location>等精确访问控制 - 它支持启停节点、调权、手动健康检查,但不支持新增或删除配置行;所有修改仅内存生效,重启即失效
- 新增节点必须用 POST 提交(GET 无效):
curl -X POST http://localhost/balancer-manager -d "b=mygroup" -d "a=add" -d "w=http://10.0.1.5:8080" -d "lf=1",漏掉lf=1会导致状态为 Init,不接流量
必须开启的关键模块与参数
缺一不可,否则 drain、stickysession、健康检查都会失效:
-
mod_slotmem_shm:共享内存管理节点状态,支撑 drain 和权重持久化 -
timeout、retry、loadfactor:显式设置每个节点超时、故障重试间隔和负载权重 -
stickysession=ROUTEID+route=xxx:配合应用层 session 路由(如 JSESSIONID 中的 jvmRoute)保证会话粘性 -
lbmethod=bybusyness:按当前繁忙程度分发,比轮询更适应动态节点变化









