【问题描述】
最近遇到的一个问题,LVS负载均衡集群升级过程中,DNSPod出现主站点连接异常的告警,手动切换流量至灾备服务器应急恢复对外业务。
附:本案例是写给自己看的,先做一个记录,部分技术基础需要再完善,部分地方描述不准确后面来纠正。
【组网图】
【处理过程】
- 在感知到DNSPod(企业版)短信告警后,立即登录DNSPod平台,确认主站点这边链路异常了。
- 马上修改DNSPod的解析记录,将流量切换至灾备服务器。
- 经过x小时分析定位和分析日志后,确认是LVS负载均衡集群升级过程中,前端主机和后端主机之间链路不通导致的问题。集群升级完成后,再手动修改DNSPod将流量切回主长点。
【原因分析】
- 容器内的前端应用系统使用TCP长连接到LVS负载军器,当LVS集群内部逐台升级时,前端应用系统感知到链路端口,在当前会话进行重试,重试失败,触发前端应用系统切换到新的容器上。
- 由于应用本身的初始化过程较长,初始化还没完成时,当前已连接到LVS集群节点又开始升级,因此触发前端业务系统继续切换容器节点。最后整个容器集群都奔溃了。
【后续建议】
- 在前端业务系统中,优化TCP长连接的故障检测和新建链接的机制。
- LVS集群增加会话同步机制(可能技术上有难度),那么可以选择现成公有云产品,比如阿里云的负载均衡SLB,https://help.aliyun.com/document_detail/27544.html
2.1会话同步机制的原理:LVS集群内的每台LVS都会进行会话,通过组播报文同步到该集群内的其它LVS机器上,从而实现LVS集群内各台机器间的会话同步。如下图所示,当客户端向服务端传输三个数据包后,在LVS1上建立的会话A开始同步到其它LVS机器上。图中实线表示现有的连接,图中虚线表示当LVS1出现故障或进行维护时,这部分流量会走到一台可以正常运行的机器LVS2上。因而负载均衡集群支持热升级,并且在机器故障和集群维护时最大程度对用户透明,不影响用户业务。
3、LVS集群升级过程中,延迟集群内主机之间的升级间隔,确保业务正常后再进行下一台主机升级(这个方法有点笨,会增加很多工作量)。