15 负载平衡 #
在负载平衡的情况下,服务器群集对于外部客户端而言就如同是一台大型的快速服务器。这种看上去像是单台服务器的服务器被称为虚拟服务器。它包括一个或多个用于调度进来的请求的负载平衡器,以及若干台运行实际服务的真实服务器。完成 High Availability Extension 的负载平衡设置后,您就可以构建高度可缩放且高度可用的网络服务,例如 Web、缓存、邮件、FTP、媒体和 VoIP 服务。
15.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 服务器将轮流返回所有这些条目。因此,不同的客户端将看到不同的地址。
选择“最佳”服务器: 虽然此策略存在一些缺点,但您可以使用“第一台做出响应的服务器”或“负载最低的服务器”方法来实现平衡。
平衡每台服务器的连接数: 用户与服务器之间的负载平衡器可以在多台服务器之间划分用户数。
地理定位: 可以将客户端定向到附近的服务器。
下面介绍适用于 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
)。因此,负载平衡器能够实现对客户端和服务器透明的故障转移。
15.2 使用 Linux 虚拟服务器配置负载平衡 #
以下部分概述了 LVS 主要组件和概念。然后,将介绍如何在 High Availability Extension 上设置 Linux 虚拟服务器。
15.2.1 定向器 #
LVS 的主要组件是 ip_vs(也称 IPVS)内核代码。它是默认内核的一部分,在 Linux 内核中实施传输层负载平衡(第 4 层交换)。运行包含 IPVS 代码的 Linux 内核的节点称为定向器。控制器上运行的 IPVS 代码是 LVS 的基本功能。
当客户端连接到定向器时,进来的请求在所有群集节点间是负载平衡的:定向器使用一组能使 LVS 正常工作的修改过的路由规则,将包转发到真实服务器。例如,连接不会在定向器上发起或终止,它也不会发送确认。定向器相当于将包从最终用户转发到真实服务器(运行用于处理请求的应用程序的主机)的专用路由器。
15.2.2 用户空间控制器和守护程序 #
ldirectord
守护程序是一个用户空间守护程序,用于在 LVS 负载平衡虚拟服务器群集中管理 Linux 虚拟服务器并监视真实的服务器。配置文件(见下文)指定虚拟服务及其关联的实际服务器,并指示 ldirectord
如何将此服务器配置为 LVS 重定向器。守护程序初始化时,将为群集创建虚拟服务。
ldirectord
守护程序通过定期请求已知的 URL 并检查响应来监视真实服务器的运行状况。如果真实服务器发生故障,将从负载平衡器的可用服务器列表中删除它。如果服务监视程序检测到发生故障的服务器已恢复并重新运行,则它会将此服务器重新添加到可用服务器列表中。如果出现所有真实服务器关闭的情况,则可以指定一台将 Web 服务重定向到的回退服务器。备用服务器通常是本地主机,它会显示一个应急页面,说明 Web 服务暂时不可用。
ldirectord
使用 ipvsadm
工具(软件包 ipvsadm)来操作 Linux 内核的虚拟服务器表。
15.2.3 数据包转发 #
定向器可采用三种不同方法将包从客户端发送到真实服务器:
- 网络地址转换 (NAT)
进来的请求到达虚拟 IP,然后通过将目标 IP 地址和端口更改为所选真实服务器的 IP 地址和端口将进来的请求转发到真实服务器。真实服务器向负载平衡器发送响应,负载平衡器再更改目标 IP 地址并将响应发回客户端。因此,最终用户就能从预期的源收到回复了。由于所有通讯都要流经负载平衡器,它通常会成为群集的瓶颈。
- IP 隧道通讯(IP-IP 封装)
IP 隧道通讯进程允许将发送到某个 IP 地址的包重定向到可能处于其他网络上的另一个地址。LVS 通过 IP 隧道(重定向到其他 IP 地址)向真实服务器发送请求,然后真实服务器使用自己的路由选择表直接回复到客户端。群集成员可以处于不同的子网中。
- 直接路由
来自最终用户的包将直接转发到真实服务器。IP 包未经修改,因此必须配置真实服务器以接受虚拟服务器 IP 地址的通讯。来自真实服务器的响应会直接发送到客户端。真实服务器和负载平衡器需处于同一物理网络段中。
15.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 的相关负载平衡策略。
15.2.5 使用 YaST 设置 IP 负载平衡 #
可使用 YaST IP 负载平衡模块配置基于内核的 IP 负载平衡。它是 ldirectord
的前端。
要访问“IP 负载平衡”对话框,请以 root
用户身份启动 YaST 并选择 › 。或者,以 root
用户身份使用 yast2 iplb
从命令行启动 YaST 群集模块。
默认安装不包括配置文件 /etc/ha.d/ldirectord.cf
。此文件由 YaST 模块创建。YaST 模块中的可用选项卡对应于 /etc/ha.d/ldirectord.cf
配置文件的结构,此配置文件用于定义全局选项和虚拟服务的选项。
有关配置示例以及负载平衡器和真实服务器之间产生的进程,请参见例 15.1 “简单的 ldirectord 配置”。
如果在虚拟服务器部分和全局部分都指定了某个参数,那么在虚拟服务器部分中定义的值将覆盖在全局部分中定义的值。
以下过程描述了如何配置最重要的全局参数。有关个别参数(以及此处未提及的参数)的更多细节,请单击ldirectord
手册页。
通过
定义ldirectord
连接到每台真实服务器以检查它们是否仍处于联机状态的间隔。通过
设置真实服务器应该在多长时间内响应上次检查。通过
定义在检查被视为失败前ldirectord
可尝试向真实服务器发送多少次请求。通过
定义协商检查经过多少秒后应视为超时。在
中,输入当所有真实服务器都停机时,要将 Web 服务重定向到的 Web 服务器的主机名或 IP 地址。如果希望系统在任何真实服务器的连接状态发生改变时均发送警报,请在
中输入有效的电子邮件地址。通过
定义经过多少秒后,如果任何真实服务器仍无法访问,应重复发出电子邮件警报。在
中指定应发送电子邮件警报的服务器状态。如果要定义多个状态,请使用逗号分隔的列表。通过
定义ldirectord
是否应连续监视配置文件有无修改。如果设置为yes
,则将在发生更改时自动重新装载配置。通过
开关定义是否应从内核的 LVS 表中去除发生故障的真实服务器。如果设置为 ,则不会删除发生故障的服务器。而是将其权重设置为0
,表示不接受新连接。已建立的连接将继续存在,直到超时为止。要使用其他路径进行日志记录,请在
中指定日志文件的路径。默认情况下,ldirectord
会将其日志文件写入/var/log/ldirectord.log
。
可通过为每种虚拟服务定义若干参数来配置一个或多个虚拟服务。以下过程描述了如何配置虚拟服务最重要的参数。有关个别参数(以及此处未提及的参数)的更多细节,请单击ldirectord
手册页。
在 YaST IP 负载平衡模块中,切换到
选项卡。在
中,输入负载平衡器和真实服务器可作为 LVS 访问的共享虚拟 IP 地址(IPv4 或 IPv6)和端口。还可以指定主机名和服务来代替 IP 地址和端口号。或者,也可以使用防火墙标记。防火墙标记是一种将任意VIP:port
服务的集合聚合到一个虚拟服务中的方法。要指定
,需要输入服务器的 IP 地址(IPv4、IPv6 或主机名)、端口(或服务名称)以及转发方法。转发方法必须是gate
、ipip
或masq
中的一种,请参见第 15.2.3 节 “数据包转发”。单击
按钮,为每台真实服务器输入需要的参数。在
中选择用于测试真实服务器是否仍然活动的检查类型。例如,要发送请求并检查响应是否包含预期的字符串,请选择Negotiate
。如果已将
设置为Negotiate
,则还需定义要监视的服务类型。从 下拉框中进行选择。在
中输入检查间隔期间每台真实服务器上所请求对象的 URI。如果要检查来自真实服务器的响应是否包含特定字符串(如 “I'm alive” 消息),请定义需要匹配的正则表达式。将正则表达式输入到 中。如果来自真实服务器的响应包含此表达式,则认为真实服务器处于活动状态。
根据您在步骤 6 中选定的 类型,您还必须为身份验证指定更多参数。切换到 选项卡,输入 、 、 或 等详细信息。有关更多信息,请参见 YaST 帮助文本或
ldirectord
手册页。切换至
选项卡。选择用于负载平衡的
。有关可用调度程序的信息,请参见ipvsadm(8)
手册页。选择要使用的
。如果将虚拟服务指定为 IP 地址和端口,则它必须是tcp
或udp
。如果将虚拟服务指定为防火墙标记,则协议必须是fwm
。如果需要,可定义其他参数。单击
确认配置。YaST 会将此配置写入/etc/ha.d/ldirectord.cf
。
图 15.1 “YaST IP 负载平衡 - 全局参数”和图 15.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
定义 | |
| |
真实服务器必须在上次检查后多长时间内作出响应。 | |
定义不要从内核的 LVS 表中删除发生故障的真实服务器,而是将其权重设置为 | |
LVS 的虚拟 IP 地址 (VIP)。可通过端口 | |
用于测试真实服务器是否仍处于活动状态的检查类型。 | |
此服务的所有真实服务器都宕机时,要将 Web 服务重定向到的服务器。 | |
要使用的协议。 | |
定义了两台真实服务器,均可通过端口 | |
需要在真实服务器的响应字符串中匹配的正则表达式。 | |
检查间隔期间每台真实服务器上所请求对象的 URI。 | |
用于负载平衡的所选调度程序。 | |
要监视的服务类型。 |
此配置将导致以下进程流:ldirectord
每 5 秒连接一次每台真实服务器 (2),并按 9 和 11 中指定的方式请求 192.168.0.110:80/test.html
或 192.168.0.120:80/test.html
。如果上次检查后 3 秒内 (3) 未收到来自真实服务器的预期的 still alive
字符串 (10),它会将此真实服务器从可用池中删除。但是,由于 quiescent=yes
设置 (4),真实服务器不会从 LVS 表中去除。其权重将设置为 0
,这样就不会接受到此真实服务器的新连接请求。已建立的连接将继续存在,直到超时为止。
15.2.6 其他步骤 #
除了使用 YaST 配置 ldirectord
外,还需要确保满足以下条件,才能完成 LVS 设置:
正确设置真实服务器以提供所需服务。
负载平衡服务器(或服务器)必须能够使用 IP 转发将通讯路由到真实服务器。真实服务器的网络配置取决于选择的包转发方法。
为避免负载平衡服务器(或服务器)成为整个系统的单个故障点,需要设置负载平衡器的一个或多个备份。在群集配置中配置
ldirectord
的原始资源,以便在发生硬件故障时,ldirectord
可以故障转移到其他服务器。由于负载平衡器的备份也需要
ldirectord
配置文件才能完成其任务,因此请确保/etc/ha.d/ldirectord.cf
在要用作负载平衡器备份的所有服务器上都可用。可以按第 4.5 节 “将配置传输到所有节点”中所述使用 Csync2 同步配置文件。
15.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,请使用以下过程:
安装 haproxy 软件包。
创建包含以下内容的
/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
该部分包含进程范围的选项和特定于操作系统的选项。
maxconn
每个进程的最大并发连接数。
daemon
建议的模式,HAProxy 将在后台运行。
该部分为其声明后的所有其他部分设置默认参数。一些重要的行:
redispatch
启用或禁用在连接失败时重新分发会话。
log
启用事件和流量日志记录。
mode http
以 HTTP 模式运行(针对 HAProxy 建议采用的模式)。在此模式下,将会先分析请求,然后再执行与任何服务器的连接。不符合 RFC 要求的请求将被拒绝。
option forwardfor
将 HTTP
X-Forwarded-For
报头添加到请求中。如果您想要保留客户端的 IP 地址,则需要使用此选项。
与服务器建立连接的尝试成功之前可等待的最长时间。
客户端可保持非活动状态的最长时间。
服务器端可保持非活动状态的最长时间。
该部分将前端部分和后端部分合并在一起。
balance leastconn
定义负载平衡算法,请参见 http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4-balance。
stats enable
,stats auth
启用统计报告(通过
stats enable
)。auth
选项记录针对特定帐户的身份验证的统计信息。
HAProxy 统计数字报告页面的身份凭证。
负载平衡将在轮询过程中工作。
测试配置文件:
root #
haproxy
-f /etc/haproxy/haproxy.cfg -c将下面一行添加到 Csync2 的配置文件
/etc/csync2/csync2.cfg
中,以确保包括 HAProxy 配置文件:include /etc/haproxy/haproxy.cfg
同步该文件:
root #
csync2
-f /etc/haproxy/haproxy.cfgroot #
csync2
-xv注意Csync2 配置部分假设已使用 crm 外壳提供的引导脚本配置 HA 节点。有关细节,请参见《安装和设置快速入门》。
确保在两个负载平衡器(
alice
和bob
)上禁用 HAProxy,因为它由 Pacemaker 启动:root #
systemctl
disable haproxy配置新的 CIB:
root #
crm
configurecrm(live)#
cib
new haproxy-configcrm(haproxy-config)#
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=Startedcrm(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=restartcrm(haproxy-config)#
group
g-haproxy vip haproxy校验新 CIB 并更正任何错误:
crm(haproxy-config)#
verify
提交新的 CIB:
crm(haproxy-config)#
cib
use livecrm(live)#
cib
commit haproxy-config
15.4 更多信息 #
有关
ldirectord
的更多信息,请参见其综合性手册页。