概念
负载均衡:将用户请求分摊到不同的服务器上处理,以提高系统整体的并发处理能力以及可靠性。
分类
服务端负载均衡
服务端负载均衡 主要应用在 系统外部请求 和 网关层 之间,可以使用 软件 或者 硬件 实现。
硬件负载均衡 通过专门的硬件设备(比如 F5)实现负载均衡功能,性能高,成本也高,一般接触不到。
软件负载均衡通过软件(比如 LVS、Nginx )实现负载均衡功能,性能虽然差一些,但便宜。
根据 OSI 模型,服务端负载均衡根据工作在OSI第几层分为还可以分为:二(链路)、三(网络)、四(传输)、七(应用)层负载均衡
最常见的是四层和七层负载均衡
四层负载均衡 工作传输层,核心就是 IP+端口层面的负载均衡,不涉及具体的报文内容。
- 性能更高(现在的硬件性能足够,这个优势差距不大了)
- 通常使用LVS(Linux Virtual Server 虚拟服务器, Linux 内核的 4 层负载均衡)
七层负载均衡 工作应用层,会读取报文的数据部分(比如说我们的 HTTP 部分的报文),然后根据读取到的数据内容(如 URL、Cookie)做出负载均衡决策。执行第七层负载均衡的设备通常被称为 反向代理服务器 。
- 更佳灵活,功能更强。可以根据请求的内容进行优化如缓存、压缩、加密。
- 通常使用Nginx
客户端负载均衡
客户端负载均衡 主要应用于系统内部的不同的服务之间,可以使用现成的负载均衡组件来实现。
客户端会自己维护一份服务器的地址列表,发送请求之前,客户端会根据对应的负载均衡算法来选择具体某一台服务器处理请求。
客户端负载均衡器和服务运行在同一个进程或者说 Java 程序里,不存在额外的网络开销。不过,客户端负载均衡的实现会受到编程语言的限制,比如说 Spring Cloud Load Balancer 就只能用于 Java 语言。
负载均衡常见的算法有哪些?
随机法
随机法 :最简单的算法,可以配置权重设置不同的概率,可能出现部分机器在一段时间之内无法被随机到。
轮询法
轮询法:挨个轮询服务器处理,也可以设置权重。
在加权轮询的基础上,还有进一步改进得到的负载均衡算法,比如平滑的加权轮训算法。https://github.com/phusion/nginx/commit/27e94984486058d73157038f7950a0a36ecc6e35。
哈希法
将请求的参数信息通过哈希函数转换成一个哈希值,然后根据哈希值来决定请求被哪一台服务器处理。
在服务器数量不变的情况下,相同参数的请求总是发到同一台服务器处理,比如同个 IP 的请求、同一个用户的请求。
如果机器数量变化,需要进行较多数据的迁移
一致性 Hash 法
一致性 Hash 法也可以让相同参数的请求总是发到同一台服务器处理。核心思想是将数据和节点都映射到一个哈希环上,然后根据哈希值的顺序来确定数据属于哪个节点。
当服务器增加或删除时,只影响该服务器的哈希,而不会导致整个服务集群的哈希键值重新分布。
七层负载均衡可以怎么做?
DNS 解析
- 在 DNS 服务器中为同一个主机记录配置多个 IP 地址,这些 IP 地址对应不同的服务器。当用户请求域名的时候,DNS 服务器采用轮询算法返回 IP 地址,这样就实现了轮询版负载均衡。
- 现在的DNS解析基本都可以进行权重配置
反向代理
- 客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外暴露的是反向代理服务器地址,隐藏了真实服务器 IP 地址。反向代理“代理”的是目标服务器,这一个过程对于客户端而言是透明的。
- Nginx 就是最常用的反向代理服务器,它可以将接收到的客户端请求以一定的规则(负载均衡策略)均匀地分配到这个服务器集群中所有的服务器上。
HTTP重定向
- 使用较少
客户端负载均衡通常是怎么做的?
Netflix Ribbon
Spring Cloud Load Balancer
Spring Cloud Alibaba
