1.4 服务器健康检测
负载均衡器现在都使用了非常多的服务器健康检测技术,主要是通过发送不同类型的协议包并通过检查能否接收到正确的应答来判断后端服务器是否存活,如果后端服务器出现故障就会自动剔除。涉及的主要技术有以下3种。
·ICMP:负载均衡器向后端的服务器发送ICMP ECHO包(就是我们俗称的“ping”),如果能正确收到ICMP REPLY,则证明服务器ICMP处理正常,即服务器是活着的。
·TCP:负载均衡器向后端的某个端口发起TCP连接请求,如果成功完成三次握手,则证明服务器TCP处理正常。
·HTTP:负载均衡器向后端的服务器发送HTTP请求,如果收到的HTTP应答内容是正确的,则证明服务器HTTP处理正常。
这里以Nginx LB举例来简单说明健康检查机制。
upstream模块是Nginx负载均衡的主要模块,它提供了简单的办法来实现在轮询和客户端IP之间的后端服务器负载均衡,并可以对服务器进行健康检查。upstream并不处理请求,而是通过请求后端服务器得到用户的请求内容。在转发给后端时,默认是轮询,upstream模块包含的文件内容如下:
upstream php_pool { server 192.168.1.7:80 max_fails=2 fail_timeout=5s; server 192.168.1.8:80 max_fails=2 fail_timeout=5s; server 192.168.1.9:80 max_fails=2 fail_timeout=5s; }
以下是upstream模块相关指令的说明。
·max_fails:定义可以发生错误的最大次数。
·fail_timeout:Nginx在fail_timeout设定的时间内与后端服务器通信失败的次数超过max_fails设定的次数,则认为这个服务器不再起作用;在接下来的fail_timeout时间内,Nginx不再将请求分发给失效的机器。
·down:把后端标记为离线,仅限于ip_hash。
·backup:标记后端为备份服务器,若后端服务器全部无效则启用。
Nginx的健康检查主要体现在后端服务上,且功能被集成在upstream模块中。
以下是Nginx健康检查机制的说明。
Nginx在检测到后端服务器故障后,它依然会把请求转向该服务器,当Nginx发现timeout或者refused时,就会把该请求分发到upstream的其他节点上,直到获得正常数据后,Nginx才会把数据返回给用户,这也体现了Nginx的异步传输。这跟LVS/HAProxy的区别很大,在LVS/HAProxy里,每个请求都只有一次机会,假如用户发起一个请求,结果该请求分到的后端服务器刚好挂掉了,那么这个请求就失败了。