关于负载均衡,你必须要知道的

什么是负载均衡

根据维基百科定义,负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。

为什么要使用负载均衡

负载平衡最重要的一个应用是利用多台服务器提供单一服务,这种方案有时也称之为服务器农场。

互联网时代,大流量的网站必须服务数以千万的用户请求,以快速、可靠的方式返回正确的文本、图像、音频、视频等数据。为了节省成本,有效地实现动态扩展,最佳实践通常是添加更多的服务器。负载均衡器在这里充当了“交通警察”的角色,它坐在你的服务器的前端,最大限度地提高速度和产能利用率,并确保没有一台服务器超负荷工作。

负载平衡器主要的功能是:

  • 在多个服务器之间高效地分发客户端请求或网络负载;
  • 通过仅向在线服务器发送请求,确保高可用性和可靠性;
  • 根据需求提供增加或减少服务器的灵活性;

怎么实现负载均衡

通常有三种负载均衡架构,分别是链路负载均衡、集群负载均衡和操作系统负载均衡。

所谓链路负载均衡就是通过DNS将域名解析成不同的IP,然后用户根据这个IP来访问不同的目标服务器,这种DNS解析的优点是用户会直接访问目标服务器,而不需要经过其他的代理服务器,通常访问速度会更快。缺点是DNS解析的结果会在用户本地有缓存,一旦某台服务器挂掉,用户缓存的域名没有及时更新,那么用户将无法访问这个域名,带来的后果非常严重。

链路负载均衡

集群负载均衡是另外一种常见的负载均衡方式,它一般分为硬件负载均衡和软件负载均衡。硬件负载均衡一般使用一台专门硬件设备来转发请求,硬件负载均衡的关键就是这台价格非常昂贵的设备,如F5,通常为了安全需要一主一备。它的优点很显然就是性能非常好,缺点就是非常贵,而且不便于动态扩容。

硬件负载

软件负载均衡是使用最普遍的一种负载方式,它的特点是使用成本非常低,直接使用廉价的PC就可以搭建。缺点就是一般一次访问请求要经过多次代理服务器,会增加网络延时。

软件负载

上图中上面两台是LVS,使用四层负载均衡,也就是在网络层利用IP地址进行地址转发。下面三台使用HAProxy进行七层负载,也就是可以根据访问用户的HTTP请求头来进行负载均衡,如可以根据不同的URL来将请求转发到特定机器或者根据用户的Cookie信息来指定访问的机器。当然这里的HAProxy也可以换成Nginx。

负载均衡算法

不同的负载均衡算法有不同的适用场景,具体选用哪个取决于您的实际需求:

  • Round Robin - 按请求顺序轮询,均匀分布。
  • 最小连接 - 那个Server的连接少,将请求路由到哪个Server。
  • IP Hash - 根据客户端请求的IP地址的Hash值来确定由哪个Server接收请求。

如何保存用户会话?

负载均衡器需要处理的一个重要问题是:如何保存用户会话?如果会话信息保存在后台服务器,用户接下来的请求可能会被分配到不同的后台服务器,此时用户会话就无法继续。负载均衡器可以缓存用户会话,然后将用户请求分发到不同的后台服务器。但是这将带来负载均衡器的负载问题。

  • 一个解决方案是将一个用户会话中的所有请求都发送到同一个后台服务器。这个方法的不足之处在于无法容错failover,如果后台服务器故障,它提供的会话就会无法获取,任何依赖于它的会话都会丢失。

  • 第二个方案是依据用户名,客户端IP来分配提供服务的服务器,也可以随机分配。但由于客户端的IP地址可能经常变换,这使得这个方案的服务质量无法保障。

  • 另外一个方案是将每一会话信息保存到一个数据库中。这个方案无疑会增加数据库的负载,所以这个方案对性能的提高并不好。不过,可以适用分布式的缓存代替数据库存储会话信息,提高性能。

  • 还一种更有效的方法,通常客户浏览器可以保存用户的每个会话信息。例如使用浏览器cookie,但这会带来一些列的安全问题。

小结

负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,理解并且学会负载均衡技术是一个架构师必学的课程。