keepalived高可用与负载均衡

一、核心概念与原理

1.1 核心组件拆解

组件 中文名称 核心作用 通俗理解
Keepalived 高可用热备工具 基于 VRRP 实现 VIP 漂移、节点健康检查、主备自动切换 集群的 "哨兵",主节点挂了自动接管,主节点恢复后重新掌权
LVS Linux 虚拟服务器 内核级四层负载均衡,支持 DR/NAT/TUN 三种模式 流量的 "调度员",把客户端请求分发给后端真实服务器
Director 调度器 运行 LVS+Keepalived,负责接收客户端请求并分发 流量入口的 "老大",主调度器(MASTER)负责服务,备调度器(BACKUP)待命
Real Server 真实服务器 运行业务服务(如 Nginx/Web),处理实际请求 真正干活的 "打工人",多台 RS 实现业务集群
VIP 虚拟 IP 漂移 IP,客户端统一访问的入口 固定的 "访问地址",在主备调度器间自动转移

1.2 核心原理:VRRP 协议与 LVS-DR 模式

(1)VRRP 协议(双机热备核心)

VRRP(虚拟路由冗余协议)是 Keepalived 实现高可用的底层协议,核心逻辑如下:

  1. 角色选举 :主备调度器组成热备组,通过priority(优先级)选举主节点(MASTER),优先级高的节点抢占 VIP;
  2. 心跳检测:主节点每秒发送 VRRP 通告报文(心跳),备节点(BACKUP)持续监听;
  3. 故障切换:备节点未收到心跳则判定主节点故障,立即抢占 VIP 并接管服务;
  4. 故障恢复:主节点恢复后,默认会重新抢占 VIP(可配置非抢占模式)。
(2)LVS-DR 模式(高性能首选)

DR(直接路由)模式是 LVS 最常用的模式,核心特点是请求经 LVS 分发,响应直接返回客户端,性能拉满:

  1. 客户端访问 VIP,请求到达主调度器(LVS);
  2. LVS 修改数据包的目标 MAC 地址为后端 RS 的 MAC,IP 不变(目标仍为 VIP);
  3. RS 收到请求后,通过 lo 接口的 VIP 处理业务;
  4. RS 直接将响应返回给客户端(源 IP 为 VIP),无需经过 LVS。

1.3 实验环境规划

本次实验共 4 台服务器,基于 OpenEuler24 搭建,IP 规划如下:

角色 主机名 IP 地址 核心服务
主调度器(MASTER) lb01 192.168.10.101 Keepalived+LVS+ipvsadm
备调度器(BACKUP) lb02 192.168.10.102 Keepalived+LVS+ipvsadm
真实服务器 1(RS1) web01 192.168.10.103 Nginx+Web 服务
真实服务器 2(RS2) web02 192.168.10.104 Nginx+Web 服务
虚拟 IP(VIP) - 192.168.10.100 客户端统一访问入口

二、实验步骤一:Keepalived 双机热备基础配置

2.1 所有节点通用初始化(必做)

(1)关闭防火墙与 SELinux(测试环境)

生产环境需开放对应端口,测试环境直接关闭简化配置:

bash

运行

复制代码
# 关闭防火墙并禁用开机自启
systemctl stop firewalld && systemctl disable firewalld
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
(2)安装核心软件

主备调度器需安装 Keepalived(高可用)、ipvsadm(LVS 管理工具);RS 节点安装 Nginx(Web 服务):

bash

运行

复制代码
# 主备调度器(lb01/lb02)执行
yum install -y keepalived ipvsadm
# 真实服务器(web01/web02)执行
yum install -y nginx
(3)设置服务开机自启

bash

运行

复制代码
# 主备调度器
systemctl enable keepalived
# RS节点
systemctl enable nginx

2.2 主调度器(lb01)Keepalived 配置

(1)进入配置目录并备份模板

Keepalived 主配置文件为/etc/keepalived/keepalived.conf,先备份模板避免误操作:

bash

运行

复制代码
cd /etc/keepalived/
cp keepalived.conf.sample keepalived.conf
# 编辑配置文件
vi keepalived.conf
(2)完整配置内容

bash

运行

复制代码
! Configuration File for keepalived
# 全局配置段
global_defs {
    router_id LB01  # 服务器唯一标识,主备节点需不同
}
# VRRP热备实例配置
vrrp_instance VI_1 {
    state MASTER        # 角色为MASTER(主调度器)
    interface ens33     # 承载VIP的物理网卡(根据实际环境修改)
    virtual_router_id 1 # 虚拟路由ID,主备节点必须一致
    priority 100        # 优先级,数值越大越优先(主备需不同)
    advert_int 1        # 心跳间隔(秒),默认1秒
    # 认证配置,防止非法节点抢占
    authentication {
        auth_type PASS  # 密码认证
        auth_pass 123456# 认证密码,主备节点必须一致
    }
    # 虚拟IP(VIP)配置,可多个
    virtual_ipaddress {
        192.168.10.100/24
    }
}

2.3 备调度器(lb02)Keepalived 配置

备节点配置与主节点基本一致,仅修改 3 个关键参数:router_idstatepriority

(1)进入配置目录并备份模板

bash

运行

复制代码
cd /etc/keepalived/
cp keepalived.conf.sample keepalived.conf
vi keepalived.conf
(2)完整配置内容

bash

运行

复制代码
! Configuration File for keepalived
global_defs {
    router_id LB02  # 与主节点不同的标识
}
vrrp_instance VI_1 {
    state BACKUP      # 角色为BACKUP(备调度器)
    interface ens33   # 与主节点一致的物理网卡
    virtual_router_id 1 # 与主节点一致的虚拟路由ID
    priority 99       # 优先级低于主节点(100>99)
    advert_int 1      # 与主节点一致的心跳间隔
    authentication {
        auth_type PASS
        auth_pass 123456 # 与主节点一致的认证密码
    }
    virtual_ipaddress {
        192.168.10.100/24
    }
}

2.4 启动 Keepalived 并验证双机热备

(1)启动服务(主备节点均执行)

bash

运行

复制代码
systemctl start keepalived
(2)验证 VIP 绑定(主节点 lb01)

执行ip addr show dev ens33,若输出中包含192.168.10.100/24,说明 VIP 已绑定主节点:

bash

运行

复制代码
[root@lb01 ~]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:93:80:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.101/24 brd 192.168.10.255 scope global ens33
    inet 192.168.10.100/32 scope global ens33  # VIP绑定成功
    valid_lft forever preferred_lft forever
(3)验证备节点(lb02)

备节点执行ip addr show dev ens33,无 VIP 绑定,处于监听状态:

bash

运行

复制代码
[root@lb02 ~]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:93:80:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.102/24 brd 192.168.10.255 scope global ens33
    # 无VIP绑定,正常
(4)故障切换测试(核心验证)

模拟主节点故障,关闭 lb01 的 Keepalived 服务,观察 VIP 是否漂移到 lb02:

bash

运行

复制代码
# 主节点lb01执行
systemctl stop keepalived
# 主节点验证:VIP消失
ip addr show dev ens33 | grep 192.168.10.100
# 备节点lb02验证:VIP绑定
ip addr show dev ens33 | grep 192.168.10.100

预期结果:lb02 成功绑定 VIP,双机热备生效;恢复 lb01 的 Keepalived 服务,VIP 自动切回主节点(默认抢占模式)。

2.5 补充知识点:非抢占模式配置

默认情况下,主节点恢复后会抢占 VIP,若需避免频繁切换,可配置非抢占模式 (主备节点均添加nopreempt):

bash

运行

复制代码
vrrp_instance VI_1 {
    state BACKUP  # 备节点保持BACKUP
    interface ens33
    virtual_router_id 1
    priority 99
    advert_int 1
    nopreempt        # 开启非抢占模式
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.10.100/24
    }
}

说明:非抢占模式下,主节点恢复后不会主动抢占 VIP,需手动切换或等待备节点故障。

三、实验步骤二:LVS+Keepalived DR 模式高可用集群部署

3.1 真实服务器(RS)配置(web01/web02)

RS 节点需绑定 VIP 到 lo 接口,并配置 ARP 策略(避免 RS 响应非本地 ARP 请求,防止 IP 冲突)。

(1)临时绑定 VIP 到 lo 接口

bash

运行

复制代码
# 临时绑定(重启失效)
ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100
# 验证
ifconfig lo:0 | grep 192.168.10.100
(2)配置 ARP 内核参数(永久生效)

bash

运行

复制代码
# 配置lo接口ARP参数
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
# 配置所有接口ARP参数
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
# 永久生效(写入配置文件)
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF
# 加载配置
sysctl -p
(3)启动 Nginx 并配置测试页面

bash

运行

复制代码
# 启动Nginx
systemctl start nginx
# web01配置页面(标识RS1)
echo "Web01 - Real Server 1" >/usr/share/nginx/html/index.html
# web02配置页面(标识RS2)
echo "Web02 - Real Server 2" >/usr/share/nginx/html/index.html
# 验证RS本地访问
curl http://192.168.10.103  # web01
curl http://192.168.10.104  # web02

3.2 主备调度器(LVS)配置(lb01/lb02)

调度器需配置 LVS-DR 规则,结合 Keepalived 实现负载均衡与高可用。

(1)加载 LVS 内核模块

bash

运行

复制代码
modprobe ip_vs
# 验证模块加载
lsmod | grep ip_vs
(2)主调度器(lb01)LVS+Keepalived 配置

修改/etc/keepalived/keepalived.conf,添加virtual_server段配置 LVS 规则:

bash

运行

复制代码
! Configuration File for keepalived
global_defs {
    router_id LB01
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.10.100/24
    }
}
# LVS虚拟服务器配置(DR模式)
virtual_server 192.168.10.100 80 {
    delay_loop 2          # 健康检查间隔(秒)
    lb_algo wrr           # 调度算法:加权轮询(WRR)
    lb_kind DR            # 转发模式:直接路由(DR)
    persistence_timeout 50 # 会话保持时间(秒)
    protocol TCP          # 协议:TCP
    # 真实服务器1配置
    real_server 192.168.10.103 80 {
        weight 1          # 权重
        TCP_CHECK {       # TCP健康检查
            connect_timeout 10 # 连接超时时间(秒)
            nb_get_retry 3   # 重试次数
            delay_before_retry 3 # 重试间隔(秒)
            connect_port 80  # 检测端口
        }
    }
    # 真实服务器2配置
    real_server 192.168.10.104 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
(3)备调度器(lb02)LVS+Keepalived 配置

与主节点配置一致,仅修改router_idstatepriority

bash

运行

复制代码
! Configuration File for keepalived
global_defs {
    router_id LB02
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 1
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.10.100/24
    }
}
virtual_server
角色 IP 地址 服务
Master(主调度器) 192.168.10.10 Keepalived + LVS
Backup(备调度器) 192.168.10.11 Keepalived + LVS
Real Server1(Web1) 192.168.10.12 Nginx
Real Server2(Web2) 192.168.10.13 Nginx
VIP(虚拟 IP) 192.168.10.100 对外统一入口

2.2 系统初始化(所有机器都执行)

bash

运行

复制代码
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 安装依赖
yum install -y wget net-tools ipvsadm keepalived nginx

三、实验一:Keepalived 双机热备配置

3.1 Master 主节点配置(192.168.10.10)

编辑配置文件:

bash

运行

复制代码
vi /etc/keepalived/keepalived.conf

内容如下:

bash

运行

复制代码
global_defs {
    router_id LVS_MASTER
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.10.100/24
    }
}

3.2 Backup 备节点配置(192.168.10.11)

bash

运行

复制代码
vi /etc/keepalived/keepalived.conf

内容如下:

bash

运行

复制代码
global_defs {
    router_id LVS_BACKUP
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.10.100/24
    }
}

3.3 启动服务

bash

运行

复制代码
systemctl start keepalived
systemctl enable keepalived

3.4 查看 VIP 是否绑定成功

Master 上执行:

bash

运行

复制代码
ip addr

能看到 192.168.10.100 说明成功。

3.5 故障切换测试

  1. 停掉 Master 的 keepalived:

bash

运行

复制代码
systemctl stop keepalived
  1. 在 Backup 上查看:

bash

运行

复制代码
ip addr

VIP 会自动漂移到 Backup,实验一完成。


四、实验二:LVS-DR + Keepalived 高可用集群

4.1 Real Server 配置(两台 Web 都执行)

4.1.1 在 lo 网卡绑定 VIP

bash

运行

复制代码
ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 up

4.1.2 抑制 ARP 响应(关键步骤)

bash

运行

复制代码
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

永久生效:

bash

运行

复制代码
vi /etc/sysctl.conf

添加:

plaintext

复制代码
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

执行:

bash

运行

复制代码
sysctl -p

4.1.3 启动 Nginx 并设置测试页面

bash

运行

复制代码
systemctl start nginx

Web1:

bash

运行

复制代码
echo "RS1 - 192.168.10.12" > /usr/share/nginx/html/index.html

Web2:

bash

运行

复制代码
echo "RS2 - 192.168.10.13" > /usr/share/nginx/html/index.html

4.2 Master 调度器完整配置(LVS+Keepalived)

bash

运行

复制代码
vi /etc/keepalived/keepalived.conf

完整配置:

bash

运行

复制代码
global_defs {
    router_id LVS_MASTER
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.10.100/24
    }
}

virtual_server 192.168.10.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.10.12 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }

    real_server 192.168.10.13 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }
}

4.3 Backup 调度器配置

只需要修改:

  • state BACKUP
  • priority 100其他 LVS 部分完全一样。

4.4 重启 Keepalived 生效

bash

运行

复制代码
systemctl restart keepalived

4.5 查看 LVS 规则

bash

运行

复制代码
ipvsadm -Ln

能看到 VIP 和两台 RS,说明配置成功。


五、测试验证

5.1 访问 VIP

在浏览器或 curl 访问:

plaintext

复制代码
http://192.168.10.100

不断刷新,会轮流出现:

  • RS1 - 192.168.10.12
  • RS2 - 192.168.10.13

负载均衡生效。

5.2 主调度器故障测试

关闭 Master:

bash

运行

复制代码
systemctl stop keepalived

再次访问 VIP,仍然可以打开网页,说明 自动切换成功

5.3 后端 RS 故障测试

关掉 Web1 的 Nginx:

bash

运行

复制代码
systemctl stop nginx

访问 VIP,只会出现 Web2,说明 健康检查生效


六、补充知识点

6.1 Keepalived 核心作用

  1. 实现 VRRP 协议,做双机热备
  2. 自动检测节点故障
  3. 自动漂移 VIP
  4. 可以配置脚本实现服务监控

6.2 LVS 三种模式

  1. NAT 模式:请求和回包都走 LVS,性能一般
  2. TUN 模式:IP 隧道,跨网段
  3. DR 模式 :直接路由,生产最常用,性能最高

6.3 DR 模式为什么要抑制 ARP?

因为 RS 也配置了 VIP,如果不抑制 ARP,客户端会直接找到 RS,不会走 LVS 调度器。

6.4 LVS 调度算法

  • rr:轮询
  • wrr:加权轮询
  • sh:源地址哈希(会话保持)
  • dh:目标地址哈希
  • lblc:基于局部性的最少连接

6.5 VRRP 工作原理

  1. 多台设备组成一个虚拟路由
  2. 优先级高的成为 Master
  3. Master 发广播心跳
  4. Backup 收不到心跳则认为 Master 宕机
  5. 优先级最高的 Backup 升级为新 Master

6.6 生产环境注意事项

  1. 防火墙必须放行 VRRP 协议(协议号 112)
  2. 不要在虚拟机随便漂移网卡
  3. 生产建议使用 nopreempt 非抢占模式
  4. 健康检查要配置合理,避免误切换
  5. 监控脚本可以扩展监控 Nginx、MySQL、业务端口
相关推荐
Leo8992 小时前
mysql 从零单排之MVCC
后端
GreatSQL2 小时前
参数配置不当导致GreatSQL异步复制IO线程中断
后端
yyuuuzz2 小时前
独立站搭建:从基础到避坑的实战分享
前端·javascript·github
老马95272 小时前
opencode3-我的能力超乎你的想象
人工智能·后端
weixin_408099672 小时前
【企业级方案】财务自动化:OCR发票识别 + 自动录入系统完整实现(附代码与落地架构)
后端·ocr·api·发票 ocr 识别·发票自动录入系统·发票识别 api·财务自动化
白毛大侠2 小时前
LVS 完全入门:从零理解 Linux 虚拟服务器的三种模式
linux·服务器·lvs
千寻简2 小时前
一个让 Claude Code 顺手很多的状态栏插件:claude-hud
前端·后端
掘金者阿豪2 小时前
数据库安全第一关:用户密码存储与认证机制的深度拆解
java·前端·后端
星浩AI2 小时前
你和 10 倍生产力之间,差的就是它 : claude-howto,用一个周末掌握ClaudeCode
github·claude·vibecoding