
想一个问题:假设你有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这些负载均衡器集群的负载均衡及可靠性,我们可以做下述简单的方案