一.负载均衡(load balance)是什么
负载均衡:就是任务平均分配。
任务具体而言是:请求的处理。数据存储的分配。
目的:均分任务,减少个体压力;个体出错,他人顶替。
常见互联网分布式架构如下图,分为客户端层、反向代理nginx层、站点层、服务层、数据层。因此相邻两层间就涉及负载均衡问题。从图上看,负载均衡实现的是:相邻的两层,上层能均匀的"调用"下层。
二.不同层次负载均衡的实现
- 客户端层->反向代理层的负载均衡
实现方式:“DNS轮询”。客户端的请求首先需要域名解析。DNS服务器以相同概率把域名解析成一组IP,这些IP就是nginx的外网IP.
补充知识
用户通过浏览器访问一个网址(域名)www.apsapp.com,会先向DNS服务器请求域名解析,DNS服务器返回IP地址,用户通过此IP地址访问服务器。由于DNS服务器可以把同一个网址解析成不同的ip(对应服务器集群),那么DNS服务器将同一域名轮流的解析成不同的IP,就可以实现负载均衡。
- 反向代理层->站点层
实现方式:编辑nginx的配置文件(nginx.conf)。列举几种负载均衡策略:
- 请求轮询:类似DNS轮询。请求依次路由到个web服务器。
- 最少连接路由:路由到连接最少的web服务器上
- ip哈希:按照访问用户的ip哈希值来路由web-server,只要用户的ip分布是均匀的,请求理论上也是均匀的,ip哈希均衡方法可以做到,同一个用户的请求固定落到同一台web-server上,此策略适合有状态服务,例如session(不建议)
-
站点层->服务层
实现方式:服务连接池。
上游连接池会建立与下游服务多个连接,每次请求会“随机”选取连接来访问下游服务。 -
数据层的负载均衡------包含数据,请求的均衡(数据的水平切分)。
-
数据的均衡是指:水平切分后的每个服务(database,cache),数据量是差不多的。
-
请求的均衡是指:水平切分后的每个服务(database,cache),请求量是差不多的。
水平切分方式有:- 按范围水平切分
每一个数据服务,存储一定范围的数据,上图为例:
user0服务,存储uid范围1-1kw
user1服务,存储uid范围1kw-2kw
优点:简单,数据均衡性好,容易扩展(添加uid方便)
缺点:请求的负载不一定均衡,一般来说,新注册的用户会比老用户更活跃,大范围的服务请求压力会更大 - 按id哈希水平切分
每一个数据服务,存储某个key值hash后的部分数据,上图为例:
user0服务,存储偶数uid数据
user1服务,存储奇数uid数据
优:请求均匀性好。
缺:不容易扩展,扩展一个数据服务,hash方法改变时候,可能需要进行数据迁移
- 按范围水平切分
三.实现负载均衡的策略
- 均匀派发(Even Task Distribution Scheme)
负载均衡器均匀的派发任务给服务器。分为随机派发或者轮流派发(Round Robin),DNS域名解析使用的是轮流派发。(这假设服务器处理能力一样) - 加权派发(Weighted Task Distribution Scheme)
服务器处理能力不同,给能力强的权重大点,就相应的多分配任务。 - 粘滞会话(Sticky Session Scheme)
在实际中,后面的任务处理常常会依赖于前面的任务。例如,对于同一个登录的用户的请求,用户购买的请求依赖于用户登录的请求,如果用户的登录信息保存在进程1中,那么,如果购买请求被分派到进程2或者进程3,那么购买请求将不能正确处理。这种请求间的依赖关系也称为粘滞会话(Sticky Session)
此策略把属于同一个会话的任务将会被分派到同一个进程中 - 均匀任务队列派发Even Size Task Queue Distribution Scheme)
类似加权派发策略。先为每个服务器设以任务队列,负载均衡器开始派相同的任务量。后面处理能力强的就多派任务。 - 单一队列(Autonomous Queue Scheme)
无负载均衡器存在。服务器从唯一的一个队列领任务,处理能力强的领任务的速度也块。
参考文章:
1.https://blog.csdn.net/lihao21/article/details/53900447
2.https://www.oschina.net/news/77156/load-balance