理解和掌握负载均衡原理

摘要:负载均衡将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性;简单说就是把过于繁重的工作分派给其它服务器,最大化提高速度;

什么是负载均衡?

维基百科:负载平衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软件和硬件来完成。 主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题。


一般中小型应用的站点服务层和服务层是在同一个服务器上,也就是站点包括了全部的服务。

客户端 -> 反向代理

客户端通过域名访问网络时首先要把域名(例如:www.xiaolaiwo.com)转换为IP地址(42.96.170.181),再请求服务端的IP获取服务。域名本身只是一个存储的文本记录,对照了域名和IP的关系。

IP地址全名叫互联网协议地址(Internet Protocol Address),它为互联网上的每一个网络和每一台主机分配一个逻辑地址,IP地址就是互联网中的门牌号,要找哪个互联网服务只要有IP地址就可以找到。由于IP地址是一串很长的数字不方便记忆和传播,于是发明了域名。

解释了IP和域名后,再来说说DNS。DNS就是把域名转换IP的物联网服务,例如本博客的域名是www.xiaolaiwo.com那么DNS服务器返回了42.96.170.181的IP地址,网页就去IP地址为42.96.170.181的服务器上获取博客网站的内容。

当一个域名在DNS服务器上有两个以上的IP地址时,就可以实现不同的人访问域名是的IP不同,最终服务器也不同。

DNS的负载均衡主要用于不同地域的人访问域名时DNS自动匹配到离用户最近的服务器,提高网络效率。比如:有服务器A放在北京,服务器B放在香港,当用户在北京访问时DNS自动分配了北京的服务器IP,当用户在香港时访问香港的服务器。

反向代理 -> 站点服务器

反向代理一般是指Nginx服务器,一般有以下几种策略:

  1. 请求轮询:和DNS轮询类似,请求依次路由分配到每个站点服务器;
  2. 最少连接路由:哪个站点服务器的连接少就路由分配到哪个站点服务器;
  3. ip哈希:按照访问用户的ip哈希值来路由站点服务器,只要用户的ip分布是均匀的,请求理论上也是均匀的,ip哈希均衡方法可以做到,同一个用户的请求固定落到同一台站点服务器上,此策略适合有状态服务,例如session;

那么反向代理的主要功能就是让每一个站点服务器的请求平均或稳定:

  • 不产生一部分站点服务器的资源已经被耗尽而一部分站点服务器的资源是完全空闲的
  • 不同区域的用户访问不同的区域的站点(与DNS的负载均衡类似)
  • 方便服务器的扩容和容错(故障转移):增加站点服务器时反向代理能够自动把用户分配到新的站点服务器降低其它服务器的负载;某个站点服务器故障或维护时反向代理自动跳过原来转发到服务器上的请求,不发生服务中断的风险。

反向代理的最大问题是如何处理有状态的服务,比如用户已经是登录的状态,当反向代理策略发生变化时如何保证用户的登录状态不会被改变。处理此问题有多种方法,自行Google

站点服务器 -> 服务 

当一个站点内包含多种服务,例如站点本身是管理后台,但是包含了交易清算服务、报表生成服务而且这些服务也同时有多个服务器时也需要实现对服务的负载均衡。

站点服务器 -> 数据库

在数据量很大时,由于数据层(db/cache)涉及数据的水平切分,所以数据层的负载均衡更为复杂一些,它分为“数据的均衡”,与“请求的均衡”。

  • 数据的均衡是指:水平切分后的每个服务(db/cache),数据量是均匀的;比如:让DB1保存1-100W的数据,DB2保存100W-200W的数据。
  • 请求的均衡是指:水平切分后的每个服务(db/cache),请求量是均匀的;比如:让DB1保存ID时基数的数据(1,3,5,7,9),DB2保存偶数的数据。

负载均衡就要根据请求的用户信息判断到哪个DB查询或写入数据。

一般要使用数据库分表分库的负载均衡前先要考虑数据库读写分离的优化,如果读写分离能够满足现在的数据压力时,先去做读写分离的优化。