一、怎么保证你的业务可靠
想一个问题:假设你有10台服务器对外提供相同的服务,你如何保证这10台服务器能稳定处理外部请求?
这里可能有很多种解决方案,但本质上都是处理下述两个问题:
① 客户端的请求应该分配去哪一台服务器比较好?
② 万一其中某些服务器故障了,如何隔离掉故障服务器?
问题① 处理不好,可能会导致10台服务器中的一部分服务器处于饥饿状态,没有被分配客户端请求或者是分配得很少;而另一部分则一直在处理大量的请求,导致不堪负重。
问题② 处理不好,则CAP原则中的可用性(A)可能就没法保证,除非系统不需要A。
要解决上述问题,你必须实现一套控制器,能调度业务请求和管理业务服务器。很不幸的是,大多数情况下这个控制器往往就是整个系统的瓶颈。因为控制系统如果不深入到客户端上,就必须依赖一个集中式的决策机构,这个机构必然要承载所有客户端的请求。这时候你又得去考虑这个控制器的冗余和故障隔离的问题,这就变得无休无止。
二、业务和控制隔离
那么,如何解决上述问题?
那就是专业的事情交给专业平台去做,即,我们需要独立的负载均衡提供上述2点的解决方案。
对于客户端来说,每次请求一个站点,最终都会转变成对某个IP发起请求。所以只要能控制客户端访问的IP地址,我们就能控制请求应该落到哪个后端服务器上,从而达到调度效果,这是DNS在做的事情。或者,劫持客户端所有请求流量,对流量重新分配请求到后端服务器上。这个是Nginx、LVS等的处理方式。
图1、通过DNS实现负载均衡的效果示意图
图2、通过LVS/Nginx实现负载均衡的效果示意图
这两个方式都能达到负载均衡的效果。但这里面有个严重的问题,DNS、Nginx、LVS等服务在互联网时代不可能单机就能提供业务,都是集群式(也就是有N台服务器组成),那这些集群的可靠性和稳定性又该如何保证呢?
DNS主要负责域名解析,有一定的负载均衡效果,但往往负载效果很差,不作为主要考虑手段。Nginx提供7层负载均衡,主要靠域名来做业务区分和负载。LVS是4层负载均衡,主要靠TCP/UDP协议、IP地址、TCP/UDP端口来区分服务和负载。
为了解决Nginx、LVS这些负载均衡器集群的负载均衡及可靠性,我们可以做下述简单的