适用于 SUSE Linux Enterprise High Availability Extension 12 SP5

14 负载平衡

摘要

负载平衡的情况下,服务器群集对于外部客户端而言就如同是一台大型的快速服务器。这种看上去像是单台服务器的服务器被称为虚拟服务器。它包括一个或多个用于调度进来的请求的负载平衡器,以及若干台运行实际服务的真实服务器。完成 High Availability Extension 的负载平衡设置后,您就可以构建高度可缩放且高度可用的网络服务,例如 Web、超速缓存、邮件、FTP、媒体和 VoIP 服务。

14.1 概念概述

High Availability Extension 支持两种负载平衡技术:Linux 虚拟服务器 (LVS) 和 HAProxy。两者的主要差别在于,Linux 虚拟服务器在 OSI 第 4 层(传输层)上运行,可配置内核的网络层,而 HAProxy 在第 7 层(应用层)上的用户空间中运行。因此,Linux 虚拟服务器所需的资源更少但处理的负载更多,而 HAProxy 可以检查流量,执行 SSL 终止,并根据流量内容做出调度决策。

另一方面,Linux 虚拟服务器包含两个不同的软件:IPVS(IP 虚拟服务器)和 KTCPVS(内核 TCP 虚拟服务器)。IPVS 提供第 4 层负载平衡,而 KTCPVS 提供第 7 层负载平衡。

本章概述了负载平衡与高可用性结合使用的概念,然后简要介绍了 Linux 虚拟服务器和 HAProxy。最后,提供了其他阅读材料的链接。

真实的服务器和负载平衡器可通过高速 LAN 或地理位置分散的 WAN 互相连接。负载平衡器可将请求发送到不同的服务器。它们使群集的多个并行服务看似单个 IP 地址(虚拟 IP 地址,即 VIP)上的一个虚拟服务。发送请求时可使用 IP 负载平衡技术或应用程序级的负载平衡技术。系统的可伸缩性通过在群集中透明地添加或删除节点来实现。

高可用性通过检测节点或服务故障并相应地照常重配置整个虚拟服务器系统来实现。

有多种负载平衡策略。下面介绍适用于 Linux 虚拟服务器的一些第 4 层策略:

  • 循环复用:  最简单的策略就是将每个连接轮流定向到不同的地址。例如,某个 DNS 服务器的多个条目可能与某个给定主机名对应。使用 DNS 循环复用时,该 DNS 服务器将轮流返回所有这些条目。因此,不同的客户端将看到不同的地址。

  • 选择最佳服务器:  可以使用第一台做出响应的服务器负载最低的服务器方法实现平衡,不过此方案存在一些弱点。

  • 平衡每台服务器的连接数:  用户与服务器之间的负载平衡器可以在多台服务器之间划分用户数。

  • Geo 位置:  可以将客户端定向到附近的服务器。

下面介绍适用于 HAProxy 的一些第 7 层策略:

  • URI:  检查 HTTP 内容并将流量发送到最适合此特定 URL 的服务器。

  • URL 参数,RDP Cookie:  检查会话参数的 HTTP 内容(可能在 post 参数中,或者 RDP(远程桌面协议)会话 Cookie 中),并将流量发送到为此会话提供服务的服务器。

尽管存在一些重叠的情况,但在 LVS/ipvsadm 不足以满足要求的情况下,可以使用 HAProxy,反之亦然:

  • SSL 终止:  前端负载平衡器可以处理 SSL 层。因此,云节点不需要访问 SSL 密钥,而可以利用负载平衡器中的 SSL 加速器。

  • 应用级别:  HAProxy 在应用级别运行,因此,负载平衡决策受内容流的影响。这样,便可以基于 Cookie 和其他此类过滤器实现持久性。

另一方面,HAProxy 不能完全取代 LVS/ipvsadm

  • LVS 支持直接路由,在此模式下,负载平衡器只作用于入站流,而出站流量将直接路由到客户端。在非对称环境中,这有可能会大幅提高吞吐量。

  • LVS 支持状态连接表复制(通过 conntrackd)。因此,负载平衡器能够实现对客户端和服务器透明的故障转移。

14.2 使用 Linux 虚拟服务器配置负载平衡

以下部分概述了 LVS 主要组件和概念。然后,将介绍如何在 High Availability Extension 上设置 Linux 虚拟服务器。

14.2.1 定向器

LVS 的主要组件是 ip_vs(也称 IPVS)内核代码。它在 Linux 内核(第 4 层交换)中实施传输层负载平衡。运行包含 IPVS 代码的 Linux 内核的节点称为定向器。控制器上运行的 IPVS 代码是 LVS 的基本功能。

当客户端连接到定向器时,进来的请求在所有群集节点间是负载平衡的:定向器使用一组能使 LVS 正常工作的修改过的路由规则,将包转发到真实服务器。例如,连接不会在定向器上发起或终止,它也不会发送确认。定向器相当于将包从最终用户转发到真实服务器(运行用于处理请求的应用程序的主机)的专用路由器。

默认情况下,内核不需要安装 IPVS 模块。IPVS 内核模块包含在 kernel-default 包中。

14.2.2 用户空间控制器和守护程序

ldirectord 守护程序是一个用户空间守护程序,用于在 LVS 负载平衡虚拟服务器群集中管理 Linux 虚拟服务器并监视真实的服务器。配置文件 /etc/ha.d/ldirectord.cf 指定虚拟服务及其关联的真实服务器,并告知 ldirecord 如何将此服务器配置为 LVS 重定向器。守护程序初始化时,将为群集创建虚拟服务。

ldirectord 守护程序通过定期请求已知的 URL 并检查响应来监视真实服务器的运行状况。如果真实服务器发生故障,将从负载平衡器的可用服务器列表中删除它。如果服务监视程序检测到发生故障的服务器已恢复并重新运行,则它会将此服务器重新添加到可用服务器列表中。如果出现所有真实服务器关闭的情况,则可以指定一台将 Web 服务重定向到的回退服务器。备用服务器通常是本地主机,它会显示一个应急页面,说明 Web 服务暂时不可用。

ldirectord 使用 ipvsadm 工具(包 ipvsadm)来操作 Linux 内核的虚拟服务器表。

14.2.3 包的转发

定向器可采用三种不同方法将包从客户端发送到真实服务器:

网络地址转换 (NAT)

进来的请求到达虚拟 IP,然后通过将目标 IP 地址和端口更改为所选真实服务器的 IP 地址和端口将进来的请求转发到真实服务器。真实服务器向负载平衡器发送响应,负载平衡器再更改目标 IP 地址并将响应发回客户端。因此,最终用户就能从预期的源收到回复了。由于所有通讯都要流经负载平衡器,它通常会成为群集的瓶颈。

IP 隧道通讯进程(IP-IP 封装)

IP 隧道通讯进程允许将发送到某个 IP 地址的包重定向到可能处于其他网络上的另一个地址。LVS 通过 IP 隧道(重定向到其他 IP 地址)向真实服务器发送请求,然后真实服务器使用自己的路由选择表直接回复到客户端。群集成员可以处于不同的子网中。

直接路由选择

来自最终用户的包将直接转发到真实服务器。IP 包未经修改,因此必须配置真实服务器以接受虚拟服务器 IP 地址的通讯。来自真实服务器的响应会直接发送到客户端。真实服务器和负载平衡器需处于同一物理网络段中。

14.2.4 调度算法

确定将哪台真实服务器用于客户端请求的新连接,是使用不同算法来实现的。这些算法以模块的形式提供,可进行调整以适应特定需要。有关可用模块的概述,请参见 ipvsadm(8) 手册页。从客户端接收到连接请求时,控制器会根据日程表将一台真实的服务器指派给此客户端。调度程序是 IPVS 内核代码中的一部分,它决定哪台真实的服务器将获取下一个新连接。

有关 Linux 虚拟服务器调度算法的更详细说明,请访问 http://kb.linuxvirtualserver.org/wiki/IPVS。此外,还可以在 ipvsadm 手册页中搜索 --scheduler

可以在 http://www.haproxy.org/download/1.6/doc/configuration.txt 上找到 HAProxy 的相关负载平衡策略。

14.2.5 使用 YaST 设置 IP 负载平衡

可使用 YaST IP 负载平衡模块配置基于内核的 IP 负载平衡。它是 ldirectord 的前端。

要访问“IP 负载平衡”对话框,请以 root 用户身份启动 YaST 并选择 High Availability ›  IP 负载平衡。或者,以 root 用户身份使用 yast2 iplb 从命令行启动 YaST 群集模块。

YaST 模块会将其配置写入 /etc/ha.d/ldirectord.cf。YaST 模块中的可用选项卡对应于 /etc/ha.d/ldirectord.cf 配置文件的结构,此配置文件用于定义全局选项和虚拟服务的选项。

有关配置示例以及负载平衡器和真实服务器之间产生的进程,请参见例 14.1 “简单的 ldirectord 配置”

注意
注意:全局参数和虚拟服务器参数

如果在虚拟服务器部分和全局部分都指定了某个参数,那么在虚拟服务器部分中定义的值将覆盖在全局部分中定义的值。

过程 14.1︰ 配置全局参数

以下过程描述了如何配置最重要的全局参数。有关个别参数(以及此处未提及的参数)的更多细节,请单击帮助或参见 ldirectord 手册页。

  1. 通过检查间隔定义 ldirectord 连接到每台真实服务器以检查它们是否仍处于联机状态的间隔。

  2. 通过检查超时设置真实服务器应该在多长时间内响应上次检查。

  3. 通过失败计数定义在检查被视为失败前 ldirectord 可尝试向真实服务器发送多少次请求。

  4. 通过协商超时定义协商检查经过多少秒后应视为超时。

  5. 回退中,输入当所有真实服务器都停机时,要将 Web 服务重定向到的 Web 服务器的主机名或 IP 地址。

  6. 如果希望系统在任何真实服务器的连接状态发生改变时均发送警报,请在电子邮件警报中输入有效的电子邮件地址。

  7. 通过电子邮件警报频率定义经过多少秒后,如果任何真实服务器仍无法访问,应重复发出电子邮件警报。

  8. 电子邮件警报状态中指定应发送电子邮件警报的服务器状态。如果要定义多个状态,请使用逗号分隔的列表。

  9. 通过自动重新装载定义 ldirectord 是否应连续监视配置文件有无修改。如果设置为 yes,则将在发生更改时自动重新装载配置。

  10. 通过 Quiescent 开关定义是否应从内核的 LVS 表中去除发生故障的真实服务器。如果设置为,则不会删除发生故障的服务器。而是将其权重设置为 0,表示不接受新连接。已建立的连接将继续存在,直到超时为止。

  11. 要使用其他路径进行日志记录,请在日志文件中指定日志文件的路径。默认情况下,ldirectord 会将其日志文件写入 /var/log/ldirectord.log

YaST IP 负载平衡 - 全局参数
图 14.1︰ YaST IP 负载平衡 - 全局参数
过程 14.2︰ 配置虚拟服务

可通过为每种虚拟服务定义若干参数来配置一个或多个虚拟服务。以下过程描述了如何配置虚拟服务最重要的参数。有关个别参数(以及此处未提及的参数)的更多细节,请单击帮助或参见 ldirectord 手册页。

  1. 在 YaST IP 负载平衡模块中,切换到虚拟服务器配置选项卡。

  2. 添加新虚拟服务器或编辑现有虚拟服务器。一个新对话框将显示可用选项。

  3. 虚拟服务器中,输入负载平衡器和真实服务器可作为 LVS 访问的共享虚拟 IP 地址(IPv4 或 IPv6)和端口。还可以指定主机名和服务来代替 IP 地址和端口号。或者,也可以使用防火墙标记。防火墙标记是一种将任意 VIP:port 服务的集合聚合到一个虚拟服务中的方法。

  4. 要指定真实服务器,需要输入服务器的 IP 地址(IPv4、IPv6 或主机名)、端口(或服务名称)以及转发方法。转发方法必须是 gateipipmasq 中的一种,请参见第 14.2.3 节 “包的转发”

    单击添加按钮,为每台真实服务器输入需要的自变量。

  5. 检查类型中选择用于测试真实服务器是否仍然活动的检查类型。例如,要发送请求并检查响应是否包含预期的字符串,请选择 Negotiate

  6. 如果已将检查类型设置为 Negotiate,则还需定义要监视的服务类型。从服务下拉框中进行选择。

  7. 请求中输入检查间隔期间每台真实服务器上所请求对象的 URI。

  8. 如果要检查来自真实服务器的响应是否包含特定字符串(例如I am alive讯息),请定义需要匹配的正则表达式。将正则表达式输入到接收中。如果来自真实服务器的响应包含此表达式,则认为真实服务器处于活动状态。

  9. 根据您在步骤 6 中选定的服务类型,您还必须为身份验证指定更多参数。切换到授权类型选项卡,输入登录口令数据库机密等详细信息。有关更多信息,请参见 YaST 帮助文本或 ldirectord 手册页。

  10. 切换至其他选项卡。

  11. 选择用于负载平衡的调度程序。有关可用调度程序的信息,请参见 ipvsadm(8) 手册页。

  12. 选择要使用的协议。如果将虚拟服务指定为 IP 地址和端口,则它必须是 tcpudp。如果将虚拟服务指定为防火墙标记,则协议必须是 fwm

  13. 如果需要,可定义其他参数。单击确定确认配置。YaST 会将此配置写入 /etc/ha.d/ldirectord.cf

YaST IP 负载平衡 - 虚拟服务
图 14.2︰ YaST IP 负载平衡 - 虚拟服务
例 14.1︰ 简单的 ldirectord 配置

图 14.1 “YaST IP 负载平衡 - 全局参数”图 14.2 “YaST IP 负载平衡 - 虚拟服务”中所示的值将生成在 /etc/ha.d/ldirectord.cf 中定义的以下配置:

autoreload = yes 1
    checkinterval = 5 2
    checktimeout = 3 3
    quiescent = yes 4
    virtual = 192.168.0.200:80 5
    checktype = negotiate 6
    fallback = 127.0.0.1:80 7
    protocol = tcp 8
    real = 192.168.0.110:80 gate 9
    real = 192.168.0.120:80 gate 9
    receive = "still alive" 10
    request = "test.html" 11
    scheduler = wlc 12
    service = http 13

1

定义 ldirectord 应连续检查配置文件有无修改。

2

ldirectord 连接到每台真实服务器以检查它们是否仍处于联机状态的间隔。

3

真实服务器必须在上次检查后多长时间内作出响应。

4

定义不要从内核的 LVS 表中删除发生故障的真实服务器,而是将其权重设置为 0

5

LVS 的虚拟 IP 地址 (VIP)。可通过端口 80 访问 LVS。

6

用于测试真实服务器是否仍处于活动状态的检查类型。

7

此服务的所有真实服务器都宕机时,要将 Web 服务重定向到的服务器。

8

要使用的协议。

9

定义了两台真实服务器,均可通过端口 80 访问。包的转发方法是 gate,表示使用直接路由选择。

10

需要在真实服务器的响应字符串中匹配的正则表达式。

11

检查间隔期间每台真实服务器上所请求对象的 URI。

12

用于负载平衡的所选调度程序。

13

要监视的服务类型。

此配置将导致以下进程流:ldirectord 每 5 秒连接一次每台真实服务器 (2),并按 911 中指定的方式请求 192.168.0.110:80/test.html192.168.0.120:80/test.html。如果上次检查后 3 秒内 (3) 未收到来自真实服务器的预期的 still alive 字符串 (10),它会将此真实服务器从可用池中删除。但是,由于 quiescent=yes 设置 (4),真实服务器不会从 LVS 表中去除。其权重将设置为 0,这样就不会接受到此真实服务器的新连接请求。已建立的连接将继续存在,直到超时为止。

14.2.6 其他设置

除了使用 YaST 配置 ldirectord 外,还需要确保满足以下条件,才能完成 LVS 设置:

  • 正确设置真实服务器以提供所需服务。

  • 负载平衡服务器(或服务器)必须能够使用 IP 转发将通讯路由到真实服务器。真实服务器的网络配置取决于选择的包转发方法。

  • 为避免负载平衡服务器(或服务器)成为整个系统的单个故障点,需要设置负载平衡器的一个或多个备份。在群集配置中配置 ldirectord 的原始资源,以便在发生硬件故障时,ldirectord 可以故障转移到其他服务器。

  • 由于负载平衡器的备份也需要 ldirectord 配置文件才能完成其任务,因此请确保 /etc/ha.d/ldirectord.cf 在要用作负载平衡器备份的所有服务器上都可用。可以按第 4.5 节 “将配置传送到所有节点”中所述使用 Csync2 同步配置文件。

14.3 使用 HAProxy 配置负载平衡

以下章节概述了 HAProxy 以及如何针对高可用性进行设置。负载平衡器会将所有请求分发到其后端服务器。它采用主动/被动配置,也就是说,当主节点发生故障时,从节点就会变成主节点。在这种情况下,用户察觉不到任何服务中断的迹象。

在本节中,我们将使用以下设置:

  • IP 地址为 192.168.1.99 的负载平衡器。

  • 一个虚拟浮动 IP 地址 192.168.1.99.

  • 我们的服务器(通常用于 Web 内容)www.example1.com(IP:192.168.1.200)和 www.example2.com(IP:192.168.1.201

要配置 HAProxy,请使用以下过程:

  1. 安装 haproxy 包。

  2. 创建包含以下内容的 /etc/haproxy/haproxy.cfg 文件:

    global 1
      maxconn 256
      daemon
    
    defaults 2
      log     global
      mode    http
      option  httplog
      option  dontlognull
      retries 3
      option redispatch
      maxconn 2000
      timeout connect   5000  3
      timeout client    50s   4
      timeout server    50000 5
    
    frontend LB
      bind 192.168.1.99:80 6
      reqadd X-Forwarded-Proto:\ http
      default_backend LB
    
    backend LB
      mode http
      stats enable
      stats hide-version
      stats uri /stats
      stats realm Haproxy\ Statistics
      stats auth haproxy:password	7
      balance roundrobin	8
      option  httpclose
      option forwardfor
      cookie LB insert
      option httpchk GET /robots.txt HTTP/1.0
      server web1-srv 192.168.1.200:80 cookie web1-srv check
      server web2-srv 192.168.1.201:80 cookie web2-srv check

    1

    该部分包含进程范围的选项和特定于操作系统的选项。

    maxconn

    每个进程的最大并发连接数。

    daemon

    建议的模式,HAProxy 将在后台运行。

    2

    该部分为其声明后的所有其他部分设置默认参数。一些重要的行:

    redispatch

    启用或禁用在连接失败时重新分发会话。

    log

    启用事件和流量日志记录。

    mode http

    以 HTTP 模式运行(针对 HAProxy 建议采用的模式)。在此模式下,将会先分析请求,然后再执行与任何服务器的连接。不符合 RFC 要求的请求将被拒绝。

    option forwardfor

    将 HTTP X-Forwarded-For 报头添加到请求中。如果您想要保留客户端的 IP 地址,则需要使用此选项。

    3

    与服务器建立连接的尝试成功之前可等待的最长时间。

    4

    客户端可保持非活动状态的最长时间。

    5

    服务器端可保持非活动状态的最长时间。

    6

    该部分将前端部分和后端部分合并在一起。

    balance leastconn

    定义负载平衡算法,请参见 http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4-balance

    stats enable , stats auth

    启用统计报告(通过 stats enable)。auth 选项记录针对特定帐户的身份验证的统计信息。

    7

    HAProxy 统计数字报告页面的身份凭证。

    8

    负载平衡将在轮询过程中工作。

  3. 测试配置文件:

    root # haproxy -f /etc/haproxy/haproxy.cfg -c
  4. 将以下行添加到 Csync2 的配置文件 /etc/csync2/csync2.cfg 中,以确保包括 HAProxy 配置文件:

    include /etc/haproxy/haproxy.cfg
  5. 同步该文件:

    root # csync2 -f /etc/haproxy/haproxy.cfg
    root # csync2 -xv
    注意
    注意

    Csync2 配置部分假设 HA 节点是使用 ha-cluster-bootstrap 配置的。有关细节,请参见《安装和设置快速入门》。

  6. 确保在两个负载平衡器(alicebob)上禁用 HAProxy,因为它由 Pacemaker 启动:

    root # systemctl disable haproxy
  7. 配置新的 CIB:

    root # crm configure
    crm(live)# cib new haproxy-config
    crm(haproxy-config)# primitive primitive haproxy systemd:haproxy \
        op start timeout=120 interval=0 \
        op stop timeout=120 interval=0 \
        op monitor timeout=100 interval=5s \
        meta target-role=Started
    crm(haproxy-config)# primitive vip IPaddr2 \
        params ip=192.168.1.99 nic=eth0 cidr_netmask=23 broadcast=192.168.1.255 \
        op monitor interval=5s timeout=120 on-fail=restart \
        meta target-role=Started
    crm(haproxy-config)# order haproxy-after-IP Mandatory: vip haproxy
    crm(haproxy-config)# colocation haproxy-with-public-IPs inf: haproxy vip
    crm(haproxy-config)# group g-haproxy vip haproxy-after-IP
  8. 校验新 CIB 并更正任何错误:

    crm(haproxy-config)# verify
  9. 提交新的 CIB:

    crm(haproxy-config)# cib use live
    crm(live)# cib commit haproxy-config

14.4 更多信息

打印此页