内容简介
- 什么是负载均衡
- 负载均衡相关算法
- 常用的负载均衡技术
- 负载均衡中源地址问题分析
什么是负载均衡:load balance
- 简而言之,就是将工作分发到不同的处理者
- 目的
- 优化资源使用
- load balance有多种算法,可以调配工作的分发逻辑
- 最大化吞吐量(throughput)
- scale out,在同一段时间内,多个处理者明显可以处理更多的请求
- 减少相应时间
- 防止请求过多导致工作堆积
- 避免单点过载
- 显而易见
- 增加系统稳定性和可用性
- 观察到某个处理者fail之后,避免后续再分配工作给他
- 优化资源使用
- 所以,一个完整的负载均衡实例,应该包含一个balancer(请求接受者)和若干个server(我们称为后端服务器),balancer接收用户请求,并根据一定的算法,将请求转发给backend server,同时balancer应观察backend server的状态,及时将无法提供服务的backend server剔除出处理队伍
- 通过“接收请求”、“转发”等词语可以看出,负载均衡是一个“传输”技术
负载均衡相关算法
- 上文中提到“根据一定的算法,将请求转发”,那么到底些什么样的算法呢?以下以阿里云SLB为例,介绍其中提到的集中算法
RR(round robin)
- 最简单的轮训,将到来的请求依次、平均的分发至后端服务器
WRR(weight round robin)
- 即通过配置后端服务器的权重,并根据权重来分发请求
- 其实就是根据权重占比,占比高的后端服务器将被分配更多的请求
WLC(weighted least connection)
- 与WRR类似,但是使用当前后端服务器的active的连接作为权重
其他算法
- 如果我们直接视客户端为balancer(是的,可以这么想),那么我们可以有client random load balancing,即客户端随机请求后端服务器中的一台
- Persistence (stickiness)
- 即保证:根据一定的策略(如客户端ip)每次请求都将被转发到统一台后端服务器上
- RR、WRR算法中,balancer其实不用关注后端服务器的状态,而只根据自身的数据将请求分发即可,WLC中,balancer开始需要了解后端服务器状态(比如连接数)。实际上我们也可以根据当前后端服务器的负载(load)来转发请求,当然这需要后端服务器与balancer建立通讯
常用的负载均衡技术
- 上文中提到,负载均衡是一个“传输”技术。根据OSI七层模型,我们也可以将负载均衡技术进行分类
layer 4 load balancer
layer 7 load balancer
- 工作在应用层上
- 典型应用(技术or软件): HAProxy、Nginx
- Nginx
硬件负载均衡技术
- 即通过物理设备的方式进行负载均衡
- 典型产品: F5
- 没有接触过此类产品,还并不了解相应具体的型号、操作方式
- 但是其实是通过硬件来执行layer 4 load balancer
负载均衡中源地址问题分析
- 在上文中我们不停的提到“转发”的概念,那么其中的“转发”涉及什么技术呢?转发过程中源、目的地址又是如何变化的呢?
7层转发(以nginx为例)
- nginx提供对http协议的转发功能
- 在http协议中,我们通过X-Forwarded-For这样的header来获取客户端真正的ip地址
- 注意X-Forwarded-For并不是一个标准的http header
- X-Forwarded-For可以记录多个proxy的ip:
- X-Forwarded-For: client, proxy1, proxy2
- 每经过一次转发,转发服务器都应该在X-Forwarded-For后加入被转发的ip
- 所以后端服务器在通过nginx转发的http请求时可以通过“X-Forwarded-For”的字段来得到“源”地址
- 问题在应用层被解决
4层转发
- 棘手的是在4层转发中,我们可能需要对IP/TCP包进行修改,进而导致后端服务器无法得到客户端的真实ip
- 具体实现仍在调研中,后续将结合LVS进行讲解