个人理解,如有错误,请指出,谢谢大家。
在开始正题之前,首先我们来看一下什么是负载均衡?
负载均衡:随着网站的流量越来越大,单台WEB服务器已经承载不了负载压力,那么我们就需要再加一台(或多台)服务器来分担原有服务器的访问(可能还有存储)压力,通过负载均衡服务器,可以将来自用户浏览器的访问请求分发到WEB服务器集群中的任何一台服务器上,使服务器的负载压力不再成为网站瓶颈。
那么,可以通过什么方式来进行负载均衡呢?
1.HTTP重定向负载均衡
比如,用户要访问一个网站,域名经DNS解析后得到:161.58.228.44(HTTP重定向服务器的IP地址),用户向161.58.228.44发送HTTP请求,HTTP重定向服务器根据某种负载均衡算法计算出一台物理服务器的地址(图中为161.58.228.46),然后将包含该地址的重定向响应(响应码为302)返回给浏览器,浏览器再对161.58.228.46发送HTTP请求,完成访问。
这种负载均衡方法比较简单,但缺点也很明显:
1.浏览器要发送两次请求才能完成访问,性能较差。
2.重定向服务器承载全部流量,且重定向服务器需要进行大量处理来判断要重定向到哪台服务器上,有时发布重定向所需的处理量几乎与提供页面本身所需的处理量一样。
3.存在单点故障问题。
2.DNS负载均衡
在DNS服务器中配置一个域名对应多个IP地址,每次域名解析时都会根据某种负载均衡算法计算出某个IP地址返回。
比如说图中用户请求www.mysite.com对应的IP地址,DNS服务器计算后返回114.100.80.3,用户再向114.100.80.3发送HTTP请求。
这种方法也是有缺点的,目前的DNS是多级解析,每一级DNS都可能缓存,如果某台服务器挂掉了,即使在根域名服务器上将此IP移除,客户仍然可能通过缓存得到该IP地址,从而向该挂掉的服务器发送请求。
实际上,我们可以用该方法做第一级负载均衡,也就是说,DNS解析出来的IP地址是nginx服务器的IP地址,再由nginx来做第二级负载均衡,由于nginx通常会做热备,所以上述问题发生条件是主nginx服务器和热备nginx服务器都挂掉了,而事实上这种概率通常是小很多的。
3.反向代理负载均衡
反向代理起到缓存静态资源的作用,事实上,反向代理服务器和负载均衡服务器都位于WEB服务器的前面,所以通常反向代理服务器通常提供负载均衡的功能。
反向代理服务器将请求根据负载均衡算法转发到某一WEB服务器上,WEB服务器处理完成后的响应也需要通过反向代理服务器返回给用户。反向代理服务器通常要配置内部和外部两个IP地址,而WEB服务器不直接与外部进行通信,所以只需要内部IP地址。
反向代理服务器转发请求在HTTP层面,通常也被称为应用层负载均衡。
反向代理服务器可能会出现单点故障,因此要做热备。
该方法的缺点是:所有请求都需经过反向代理服务器,性能可能会成为瓶颈。
4.网络层负载均衡(IP负载均衡)
用户的数据包到达负载均衡服务器后,负载均衡服务器经过负载均衡算法计算出某一WEB服务器地址(图中为192.168.1.1),然后将数据包的目的IP地址改为服务器地址(192.168.1.1)。服务器处理完成后响应数据包到负载均衡服务器,负载均衡服务器再将数据包源地址改为自身的IP地址发给客户端。
该方法无需通过应用层,可在内核进程完成数据分发,较反向代理负载均衡而言有更好的性能。但是,请求和响应依然要经过负载均衡服务器,负载均衡服务器仍然会存在性能瓶颈,下面的链路层方法会更好一些。
5.链路层负载均衡
数据链路层负载均衡是指修改目的mac地址进行负载均衡。
真实WEB服务器集群中的所有序IP和负载均衡服务器的IP一致,所以不需修改数据包的源IP地址和目的IP地址就可达到数据分发的目的。由于实际处理请求的真实WEB服务器IP和数据包目的IP一致,无需负载均衡服务器进行地址转换,可将响应数据包直接发回给客户端,避免负载均衡服务器成为瓶颈。
如图,请求数据包到达负载均衡服务器后,负载均衡服务器将数据包的目的mac地址修改为服务器0的mac地址。WEB服务器处理完后将响应发到网关,网关直接向响应数据包通过互联网发送给客户端,响应数据包无需经过负载均衡服务器。