文章目录

  • 1. 负载均衡
  • 2. 负载均衡算法
  • 2.1 轮询法
  • 2.2 随机法
  • 2.3 源地址哈希法
  • 2.4 加权轮询法
  • 2.5 加权随机法
  • 2.6 最小连接数法
  • 2.7 一致性哈希法
  • 2.7.1 一致性哈希法原理
  • 2.7.2 Hash环的数据倾斜问题
  • 3. 实现方式
  • 3.1 DNS 域名解析
  • 3.2 HTTP 重定向
  • 3.3 反向代理
  • 正向代理:
  • 3.4 链路层转发(直接路由)
  • 4. 分布式集群Session管理
  • 4.1 Sticky Session
  • 4.2 Session Replication
  • 4.3 Session Server


1. 负载均衡

集群中的应用服务器通常被设计为无状态,用户的请求可能抵达任意一个节点.负载均衡器的作用就是根据集群中每个节点的负载情况将用户请求转发到合适的节点上, 以避免单点压力过大的问题.

  1. 负载均衡器可实现集群高可用及伸缩性
    高可用:某个节点故障时,负载均衡器会将用户请求转发到其他节点,从而保证所有服务持续可用.
    伸缩性:根据系统整体负载情况,可以很容易地添加或移除节点。
  2. 负载均衡器工作过程:根据负载均衡算法得到转发的节点, 进行请求转发.

2. 负载均衡算法

2.1 轮询法

将请求按照顺序轮流分配至服务器, 不关心服务器的实际负载状况.

  • 适用于每台服务器性能都差不多的场景

2.2 随机法

通过系统随机算法, 随机选取一台服务器分配请求.

2.3 源地址哈希法

根据请求客户端的IP经过哈希函数计算得到一个值, 将其与服务器列表大小取模运算, 得到要访问的服务器的编号.

  • 可以保证同一 IP 的客户端请求会转发到同一台服务器上,用来实现会话粘滞(Sticky Session)

2.4 加权轮询法

加权轮询是在轮询的基础上根据服务器的性能差异为其赋予一定的权值, 性能高的服务器分配更高的权值,

2.5 加权随机法

按权重设置随机概率, 是随机法的加权实现.

2.6 最小连接数法

根据后端服务器当前的连接情况, 动态选取连接数最少的一台服务器处理当前请求,尽可能地提高后端服务的利用效率.

2.7 一致性哈希法

2.7.1 一致性哈希法原理

对 2^32 取模形成虚拟的圆环, 将各个服务器使用Hash函数进行计算, 具体可以选择服务器的IP或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置, 按顺时针方向组织.

  • 将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器.
2.7.2 Hash环的数据倾斜问题

一致性Hash算法在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题, 解决方案是采用虚拟节点机制:

  • 即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点.

3. 实现方式

从客户端请求最初发起, 到服务器最终处理请求, 整个请求传输的流程中从前至后可在多个环节实现请求的转发, 因此负载均衡的实现有多种方式. 通常一个请求的处理流程如下所示:

客户端发起请求-->DNS服务器解析域名-->HTTP请求传输-->目标服务器(反向代理转发)-->源服务器处理请求

3.1 DNS 域名解析

在 DNS 解析域名的同时使用负载均衡算法计算服务器 IP 地址,直接进行转发.

  • 优点:
    DNS 能够根据地理位置进行域名解析,返回离用户最近的服务器 IP 地址.
  • 缺点:
    由于 DNS 具有多级结构,每一级的域名记录都可能被缓存,当下线一台服务器需要修改 DNS 记录时,需要过很长一段时间才能生效.

3.2 HTTP 重定向

经过负载均衡算法计算得到服务器的 IP 地址之后,将该地址写入 HTTP 重定向报文中,状态码为 302. 客户端收到重定向报文之后,需要重新向服务器发起请求.

  • 缺点:
    由于每一个请求都要重定向一次, 这种方式效率不是很高,很少使用.

3.3 反向代理

反向代理是相对于正向代理的一种概念, 简单说反向代理就是为服务器端进行请求分发. 通常使用 Nginx 实现,为服务器端(指Tomcat)作负载均衡.(Ribbon 为 Consumer 作负载均衡,分发请求至Provider).

负载均衡测试用例 负载均衡算法实现_web


反向代理服务器位于源服务器前面, 用户请求需先经过反向代理服务器才能到达源服务器.反向代理可以用来进行缓存、日志记录等,同时也可以用来做为负载均衡服务器.

在这种负载均衡转发方式下,客户端不直接请求源服务器,因此源服务器不需要外部 IP 地址,而反向代理需要配置内部和外部两套 IP 地址.

  • 优点:
    与其它功能集成在一起, 部署简单.
  • 缺点:
    所有请求和响应都需要经过反向代理服务器, 可能成为性能瓶颈.
正向代理:

所谓正向代理,就是为客户端服务的代理. 例如有一台电脑 A 和电脑 B无法连接网络, 另一台电脑 C可以连接网络, 则 A B 将 C 作为桥接从而实现网络访问, 就是正向代理.

负载均衡测试用例 负载均衡算法实现_IP_02

3.4 链路层转发(直接路由)

在链路层根据负载均衡算法计算源服务器的 MAC 地址,并修改请求数据包的目的 MAC 地址直接进行转发.

  • 原理:
    通过配置源服务器的虚拟 IP 地址和负载均衡服务器的 IP 地址一致,从而不需要修改 IP 地址就可以进行转发.也正因为 IP 地址一样,所以源服务器的响应不需要转发回负载均衡服务器,可以直接转发给客户端,避免了负载均衡服务器的成为瓶颈.

4. 分布式集群Session管理

4.1 Sticky Session

需要配置负载均衡器, 使得同一个用户的所有请求都分发到同一个服务器, 这样就可以把用户 Session 存放在该服务器中.

  • 缺点:
    当服务器宕机时,将丢失该服务器上的所有 Session

4.2 Session Replication

每台服务器都有所有用户的 Session 信息, 在服务器之间进行 Session 同步操作保持数据一致性,这样用户可以向任何一台服务器进行请求.

  • 缺点:
    占用过多内存, 同步过程占用网络带宽以及服务器处理器时间

4.3 Session Server

使用专门的服务器存储 Session 数据, 将用户的会话信息单独进行存储, 从而保证应用服务器的无状态.
Spring框架下可使用 SpringSession(基于拦截器 Filter) 来实现使用 Redis 存储Session.

  • 缺点:
    需实现去 Session 服务器存取 Session的操作, 通过网络进行会有网络状况不佳导致失败的风险