1\. 引言

LVS (Linux Virtual Server) 虚拟服务器,是 Linux 内核中实现的负载均衡技术,以其高性能、高可靠性和高可用性而闻名。LVS 工作在 TCP/IP 协议栈的第四层 (传输层),通过将流量分配到多个后端服务器,提高系统性能、可用性和可靠性。LVS 被广泛应用于各种场景,例如网站、数据库、游戏服务器等,是构建高可用、高性能 Web 服务的利器。

2\. LVS 的工作原理

LVS 集群主要由两部分组成:

  • 调度器 (Director Server):  负责接收客户端请求,并根据负载均衡算法将请求转发到后端服务器。调度器通常被称为 "虚拟服务器" (VS)。
  • 服务端服务器 (Real Server):  负责处理实际的业务请求。服务端服务器也称为 "节点服务器" (RS)。

LVS 的工作流程如下:

  1. 客户端发送请求到调度器 (VS)。
  2. 调度器 (VS) 根据负载均衡算法选择一个服务端服务器 (RS)。
  3. 调度器 (VS) 将请求转发到选定的服务端服务器 (RS)。
  4. 服务端服务器 (RS) 处理请求,并将响应返回给客户端。
  5. 响应数据包通过调度器 (VS) 返回给客户端。

3\. LVS 集群中的术语

术语

描述

VS (Virtual Server)

调度器,负责接收客户端请求,并根据负载均衡算法将请求转发到后端服务器。

RS (Real Server)

服务端服务器,负责处理实际的业务请求。

CIP (Client IP)

客户端请求的 IP 地址。

VIP (Virtual IP)

虚拟 IP 地址,通常为公网 IP,直接面向用户的 IP 地址。

DIP (Director Server IP)

调度器的内网 IP 地址,用于与后端服务器通信。

RIP (Real Server IP)

后端服务端服务器的 IP 地址。

4\. LVS 的工作模式

LVS 主要有四种工作模式,每种模式都有其特点和适用场景:

  • NAT 模式 (Network Address Translation):
  • 请求和响应数据包都需要经过调度器 (VS)。
  • 调度器 (VS) 成为系统瓶颈,性能受限。
  • 支持端口映射,可以修改请求报文的目标端口。
  • 服务端服务器 (RS) 可以是任意操作系统。
  • 原理: 调度器 (VS) 修改请求报文的目标 IP 地址,将请求转发到后端服务器 (RS)。
  • 特点:
  • 适用场景:  适合小型集群,对性能要求不高,且需要修改目标端口的场景。
  • DR 模式 (Direct Routing):
  • 请求数据包经过调度器 (VS),响应数据包直接返回给客户端。
  • 调度器 (VS) 性能压力较小,适合大型集群。
  • 服务端服务器 (RS) 需要配置 VIP 地址,并设置 arp_ignorearp_announce 参数。
  • 服务端服务器 (RS) 需要在同一个物理网络中。
  • 原理: 调度器 (VS) 只修改请求报文的目的 MAC 地址,将请求转发到后端服务器 (RS)。
  • 特点:
  • 适用场景:  适合大型集群,对性能要求较高,且不需要修改目标端口的场景。
  • TUN 模式 (IP Tunneling):
  • 请求和响应数据包都需要经过调度器 (VS)。
  • 调度器 (VS) 性能压力较大,适合跨网络的集群。
  • 服务端服务器 (RS) 可以是任意操作系统。
  • 原理: 调度器 (VS) 通过 IP 隧道将请求转发到后端服务器 (RS)。
  • 特点:
  • 适用场景:  适合跨网络的集群,需要将请求转发到不同的网络。
  • Full-NAT 模式:
  • 请求和响应数据包都需要经过调度器 (VS)。
  • 调度器 (VS) 性能压力较大,适合需要隐藏服务端服务器 IP 地址的场景。
  • 服务端服务器 (RS) 可以是任意操作系统。
  • 原理: 调度器 (VS) 修改请求报文的源和目标 IP 地址,将请求转发到后端服务器 (RS)。
  • 特点:
  • 适用场景:  适合需要隐藏服务端服务器 IP 地址,且对性能要求不高的场景。

5\. LVS 的调度算法

LVS 支持多种调度算法,每种算法都有其特点和适用场景:

  • 静态调度算法:
  • RR (Round Robin): 轮询调度,将请求依次分配到后端服务器。
  • WRR (Weighted Round Robin): 加权轮询调度,可以为每个服务器设置权重,权重越大,分配到的请求越多。
  • SH (Source Hashing):  源地址哈希调度,根据客户端 IP 地址进行哈希,将请求分配到固定的服务器。适合解决 Session 共享问题。
  • DH (Destination Hashing): 目标地址哈希调度,根据请求的目标地址进行哈希,将请求分配到固定的服务器。适合用于缓存服务器的负载均衡。
  • 动态调度算法:
  • LC (Least Connections): 最小连接数调度,将请求分配到连接数最少的服务器。适合用于长连接应用。
  • WLC (Weighted Least Connections): 加权最小连接数调度,根据服务器的权重和连接数进行调度。
  • SED (Shortest Expected Delay): 最短延迟调度,根据服务器的权重和连接数进行调度,优先调度延迟最小的服务器。适合用于需要快速响应的应用。
  • NQ (Never Queue):  将请求分配到空闲的服务器,如果所有服务器都有连接,则使用 SED 算法。适合用于需要高吞吐量的应用。
  • LBLC (Locality-Based Least Connections): 动态的 DH 算法,根据负载状态实现正向代理。适合用于需要根据负载状态进行动态调度的场景。
  • LBLCR (LBLC with Replication): 带复制功能的 LBLC,解决 LBLC 负载不均衡问题。适合用于需要高可用性的场景。

6\. ipvsadm 工具

ipvsadm 是 LVS 的管理工具,用于添加、删除、修改 LVS 虚拟服务器和服务端服务器,以及查看 LVS 状态信息。

常用命令:

  • ipvsadm -A -t <VIP:端口> -s <算法>:  添加虚拟服务器。
  • ipvsadm -D -t <VIP:端口>:  删除虚拟服务器。
  • ipvsadm -a -t <VIP:端口> -r <RIP:端口> <模式>:  添加服务端服务器。
  • ipvsadm -d -t <VIP:端口> -r <RIP:端口>:  删除服务端服务器。
  • ipvsadm -l:  查看 LVS 虚拟服务器列表。
  • ipvsadm -n:  以数字形式显示地址、端口等信息。

7\. LVS-NAT 负载均衡部署

架构图:

LVS 负载均衡集群指南_IP

步骤:

  1. 配置调度器:
  • 添加一块网卡,设置为仅主机模式。
  • 开启路由转发功能:net.ipv4.ip_forward = 1
  • 安装 ipvsadm 软件:yum install ipvsadm
  • 添加虚拟服务器:ipvsadm -A -t 12.0.0.1:80 -s rr
  • 添加服务端服务器:ipvsadm -a -t 12.0.0.1:80 -r 192.168.204.20:80 -m
  • 添加服务端服务器:ipvsadm -a -t 12.0.0.1:80 -r 192.168.204.30:80 -m
  1. 配置服务端服务器:
  • 安装 Web 服务 (例如 Apache 或 Nginx)。
  • 设置网关为调度器的内网 IP 地址。
  1. 配置客户端:
  • 设置网关为调度器的内网 IP 地址。

8\. LVS-DR 负载均衡部署

示例:

LVS 负载均衡集群指南_IP_02

  1. 配置调度器:
  • 配置虚拟网卡,设置 VIP 地址:IPADDR=192.168.204.188NETMASK=255.255.255.255
  • 开启路由转发功能:net.ipv4.ip_forward = 1
  • 安装 ipvsadm 软件:yum install ipvsadm
  • 添加虚拟VIP:ipvsadm -A -t 192.168.204.188:80 -s rr
  • 添加服务端服务器IP:ipvsadm -a -t 192.168.204.188:80 -r 192.168.204.20:80 -g
  • 添加服务端服务器IP:ipvsadm -a -t 192.168.204.188:80 -r 192.168.204.30:80 -g
  1. 配置服务端服务器:
  • 安装 Web 服务 (例如 Apache 或 Nginx)。
  • 配置回环网卡,设置 VIP 地址:IPADDR=192.168.204.188NETMASK=255.255.255.255
  • 设置 arp_ignorearp_announce 参数:net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2
  1. 配置客户端:
  • 设置网关为调度器的内网 IP 地址。

9\. LVS 性能优化

  • 优化调度算法:  选择合适的调度算法,例如 WRR 或 WLC,根据服务器的权重和连接数进行调度,提高性能和负载均衡。
  • 优化健康检查:  合理设置健康检查间隔时间,避免过频繁的健康检查,减少调度器对后端服务器的压力。
  • 使用 spread-checks 指令:  延迟发送健康检查,错峰处理,减少调度器对后端服务器的压力。
  • 优化硬件配置:  使用高性能服务器、SSD 硬盘,提高 LVS 集群的整体性能。

10\. Keepalived + LVS 高可用负载均衡

Keepalived 是一款开源的高可用软件,专为 LVS 和 HAproxy 设计,提供故障自动切换 (Failover) 和节点健康状态检查 (Health Checking) 功能。它通过 VRRP (Virtual Router Redundancy Protocol) 协议实现高可用性,确保当调度器出现故障时,可以自动切换到备用调度器,保证服务的连续性。

Keepalived 的核心组件:

  • VRRP stack:  负责发送心跳线,通告虚拟 IP (VIP) 和其他信息。
  • Checkers:  负责检查后端服务器的健康状态。
  • System call:  提供通用的模块,用于在 VRRP 协议状态转换时调用脚本。
  • SMTP:  邮件组件,用于发送报警邮件。
  • IPVS wrapper:  自动生成 LVS 规则。
  • Netlink Reflector:  网络接口,用于将虚拟 IP (VIP) 地址漂浮到主调度器。
  • WatchDog:  监控进程,确保 Keepalived 进程正常运行。

Keepalived 的工作原理:

Keepalived 通过 VRRP 协议实现高可用性,VRRP 协议是一种虚拟路由冗余协议,它将多个路由器虚拟成一个组,并选举出一个主路由器,负责处理流量。当主路由器出现故障时,备用路由器会自动接管主路由器的职责,确保服务的连续性。

Keepalived 的工作流程如下:

  1. Keepalived 启动后,会加入一个 VRRP 组,并选举出一个主节点。
  2. 主节点会定期发送心跳线,通告虚拟 IP (VIP) 和其他信息。
  3. 备用节点会接收心跳线,并根据优先级判断是否需要接管主节点。
  4. 当主节点出现故障时,备用节点会自动接管主节点的职责,并成为新的主节点。
  5. 当主节点恢复正常时,会根据抢占模式决定是否重新成为主节点。

VRRP 协议相关术语:

  • 虚拟路由器:  不是真正存在的路由器,而是由多个物理路由器虚拟出来的一个组。
  • 虚拟路由器标识 (VRID):  用于标识虚拟路由器组,同一个组的路由器才能使用 VRRP 协议。
  • VIP (Virtual IP):  虚拟 IP 地址,也就是网关,对外提供服务的地址。
  • VMAC (Virtual MAC):  虚拟路由器的 MAC 地址。
  • Master:  主节点,负责处理流量。
  • Backup:  备用节点,当主节点出现故障时,会自动接管主节点的职责。
  • Priority:  优先级,优先级高的节点会成为主节点。
  • Advert\_int:  心跳线报文发送间隔时间,单位为秒。

Keepalived 的三种抢占模式:

  • 抢占式 (Preempt):  当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,会立即抢占主节点的职责。
  • 非抢占式 (No Preempt):  当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,不会重新成为主节点,而是继续作为备用节点。
  • 延迟抢占模式 (Preempt Delay):  当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,会延迟一段时间,等待主节点稳定后,再重新成为主节点。

Keepalived 的安装:

6.1 Yum 安装
yum install keepalived

注意: Yum 安装的 Keepalived 版本可能较旧,建议使用编译安装方式。

6.2 编译安装
yum install gcc curl openssl-devel libnl3-devel net-snmp-devel
wget https://keepalived.org/software/keepalived-2.2.2.tar.gz
tar xf keepalived-2.2.2.tar.gz
cd keepalived-2.2.2
./configure --prefix=/usr/local/keepalived
make
make install

7\. Keepalived 的配置文件

Keepalived 的配置文件通常位于 /etc/keepalived/keepalived.conf,包含以下几个部分:

  • 全局配置块 (GLOBAL CONFIGURATION):  定义邮件配置、router_id、VRRP 配置、组播地址等。
  • 虚拟路由器设置 (VRRP CONFIGURATION):  定义 VRRP 协议中,每个 VRRP 虚拟路由器的规则、基本信息。
  • LVS 设置 (LVS CONFIGURATION):  定义调度服务器和服务端服务器的规则设置。

8\. Keepalived 的配置示例

global_defs {
    notification_email {
        acassen@firewall.loc
        failover@firewall.loc
        sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
    vrrp_skip_check_adv_addr
    #vrrp_strict
    vrrp_garp_interval 0
    vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.125.123
    }
}

virtual_server 192.168.125.123 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP
    real_server 192.168.201.100 443 {
        ```
        weight 1
        SSL_GET {
            url {
                path /
                digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
                path /mrtg/
                digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

9\. Keepalived + LVS 的实验

实验环境:

  • 主节点 (Master):  7-1 (192.168.125.100)
  • 备用节点 (Backup):  7-2 (192.168.125.120)
  • 服务端服务器1:  7-3 (192.168.125.130)
  • 服务端服务器2:  7-5 (192.168.125.150)
  • 虚拟 IP (VIP):  192.168.125.123
  • 客户端:  7-6 (192.168.125.160)

步骤:

  1. 配置服务端服务器 (7-3 和 7-5):
  • 安装 Web 服务 (例如 Apache 或 Nginx)。
  • 创建访问页面,例如 echo "7-3 keepalived" > index.html
  • 关闭长连接:keepalive off
  1. 配置主节点 (7-1):
  • 复制配置文件并备份:cp keepalived.conf keepalived.conf.bak
  • 编辑配置文件,设置 router_idinterfacevirtual_ipaddress 等参数。
  • 设置 LVS 模式为 DR:lb_kind DR
  • 设置服务端服务器信息,包括 weightTCP_CHECK
  • 安装 ipvsadm 和 keepalived:yum install ipvsadm keepalived
  • 启动 ipvsadm 服务:systemctl start ipvsadm
  • 验证服务端服务器是否配置成功:curl 192.168.125.130curl 192.168.125.150
  • 配置 Keepalived:
  • 重启 Keepalived 服务:systemctl restart keepalived.service
  • 查看虚拟 IP:ip a
  1. 配置备用节点 (7-2):
  • 安装 ipvsadm 和 keepalived:yum install ipvsadm keepalived
  • 启动 ipvsadm 服务:systemctl start ipvsadm
  • 复制主节点的 Keepalived 配置文件到备用节点。
  • 编辑配置文件,将 state 设置为 BACKUPpriority 设置为低于主节点的优先级。
  • 重启 Keepalived 服务:systemctl restart keepalived.service
  1. 配置客户端 (7-6):
  • 设置网关为调度器的内网 IP 地址。
  1. 测试主备切换:
  • 关闭主节点的 Keepalived 服务,验证备用节点是否接管主节点职责。
  • 重新启动主节点的 Keepalived 服务,验证主节点是否重新成为主节点。

10\. 抢占模式

Keepalived 支持三种抢占模式,可以根据实际需求选择合适的模式:

  • 立即抢占模式 (Preempt):  当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,会立即抢占主节点的职责。
  • 非抢占模式 (No Preempt):  当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,不会重新成为主节点,而是继续作为备用节点。
  • 延迟抢占模式 (Preempt Delay):  当主节点出现故障时,备用节点会接管主节点的职责。当主节点恢复正常时,会延迟一段时间,等待主节点稳定后,再重新成为主节点。

11\. 修改单播和多播地址

  • 修改多播地址:  在 Keepalived 配置文件中,使用 vrrp_mcast_group4 指令修改多播地址。
  • 修改单播地址:  在 Keepalived 配置文件中,使用 unicast_src_ipunicast_peer 指令修改单播地址。

12\. 主备切换的通知脚本

Keepalived 可以通过脚本通知管理员主备切换事件。

  • 定义脚本:  在 Keepalived 配置文件中,使用 notify_masternotify_backupnotify_fault 指令定义脚本路径。
  • 编写脚本:  编写脚本,实现发送邮件、记录日志等功能。

13\. 脑裂问题

脑裂问题是指在高可用集群中,由于网络故障或其他原因,导致两个节点都认为自己是主节点,从而导致数据不一致或服务中断。

预防脑裂问题的方法:

  • 使用双心跳线:  使用串行电缆和以太网电缆连接,确保即使一条线路断开,另一条线路也能正常工作。
  • 使用 Fencing 设备:  使用 Fencing 设备,当检测到脑裂时,强行关闭一个心跳节点,避免两个节点都认为自己是主节点。

14\. Nginx + Keepalived 实验

实验环境:

  • 调度服务器:  7-1 (192.168.125.100)
  • 备用调度服务器:  7-2 (192.168.125.120)
  • 服务端服务器1:  7-3 (192.168.125.130)
  • 服务端服务器2:  7-5 (192.168.125.150)
  • 虚拟 IP (VIP):  192.168.125.123
  • 客户端:  7-6 (192.168.125.160)

步骤:

  1. 配置服务端服务器 (7-3 和 7-5):
  • 安装 Web 服务 (例如 Apache 或 Nginx)。
  • 创建访问页面,例如 echo "7-3 nginx" > index.html
  1. 配置服务端服务器 (7-1):
  • 复制配置文件并备份:cp keepalived.conf keepalived.conf.bak
  • 编辑配置文件,设置 router_idinterfacevirtual_ipaddress 等参数。
  • 使用 vrrp_script 模块,定义一个脚本,用于检测 Nginx 是否正常运行。
  • 使用 track_script 指令,将脚本添加到 Keepalived 的监控列表中。
  • 编辑 Nginx 配置文件,添加 upstreamlocation 配置。
  • 安装 Nginx 和 Keepalived:yum install nginx keepalived
  • 启动 Nginx 服务:systemctl start nginx
  • 配置 Nginx 负载均衡:
  • 复制 Nginx 配置文件到备用调度服务器 (7-2)。
  • 配置 Keepalived:
  • 重启 Keepalived 服务:systemctl restart keepalived.service
  1. 配置备用调度服务器 (7-2):
  • 复制配置文件并备份:cp keepalived.conf keepalived.conf.bak
  • 编辑配置文件,将 state 设置为 BACKUPpriority 设置为低于主调度服务器的优先级。
  • 使用 vrrp_script 模块,定义一个脚本,用于检测 Nginx 是否正常运行。
  • 使用 track_script 指令,将脚本添加到 Keepalived 的监控列表中。
  • 安装 Nginx 和 Keepalived:yum install nginx keepalived
  • 启动 Nginx 服务:systemctl start nginx
  • 复制主调度服务器的 Nginx 配置文件到备用调度服务器。
  • 配置 Keepalived:
  • 重启 Keepalived 服务:systemctl restart keepalived.service
  1. 配置客户端 (7-6):
  • 设置网关为调度器的内网 IP 地址。
  1. 测试主备切换:
  • 关闭主调度服务器的 Nginx 和 Keepalived 服务,验证备用调度服务器是否接管主调度服务器职责。
  • 重新启动主调度服务器的 Nginx 和 Keepalived 服务,验证主调度服务器是否重新成为主节点。

15\. 总结

Keepalived + LVS 是构建高可用负载均衡集群的常见方案,可以有效地提高系统的性能、可用性和可靠性。通过本文档,您应该已经了解了 Keepalived 和 LVS 的基本概念、工作原理、部署步骤和性能优化等内容。希望这份指南能够帮助您更好地理解和使用 Keepalived + LVS,构建高性能、安全可靠的 Web 服务。

16\. 进一步学习

注意:

  • 以上配置示例仅供参考,请根据您的实际需求进行调整。
  • 在进行任何配置更改之前,请务必备份您的配置文件,并进行测试以确保更改不会影响 LVS 或 Keepalived 的正常运行。

Keepalived + LVS 示例图:

LVS 负载均衡集群指南_服务器_03

说明:

  • Keepalived 通过 VRRP 协议实现调度器的高可用性,主节点和备用节点之间通过心跳线进行通信,确保当主节点出现故障时,备用节点可以自动接管主节点的职责。
  • LVS 负责将流量分配到多个服务端服务器,提高系统的性能和可靠性。
  • 客户端只访问虚拟 IP (VIP),而不会直接访问服务端服务器。SS