负载均衡
在之前的文章分布式与集群中有提到为什么要负载均衡。下面来谈一下负载均衡的相关技术
为什么需要负载均衡
对一个业务系统来说,如果负载过重,比如说访问量过大的时候,要么选择配置更高性能的服务器,要么使用多台服务器来进行负载。
所以可以将同一个系统部署多份到若干服务器上,然后负载均衡
就是让若干台主机上的工作均衡一点,每台主机都帮忙分担一点,而不是让一台主机全部扛起来。
而且这个负载均衡的工作,最好独立出来,放到独立的服务器或者设备上(比如Nginx),但是负载均衡的单点故障也来了,所以至少把负载均衡也搞成一个集群。 负载均衡就是让3台主机上的工作均衡一点,每台主机都帮忙分担一点,而不是让一台主机全部扛起来。
难点就在于面对大量的请求,如何“均匀”的分担到后端的服务器上
负载均衡的实现方式
HTTP重定向
我们知道302是HTTP协议的状态码,其含义是通知浏览器将所有的报文发到另一台服务器上。
用户能看到的IP地址实际上是负载均衡服务器的地址,所以浏览器通过IP地址访问到网站的时候,负载均衡回返回一个HTTP 302重定向。然后浏览器的所有连接都会重定向到真实的Web服务器上。负载均衡服务器就像一个指路人一样。
优点是比较简单,直接利用现有的HTTP协议即可。
缺点就出
- 浏览器的要进行两次请求才能访问到服务,性能比较慢。
- 同时所有流量都需要经过负载均衡进行重定向,所以这台服务器的性能就至关重要,很容易成为瓶颈。
DNS域名解析负载均衡
我们知道网址只是为了人类更方便记忆,实际在我们访问的时候,会通过DNS域名服务器进行解析,得到相应的IP地址。
那么我们可以在DNS服务器上设置网站的域名对应多条IP地址。
网址
IP地址
www.mysite.com IN A
114.100.80.1
www.mysite.com IN A
114.100.80.2
www.mysite.com IN A
114.100.80.3
缺点也很明显,DNS服务器一般在域名服务商那里,我们的控制权不高。
而且如果要把A下线了的话,因为DNS是多级解析的,每一级都可能缓存A的地址,而域名在进行解析的时候,是优先从缓存里面取,这段期间,会导致用户访问已经下线的服务器造成访问失败。
反向代理负载均衡
Web服务器只需要设置内网地址,所有的请求都直接发到反向代理服务器上,由它来进行转发,最典型的就是Nginx。
因为反向代理服务器既需要让外部的浏览器能访问到,又需要与内网中的Web服务器进行通信。所以它需要内外两套IP地址,自然也需要配置两块网卡。
同样,反向代理的性能将成为瓶颈。
IP负载均衡(NAT模式)
在这种方案里面,负载均衡服务器实际上充当了网关的作用,类似于NAT模式。
- 浏览器发出的报文的真实目的地址是网关的外部IP,所以会直接发到网关上。
- 然后由网关分配一个内网的服务器给它,并把报文的目的IP地址改变为集群某台服务器的IP地址,然后转发到 集群中某台服务器上。
- Web服务器回复一个报文,其源地址自然是集群内网的IP地址,目标地址是浏览器的IP。为了让浏览器对后端Web服务器不可见,所以还需要进行地址转换。
- 报文通过网关中转时,网关还需要将内网的地址修改为其外网的地址(源地址转换SNAT),然后返回给浏览器即可。
可以看出整个过程中对浏览器而言,无法感知到后端的服务器,在它看来都是网关服务器直接返回给他的。
同样这种方案都需要经过网关服务器,吞吐量受限于其网卡带宽。
链路层负载均衡
这种方式又叫直接路由方式(DR)
,服务器集群的IP地址都一样,只需要在负载均衡服务器分发的时候修改MAC地址即可,这样浏览器请求的IP地址和真实的IP地址一致,少了地址转换这一步,而且可以将响应的报文直接返回浏览器,避免负载均衡服务器的网卡带宽称为瓶颈。
典型例子是LVS(Linux Virtual Server),LVS与RS(RealServer, RS)使用同一个VIP,那么RS都用同一个VIP怎么实现的,我们知道网卡上可以设置一个loopback环路,在其上配置这个VIP即可。
详细的过程:
- 一个请求过来的时候,LVS需要做的是将MAC地址修改为某一台RS的MAC地址即可,源目的的IP地址都没有改变。
- RS收到LVS发来的包,发现MAC是自己的,IP也是自己的,所以合法的接受,RS感受 不到前面的LVS存在。
- RS返回响应报文的时候,因为之前的IP都没有改变过,只需要向源IP返回即可,不需要再经过LVS,
正因为不受限于LVS的性能,所以整体的性能比较好,为广泛的应用到。
大型网站一般怎么做?
大型网站一般有两层负载,
第一级负载均衡:DNS域名解析,通过DNS查询式,获取到了就近接入数据中心。也就是通过DNS获得的服务器实际上是内部的负载均衡,然后这个内部的负载均衡再通过集中转发的模式将请求分发到真实的Web服务器上。
负载均衡算法
之前所有的描述都省略了负载均衡服务器如何知道要选哪一台Web服务器的算法。
主要有如下几种:
- 轮询:也就是请求平均分配,雨露均沾
- 加权轮询:能者多劳,性能强的服务器分配更多的请求
- 随机:类似通过掷骰子的方式来选。
- 最少连接:谁闲分配给谁。
- 源地址散列:对源地址进行HASH,这样来自同一个IP地址的请求都会落到同一台服务器上。