负载均衡

Created at 2020-03-23 Updated at 2020-07-29 Category 系统设计 Tag 负载均衡

负载均衡会把用户发送的访问请求分发到任意一台服务器上处理,当其中一台服务器宕机时,负载均衡服务器通过心跳检测机制发现该服务失去响应,就是把它从服务器列表中删除,而将请求发送到其他服务器上。

负载均衡的实现技术

HTTP 重定向

HTTP 重定向服务器就是一台普通的应用服务器,其唯一功能就是根据用户的 HTTP 请求计算一台真是的 Web 服务器地址,并将该 Web 服务器地址写入 HTTP 重定向响应( 302)中返回给用户浏览器。

  • 优点:实现比较简单
  • 缺点:是浏览器需要请求两次服务器才能完成一次访问,性能较差。

DNS 域名解析

在 DNS 服务器中配置多个 A 记录,每次域名解析请求都会根据负载均衡算法计算一个不同的 IP 地址返回。这样 A 记录中配置的多个服务器就会构成一个集群,并实现负载均衡。

  • 优点:是将负载均衡的工作转交给 DNS,同时许多 NDS 还支持基于地理位置的域名解析,会将域名解析成距离用户地理最近的一个服务器,加快用户访问速度。
  • 缺点:DNS 是多级解析,每一级 DNS 都可能缓存 A 记录,当下线某台服务器修改了 A 记录后,使其生效也需要较长时间,这段时间 DNS 依然会将域名解析到已经下线的服务器,导致用户访问失败。

反向代理

反向代理服务器将请求根据负载均衡算法转发到不同 Web 服务器上。Web 服务器处理完成的响应也需要反向代理服务器返回给用户,由于 Web 服务器不直接对外提供访问,因此需不要使用外部 IP 地址,而反向代理服务器需要配置内外网 IP。

反向代理服务器转发请求在 HTTP 协议层面,因此也叫应用层负载均衡。

  • 优点:和反向代理服务器功能集成在一起,部署简单。
  • 缺点:反向代理服务器是所有请求和相应的中转站,其性能可能会成为瓶颈。

IP 负载均衡

网络层通过修改请求目标地址进行负载均衡。

  • 优点:在内核进程内完成数据分发,较反向代理有更好的处理性能。
  • 缺点:集群的最大响应数据吞吐量受限于负载均衡服务器网卡带宽。

直接路由

是指在通信协议的数据链路层修改 mac 地址进行负载均衡,这种传输方式又称三角传输模式。实际请求的正是物理服务器 IP 和数据请求目的 IP 一致,不需要通过负载均衡服务器进行地址转换。

这种三角传输模式的链路层负载均衡是目前大型网站使用最广的一种负载均衡手段。在 Linux 平台上最好的链路层负载均衡开源产品是 LVS(Linux Virtual Server)。

  • 优点:避免负载均衡服务器网卡带宽称为瓶颈。

负载均衡算法

轮询( Round Robin,RR)

所有请求被依次分发到每台应用服务器上,即每台服务器需要处理的请求数目都相同,适合于所有服务器硬件都相同的场景。

随机( Random)

请求被随机分配到各个应用服务器。如果应用服务器硬件配置不同,也可以使用加权随机算法。

最少连接( Least Connections)

记录每个应用服务器正在处理的连接数,将新的请求分发到最少链接的服务器上。最少连接算法也可以实现加权最少连接。

源地址散列( Source Hashing)

根据请求来源的 IP 地址进行 Hash 计算,得到应用服务器。

优点:这样来自同一个 IP 地址的请求总在同一个服务器上处理,该请求的上下文信息可以存储在这台服务器上,在一个会话周期重复使用,从而实现会话粘滞。

缺点:一旦有服务器上线、下线,那么通过源地址哈希路由到的服务器是之前的概率非常低,如果是 session 则取不到 session,如果是缓存则可能引发缓存雪崩。

一致性哈希(ConsistentHash)

一致性哈希是为了克服传统哈希分布在服务器节点数量变化时大量数据迁移的问题,在移除/添加操作。它能够尽可能小的改变已经存在 key 映射关系。

先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将缓存服务器节点放置在这个Hash环上,然后根据需要缓存的数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),然后在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。集群中缓存服务器节点越多,增加节点带来的影响越小

虚拟节点

当节点数量少的时候,节点分布并不均匀,这时需要引入虚拟节点机制。

增加虚拟节点,然后将虚拟节点映射到真实节点上。虚拟节点的数量比真实节点来得多,那么虚拟节点在哈希环上分布的均匀性就会比原来的真实节点好,从而使得数据分布也更加均匀。

LVS 原理

LVS 通过工作于内核的 ipvs 模块来实现功能,其主要工作于 netfilter 的 INPUT 链上。而用户需要对 ipvs 进行操作配置则需要使用 ipvsadm 这个工具。ipvsadm 主要用于设置 lvs 模型、调度方式以及指定后端主机。

相关术语

  • DS(Director Server):指的是前端负载均衡器节点

  • RS(Real Server):后端真实的工作服务器

  • VIP(Director Virtual IP):向外部直接面向用户请求,作为用户请求的目标的IP地址

  • DIP(Director Server IP):主要用于和内部主机通讯的IP地址

  • RIP(Real Server IP):后端服务器的IP地址

  • CIP(Client IP):访问客户端的IP地址

    LVS 集群分为三层结构

  • 负载调度器(Load Blancer):是整个 LVS 集群对外的前端机器,负责接收 client 的请求发送到一组服务器【多台 LB IP】上执行,而 client 则认为返回来是同一个 IP(通常把这个 IP 成为虚拟 IP 或 VIP)

  • 服务器池(server pool):一组真正执行clinet请求的服务器,一般是web服务器;除了web,还有FTP、MAIL、DNS等

  • 共享存储(shared stord):它为server pool提供了一个共享的存储区,很容易让服务器池拥有相同的内容,提供相同的服务

LVS 有三种工作模式:

DR

NAT

优点:

  • 支持端口映射
  • RS 可以使用任意操作系统
  • 节省公有 IP 地址

缺点:请求和响应报文都要经过 Director 转发,负载高时 Director 可能成为系统瓶颈。

TUN

参考

Site by Cellophane using Hexo & Random

Hide