OpenEuler24.03 LVS+Keepalived实战指南

OpenEuler 24.03 LVS+Keepalived 超详细实战教程

本文档基于OpenEuler 24.03 LTS编写,完整覆盖 LVS 三种核心模式(NAT/DR/TUN)+ Keepalived 高可用集群部署,所有命令和配置均经过实测,可直接用于生产环境。

一、基础概念与架构规划

1.1 核心组件说明

  • LVS (Linux Virtual Server):Linux 内核级负载均衡器,工作在 OSI 第 4 层(传输层),性能远超 Nginx 等 7 层负载
  • Keepalived:实现 LVS 节点高可用(主备切换)+ 后端 RS 健康检查,基于 VRRP 协议
  • 三种工作模式对比

表格

模式 原理 优点 缺点 适用场景
NAT 进出流量都经过 LVS,LVS 做地址转换 配置简单,支持跨网段 RS 性能瓶颈(LVS 成为单点) 小规模集群,RS 数量 < 10
DR (直接路由) 入流量经 LVS,出流量直接回客户端 性能极高(LVS 只处理入流量) LVS 和 RS 必须在同一网段 生产环境首选,大规模集群
TUN (隧道) 封装 IP 隧道转发,出流量直接回客户端 支持跨网段 RS,性能好 配置复杂,需内核支持隧道 跨机房部署

1.2 实验环境规划(DR 模式为主)

表格

主机名 IP 地址 角色 操作系统
lvs-master 192.168.122.10 LVS 主节点 + Keepalived 主 OpenEuler 24.03
lvs-backup 192.168.122.11 LVS 备节点 + Keepalived 备 OpenEuler 24.03
rs1 192.168.122.20 后端真实服务器 1 OpenEuler 24.03
rs2 192.168.122.21 后端真实服务器 2 OpenEuler 24.03
VIP 192.168.122.100 虚拟 IP(对外提供服务) -

二、所有节点基础配置(必做)

2.1 关闭防火墙和 SELinux

bash

复制代码
# 关闭并禁用firewalld
systemctl stop firewalld
systemctl disable firewalld

# 临时关闭SELinux
setenforce 0

# 永久关闭SELinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

2.2 配置主机名和 hosts 解析

bash

复制代码
# 对应节点修改主机名
hostnamectl set-hostname lvs-master
# hostnamectl set-hostname lvs-backup
# hostnamectl set-hostname rs1
# hostnamectl set-hostname rs2

# 所有节点配置hosts
cat >> /etc/hosts << EOF
192.168.122.10 lvs-master
192.168.122.11 lvs-backup
192.168.122.20 rs1
192.168.122.21 rs2
EOF

2.3 配置时间同步

bash

复制代码
dnf install -y chrony
systemctl enable --now chronyd
chronyc sources

2.4 开启内核转发(LVS 节点)

bash

复制代码
# 仅在lvs-master和lvs-backup执行
cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward=1
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.ens3.send_redirects=0  # 替换为你的网卡名
EOF

# 生效配置
sysctl -p

三、LVS-DR 模式部署(生产首选)

3.1 LVS 节点安装 ipvsadm

bash

复制代码
# lvs-master和lvs-backup都执行
dnf install -y ipvsadm
systemctl enable ipvsadm

3.2 后端 RS 节点配置(关键)

rs1 和 rs2 都执行以下操作

bash

复制代码
# 1. 在lo接口绑定VIP
cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 << EOF
DEVICE=lo:0
IPADDR=192.168.122.100
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback:0
EOF

# 2. 启动lo:0接口
ifup lo:0
ip addr show lo

# 3. 配置ARP抑制(核心!防止RS响应ARP请求)
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
EOF

# 4. 生效配置
sysctl -p

# 5. 安装并启动httpd作为测试服务
dnf install -y httpd
echo "<h1>RS1: 192.168.122.20</h1>" > /var/www/html/index.html
systemctl enable --now httpd

rs2 节点注意 :将 index.html 内容改为<h1>RS2: 192.168.122.21</h1>

3.3 LVS 主节点手动配置测试

bash

复制代码
# 1. 在ens3接口绑定VIP
ip addr add 192.168.122.100/24 dev ens3
ip addr show ens3

# 2. 添加虚拟服务
ipvsadm -A -t 192.168.122.100:80 -s rr

# 3. 添加后端真实服务器(DR模式)
ipvsadm -a -t 192.168.122.100:80 -r 192.168.122.20:80 -g
ipvsadm -a -t 192.168.122.100:80 -r 192.168.122.21:80 -g

# 4. 查看配置
ipvsadm -Ln

# 5. 测试负载均衡
# 在客户端执行多次:curl 192.168.122.100
# 应该交替看到RS1和RS2的页面

# 6. 清空测试配置(重要!后面用Keepalived管理)
ipvsadm -C
ip addr del 192.168.122.100/24 dev ens3

四、Keepalived 高可用配置

4.1 安装 Keepalived(LVS 节点)

bash

复制代码
# lvs-master和lvs-backup都执行
dnf install -y keepalived

4.2 主节点配置(lvs-master)

bash

复制代码
# 备份原配置
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

# 编辑新配置
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
   router_id LVS_MASTER  # 主节点标识
   script_user root
   enable_script_security
}

# 定义健康检查脚本(可选,检查LVS服务是否正常)
vrrp_script chk_lvs {
    script "/bin/bash -c 'ipvsadm -Ln | grep -q 192.168.122.100:80'"
    interval 2  # 每2秒检查一次
    weight -20  # 检查失败,优先级减20
    fall 3      # 连续3次失败认为服务异常
    rise 2      # 连续2次成功认为服务恢复
}

vrrp_instance VI_1 {
    state MASTER    # 主节点为MASTER,备节点为BACKUP
    interface ens3  # 绑定VIP的网卡
    virtual_router_id 51  # 虚拟路由ID,主备必须相同
    priority 100    # 优先级,主节点高于备节点
    advert_int 1    # 心跳间隔1秒
    authentication {
        auth_type PASS
        auth_pass 1111  # 认证密码,主备必须相同
    }
    virtual_ipaddress {
        192.168.122.100/24 dev ens3 label ens3:0  # VIP
    }
    track_script {
        chk_lvs  # 调用健康检查脚本
    }
}

# 虚拟服务器配置
virtual_server 192.168.122.100 80 {
    delay_loop 6  # 健康检查间隔6秒
    lb_algo rr    # 调度算法:轮询
    lb_kind DR    # 工作模式:DR
    nat_mask 255.255.255.0
    persistence_timeout 0  # 会话保持时间,0表示关闭
    protocol TCP

    # 后端真实服务器1
    real_server 192.168.122.20 80 {
        weight 1  # 权重
        TCP_CHECK {
            connect_timeout 3  # 连接超时3秒
            nb_get_retry 3     # 重试次数
            delay_before_retry 3  # 重试间隔
            connect_port 80    # 检查端口
        }
    }

    # 后端真实服务器2
    real_server 192.168.122.21 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
EOF

4.3 备节点配置(lvs-backup)

bash

复制代码
# 备份原配置
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

# 编辑新配置(与主节点只有3处不同)
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
   router_id LVS_BACKUP  # 1. 备节点标识
   script_user root
   enable_script_security
}

vrrp_script chk_lvs {
    script "/bin/bash -c 'ipvsadm -Ln | grep -q 192.168.122.100:80'"
    interval 2
    weight -20
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP    # 2. 备节点为BACKUP
    interface ens3
    virtual_router_id 51
    priority 90     # 3. 优先级低于主节点
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.122.100/24 dev ens3 label ens3:0
    }
    track_script {
        chk_lvs
    }
}

virtual_server 192.168.122.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP

    real_server 192.168.122.20 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 192.168.122.21 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
EOF

4.4 启动服务并设置开机自启

bash

复制代码
# 先启动主节点,再启动备节点
systemctl enable --now keepalived

# 查看服务状态
systemctl status keepalived

# 查看VIP是否绑定成功
ip addr show ens3

# 查看LVS规则
ipvsadm -Ln

五、功能测试与验证

5.1 负载均衡测试

bash

复制代码
# 在客户端执行多次curl命令
for i in {1..10}; do curl 192.168.122.100; echo ""; done

# 预期结果:交替显示RS1和RS2的页面

5.2 后端 RS 故障测试

bash

复制代码
# 1. 停止rs1的httpd服务
systemctl stop httpd

# 2. 再次执行负载测试
for i in {1..10}; do curl 192.168.122.100; echo ""; done

# 预期结果:所有请求都转发到RS2
# 查看LVS规则,rs1已被自动移除
ipvsadm -Ln

# 3. 恢复rs1的httpd服务
systemctl start httpd

# 预期结果:rs1会被自动重新加入集群

5.3 LVS 主节点故障测试

bash

复制代码
# 1. 查看当前VIP所在节点(应该在lvs-master)
# 在lvs-master执行:ip addr show ens3 | grep 192.168.122.100

# 2. 停止lvs-master的keepalived服务
systemctl stop keepalived

# 3. 在lvs-backup查看VIP是否漂移过来
ip addr show ens3 | grep 192.168.122.100

# 4. 再次执行负载测试,服务应该正常
for i in {1..10}; do curl 192.168.122.100; echo ""; done

# 5. 恢复lvs-master的keepalived服务,VIP会自动切回主节点
systemctl start keepalived

六、LVS-NAT 模式快速配置(可选)

如果需要使用 NAT 模式,只需修改以下部分:

6.1 LVS 节点配置

bash

复制代码
# 1. 开启内核转发(已在基础配置中完成)

# 2. Keepalived配置修改
lb_kind NAT  # 将DR改为NAT

# 3. 配置SNAT(如果LVS作为网关)
iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE

6.2 后端 RS 节点配置

bash

复制代码
# 1. 将默认网关指向LVS的VIP
route add default gw 192.168.122.100

# 2. 不需要配置lo:0和ARP抑制

七、常见问题与故障排查

7.1 无法访问 VIP

  • 检查防火墙和 SELinux 是否完全关闭
  • 检查 RS 节点的 ARP 抑制配置是否正确
  • 检查 LVS 和 RS 是否在同一网段(DR 模式)
  • 使用tcpdump抓包分析:tcpdump -i ens3 host 192.168.122.100

7.2 VIP 无法漂移

  • 检查主备节点的virtual_router_idauth_pass是否一致
  • 检查主备节点的优先级是否正确
  • 查看 Keepalived 日志:journalctl -u keepalived -f

7.3 负载均衡不生效

  • 检查 LVS 规则是否正确:ipvsadm -Ln
  • 检查 RS 节点的 httpd 服务是否正常
  • 检查 RS 节点是否绑定了 VIP:ip addr show lo

7.4 会话保持问题

  • 如果需要会话保持,修改persistence_timeout参数(单位:秒)
  • 例如:persistence_timeout 300 表示 5 分钟内同一客户端的请求转发到同一 RS

八、生产环境优化建议

  1. 调度算法选择:根据业务特点选择合适的算法(rr/wrr/lc/wlc)

  2. 健康检查优化:根据业务调整检查间隔和超时时间

  3. 性能优化

    bash

    复制代码
    # 优化内核参数
    cat >> /etc/sysctl.conf << EOF
    net.core.netdev_max_backlog=5000
    net.core.rmem_max=16777216
    net.core.wmem_max=16777216
    net.ipv4.tcp_rmem=4096 87380 16777216
    net.ipv4.tcp_wmem=4096 65536 16777216
    EOF
    sysctl -p
  4. 监控告警:使用 Prometheus+Grafana 监控 LVS 连接数、RS 状态、VIP 漂移等

  5. 安全加固

    • 限制 VRRP 协议只在内部网络传播
    • 使用复杂的认证密码
    • 定期更新系统和软件包
相关推荐
鳄鱼杆2 小时前
服务器 | 2026年Ubuntu 24.04下GitLab Docker 企业级部署
服务器·ubuntu·gitlab
白毛大侠2 小时前
四表五链:Linux 防火墙的核心框架
linux·运维·网络
拾光Ծ2 小时前
吃透 Linux 静态库 / 动态库:ELF 文件、链接加载与进程地址空间详解
linux·动态库·静态库·elf·链接与加载·c/c++编程
sycmancia2 小时前
Qt——布局管理区(二)
开发语言·前端·qt
勇哥是也2 小时前
前端也能玩 AI:阿里云百炼流式对话开发
前端·人工智能·阿里云
铅笔小新z2 小时前
【Linux】进程(中)
linux·运维·服务器
云栖梦泽2 小时前
Linux内核与驱动:11.设备树
linux·c++
夜影风2 小时前
Prompt Engineering(提示词工程) vs. Agent Skills(智能体技能):从“口头吩咐”到“标准化操作手册”的进化
前端·人工智能·prompt
白毛大侠2 小时前
Linux 常用命令速查手册
linux·运维·服务器