由于项目中经常涉及到检修升级操作,在进行检修升级时,服务就需要停止一段时间,检修结束后重启,在此期间相关的功能页面都将无法访问。甲方反馈,需要停止服务的检修工作暂时不予执行。因此,为了不耽误系统的升级,就需要用到负载均衡。
我们这边的其他系统采用的都是华为云的负载均衡服务,因此毫无例外我需要进行这方面的工作。
首先就是找个一个可以用的ELB,运维同事给我指定了一个ELB。我们采用的应该都是共享型负载均衡,通过添加监听器:监听器名称是自动生成,协议端口就是需要监听的端口,后端云服务器组选择新创建,会自动生成名称,另外比较重要的是健康检查配置:涉及到健康检查类型(默认是http),检查路径(默认为/),期望返回码(默认200)。整个创建的过程可以说是相当顺利了,创建之后显示2个服务器均为离线(如下图):
自己当时是一点思路也没有,尝试各种方法:1、确保对应服务器对应端口是存在的,即:对应端口的服务处于启动状态 2、更改对应健康检查配置的检查周期和超市时间,都改为了最大值:50
事实证明都不对。然后我开始在网上查各种资料,直到昨天才找到正确查找问题的资料:健康检查异常如何排查?_弹性负载均衡 ELB_常见问题_健康检查_华为云
这个网址给出的排查问题的思路非常清晰,我是一步步照着来的:
如上图:1 2 3 4 项我没有做排查是因为我使用的这个共享型负载均衡 下已经有了几个监听器都处理正常在线状态。且有一个同样做了负载均衡正常使用的系统,和我目前要负载的系统是一个网段的。
因此我主要排查的是其余几项:
1、检查健康检查配置
独享型和共享型负载均衡,单击对应的负载均衡名称,进入负载均衡基本信息页面。切换到“后端服务器组”页签,单击对应的后端服务器组名称,在其基本信息页面,单击“健康检查”右侧的配置按钮。查看以下参数:
- 域名。健康检查使用HTTP协议时,如果后端服务器设置了校验HOST头能力,需要将后端服务器配置的域名填写到“健康检查配置”页面中的“域名”处。
- 协议。
- 端口。端口必须是后端服务器上真实业务所监听的端口,不是自定义端口。检查您配置的健康检查端口和监听的端口是否一致。不一致则会导致健康检查异常。
- 检查路径。如果是使用HTTP健康检查需要查看此参数,建议配置简单的静态HTML文件。
说明:
- 健康检查协议为“HTTP”,则会检查端口和路径。
- 健康检查协议为“TCP”,则只检查端口。
- 您的健康检查协议为“HTTP”,健康检查异常时,如果您已检查端口没有问题,请修改检查路径或者将健康检查协议修改为“TCP”,只检查端口。
- 检查路径需填写绝对路径。
访问链接为:http://www.example.com或http://192.168.63.187:9096,则检查路径填写“/”。
访问链接为:http://www.example.com/chat/try/,则检查路径填写“/chat/try/”。
访问链接为:http://192.168.63.187:9096/chat/index.html,则检查路径填写“/chat/index.html”。
2、检查后端服务器是否正常
说明:
如果后端服务器的操作系统为Windows,请通过浏览器直接访问https://后端服务器的IP : 健康检查配置的端口。如果返回码为2xx或3xx,则表示后端服务器正常。
- 您可以在后端服务器上通过以下命令查看后端服务器的健康检查端口是否被健康检查协议正常监听。
netstat -anlp | grep port
回显中包含健康检查端口信息并且显示LISTEN,则表示后端服务器的健康检查端口在监听状态,如图7中表示880端口被TCP进程所监控。
如果您没有配置健康检查端口信息,默认和后端服务器业务端口一致。图8 后端服务器没有被监听的回显示例
如果健康检查端口没有在监听状态(后端服务器没有被监听),您需要先启动后端服务器上的业务,启动业务后再查看健康检查端口是否被正常监听。
- 如果是HTTP健康检查,请您在后端服务器上执行以下命令查看回显中返回的状态码。
curl 后端服务器的私有IP:健康检查端口/健康检查路径 -iv
HTTP健康检查是ELB向后端服务器发起GET请求,当获取到以下所列的响应状态码,认为服务器是正常状态。
对于TCP的监听器,HTTP健康检查正常返回状态码是200。
对于独享型ELB:HTTP/HTTPS健康检查正常返回状态码均为200。
对于共享型ELB:HTTP健康检查正常返回状态码是200、202或者401。
图9 后端服务器异常的回显示例
图10 后端服务器正常的回显示例
- 如果HTTP健康检查异常,除了检查健康检查路径外,建议您将配置的HTTP健康检查修改为TCP健康检查。操作如下:
在监听器界面,修改目标监听器,在配置参数里选择已有TCP健康检查的后端服务器组,或者选择新创建TCP健康检查的后端服务器组。配置完成之后,几十秒后去查看健康检查状态是否恢复正常。
3、检查服务器防火墙
如果后端服务器内部开启了防火墙或其他安全类防护软件,这些软件可能会屏蔽ELB所在的VPC网段或100.125.0.0/16网段的IP。
对于独享型负载均衡,请您在防火墙入方向规则中放通ELB所在的VPC网段。
对于共享型负载均衡,请您在防火墙入方向规则中放通100.125.0.0/16网段。
检查服务器路由
请检查是否手动修改了后端服务器内部的路由,查看主网卡(比如eth0)上是否配置默认路由,默认路由是否修改。如果默认路由更改,可能导致健康检查报文无法到达后端服务器。
您可以在后端服务器上通过以下命令查看您的默认路由是否指向网关(经过ELB转发属于跨网段访问,三层通信需要配置默认路由指向网关)。
ip route
或
route -n
正常的回显如图11所示。
图12 默认路由未指向网关示例
如果回显中没有像图11中的第一条路由信息,或者路由指向的IP的不是后端服务器所在VPC子网的网关,请您配置默认路由指向网关。
4 、检查服务器负载
通过云监控服务,查看后端服务器的CPU/内存/网络连接数等,来判断后端服务器的负载是否过高。
如果负载很高,可能会导致健康检查的连接或请求超时。
5、 检查服务器hosts.deny文件
建议您排查后端服务器的/etc/hosts.deny文件,文件中不能写入ELB所在的VPC网段或健康检查100.125.0.0/16网段。
对于独享型负载均衡,该文件中不能写入ELB所在的VPC网段。
对于共享型负载均衡,该文件中不能写入健康检查100.125.0.0/16网段。
经过以上一系列的排查,发现出问题的是HTTP健康检查,在后端服务器上执行以下命令后看到的回显中返回的状态码为403:
curl 后端服务器的私有IP:健康检查端口/健康检查路径 -iv
由此可以知道健康检查的路径不被服务器允许访问,因此我就更改了对应路径:
将原有的 curl ip:端口号 -iv 改为了 curl ip:端口号+下面显示的路径(绿色线条部分)-iv
再次执行后显示200,然后将对应的ELB配置的健康检查路径改为了此路径,过了几分钟,离线变为在线,问题完美解决。