# Linux运维Day05:Keepalived热备基础,Keepalived+LVS实现负载均衡

前言

在企业级服务部署中,单点故障是业务稳定运行的核心隐患。Keepalived作为基于VRRP协议的高可用工具,可解决服务单点问题;结合LVS(Linux Virtual Server)后,既能实现负载均衡分发流量,又能保障调度器高可用,是Web服务集群的经典部署方案。本文将从Keepalived基础热备、Keepalived+LVS高可用调度器两大核心场景,完整拆解部署原理、配置步骤与验证方法。

一、Keepalived热备基础

1.1 Keepalived概述

  • 核心痛点:调度器/服务节点出现单点故障,导致业务中断。
  • 核心作用:实现高可用集群 ,最初专为LVS设计,用于监控服务器节点状态;后续集成VRRP协议,彻底解决单点故障问题。
  • Keepalived作用:
    • 定义LVS集群,向集群中添加RS(Real Server)
    • 对集群成员进行健康检查(监控健康状态)
    • 支持VRRP虚拟路由冗余协议,可以进行及时且平滑的故障切换,防止单点故障
  • 核心优势:故障自动检测、自动剔除故障节点、节点恢复后自动加入集群,全程无需人工干预。

VRRP协议:又叫虚拟路由冗余(备份)协议,是热备的关键

1.2 Keepalived运行原理

  1. 实时检测集群内所有服务器节点的运行状态;
  2. 节点异常/故障时,自动将故障节点从集群中剔除;
  3. 故障节点恢复正常后,自动将其重新加入集群;
  4. 所有工作自动完成,无需人工干预。 基于VRRP协议实现VIP(虚拟IP)浮动,客户端仅访问VIP,无需感知后端节点变化。

1.3 高可用Web案例部署

  • 客户端访问VIP,VIP会落在优先级高的服务器上

或者说优先级高的称为主服务器,优先级低的称为备用服务器,主服务器故障,自动切换为备用服务器

这里的VIP又称为浮动IP

优先级高的节点,默认会成为 MASTER(主服务器),VIP 会绑定在它的网卡上,客户端访问 VIP 时,流量会被路由到这台主服务器。

优先级低的节点,默认是 BACKUP(备用服务器)。

两台节点本地都配置同一 VIP,凭借优先级区分主备,不会出现 IP 冲突。

当主服务器故障(或业务检测失败),备用服务器会自动升级为新的主服务器,VIP 会 "漂移" 到备用服务器上,客户端访问无感知。

1.3.1 实验环境
  • 使用template模板机 下方4台虚拟机
  • 配置IP地址,使用WindTerm远程连接虚拟机
1.3.2 部署Web服务(web1+web2)
web1部署httpd
  • web1主机安装httpd,配置默认首页内容为web1
bash 复制代码
[root@web1 ~]# dnf -y install httpd                    #安装httpd
[root@web1 ~]# echo  web1 >  /var/www/html/index.html  #编写首页文件
[root@web1 ~]# systemctl  enable  httpd  --now         #启动服务并将服务设置开机自启
[root@web1 ~]# ss -nutlp | grep :80                    #查看端口
web2部署httpd
bash 复制代码
# 安装httpd服务
[root@web2 ~]# dnf -y install httpd
# 配置默认首页,标识web2
[root@web2 ~]# echo web2 > /var/www/html/index.html
# 启动服务并设置开机自启
[root@web2 ~]# systemctl enable httpd --now
# 验证80端口监听
[root@web2 ~]# ss -nutlp | grep :80
1.3.3 web1部署Keepalived(主节点)
  • web1主机安装keepalived,配置VIP
  • keepalived主配置文件:/etc/keepalived/keepalived.conf
安装并备份配置
bash 复制代码
# 安装keepalived
[root@web1 ~]# dnf -y install keepalived
# 备份默认配置文件
[root@web1 ~]# cp /etc/keepalived/keepalived.conf /opt/
配置Keepalived(主节点MASTER)
bash 复制代码
[root@web1 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {                         #当发生故障切换的时候,给谁发送邮件
     lisi@test.com                               #收件人邮箱,写自己的邮箱就可以了
   }
   notification_email_from root@localhost       #设置发件人的邮箱
   smtp_server 192.168.8.100                    #邮件服务器地址
   smtp_connect_timeout 30                      #邮件的连接超时时间,单位为秒
   router_id LVS_1                              #定义路由ID,相当于机器名,每个机器的ID必须不一样
   vrrp_skip_check_adv_addr						#跳过检查IP地址
   vrrp_strict                                  #严格遵循VRRP协议
   vrrp_garp_interval 0                         #当设备故障,用来通知交换机,"我故障了",0标识最快速度发送
   vrrp_gna_interval 0                          #邻居(即备用主机)通告间隔
}

vrrp_instance VI_1 {                            #定义一个高可用的实例,名字叫做VI_1
    state MASTER                                #状态,此主机扮演的角色为MASTER(主服务器)
    interface ens160                            #绑定在ens160网卡(VIP在这个网卡上飘)
    virtual_router_id 51                        #虚拟路由ID(集群ID),相当于组号。数字随意,但是主备服务器必须一样
    priority 100                                #优先级,数字越大越优先成为主,备用服务器必须小于主服务器的数字
    advert_int 1                                #心跳检测的间隔,1秒钟进行一次存活检测
    authentication {                            #集群认证(防止乱入节点)
        auth_type PASS                          #认证方式,密码认证
        auth_pass 1111                          #密码为1111(主备必须一致)
    }
    virtual_ipaddress {                         #虚拟IP(VIP,也叫浮动ip)
        192.168.8.80                            #VIP地址
    }
}

红色部分是需要我们修改的内容

启动服务并验证VIP
bash 复制代码
# 启动keepalived并设置开机自启
[root@web1 ~]# systemctl enable keepalived --now
# 查看网卡,确认VIP已绑定
[root@web1 ~]# ip a s ens160

可以看到多了一个 8.80/32的浮动ip

(细节补充:虽然两台web服务器是几乎一样的配置,但是主服务器存在时,副服务器上使用ip a s命令是无法看到配置的VIP的)

1.3.4 web2部署Keepalived(备节点)
安装并备份配置
bash 复制代码
# 安装keepalived
[root@web2 ~]# dnf -y install keepalived
# 备份默认配置文件
[root@web2 ~]# cp /etc/keepalived/keepalived.conf /opt/
配置Keepalived(备节点BACKUP)
bash 复制代码
[root@web2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     lisi@test.com
   }
   notification_email_from root@localhost
   smtp_server 192.168.8.200
   smtp_connect_timeout 30
   router_id LVS_2                              # 路由ID(与主节点不同)
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP                                 # 角色:备节点
    interface ens160
    virtual_router_id 51
    priority 80                                 # 优先级(低于主节点,备机默认不抢VIP)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.8.80
    }
}
启动服务并验证(主节点)
bash 复制代码
# 启动keepalived并设置开机自启
[root@web2 ~]# systemctl enable keepalived --now
# 查看网卡,此时备节点无VIP(主节点正常)
[root@web2 ~]# ip a s ens160
1.3.5 客户端验证高可用
正常访问(主节点提供服务)
bash 复制代码
# 客户端访问VIP,返回web1内容
[root@client ~]# curl 192.168.8.80
web1
模拟主节点故障,验证VIP浮动
bash 复制代码
# 停止web1的keepalived,模拟故障
[root@web1 ~]# systemctl stop keepalived
# 查看web2网卡,VIP已自动浮动到备节点
[root@web2 ~]# ip a s ens160
# 客户端再次访问,返回web2内容,业务无中断
[root@client ~]# curl 192.168.8.80
web2

二、Keepalived+LVS高可用负载均衡

实验拓扑图:

VIP直接配置在网卡ens192上

2.1 架构概述

  • 核心痛点:LVS调度器单点故障,导致整个负载均衡集群瘫痪。
  • 架构方案:主备LVS调度器+Keepalived高可用+LVS-DR模式+Real Server
  • 核心逻辑:
    1. 主备调度器共享VIP,Keepalived实现VIP浮动;
    2. LVS负责将客户端流量分发到后端Real Server;
    3. LVS-DR模式:直接路由模式,Real Server直接响应客户端,调度器仅转发请求;
    4. Real Server配置伪装VIP(lo网卡),并修改内核参数抑制ARP响应,避免IP冲突。

实验目的简述:在调度器(LVS)上配置Keepalived高可用,防止单点故障

2.2 实验环境

  • 客户端:client(192.168.8.10/24)
  • LVS调度器:lvs1(192.168.8.5/24,主)、lvs2(192.168.8.6/24,备)
  • 共享VIP:192.168.8.50/24
  • Real Server:web1(192.168.8.100/24)、web2(192.168.8.200/24)
  • Real Server伪装VIP:192.168.8.50/32(lo网卡)
  • 网络模式:vmnet8(同网段互通)

2.3 环境清理(复用Web节点)

  • 停止keepalived服务
bash 复制代码
# web1停止keepalived,清理旧VIP
[root@web1 ~]# systemctl stop keepalived
[root@web1 ~]# ip a s

# web2停止keepalived,清理旧VIP
[root@web2 ~]# systemctl stop keepalived
[root@web2 ~]# ip a s

2.4 主调度器lvs1配置

  • lvs1主机安装keepalived
  • keepalived主配置文件:/etc/keepalived/keepalived.conf
2.4.1 安装依赖
bash 复制代码
# 安装keepalived和ipvsadm(LVS管理工具)
[root@lvs1 ~]# dnf -y install keepalived ipvsadm
# 备份配置文件
[root@lvs1 ~]# cp /etc/keepalived/keepalived.conf /opt/
2.4.2 配置Keepalived+LVS
bash 复制代码
[root@lvs1 ~]# vim   /etc/keepalived/keepalived.conf  修改配置文件
global_defs {
   notification_email {                         #当发生故障切换的时候,将邮件发送给谁
     lisi@test.com                              #收件人邮箱
   }
   notification_email_from root@localhost       #设置发件人邮箱
   smtp_server 192.168.8.5                      #邮件服务器地址
   smtp_connect_timeout 30                      #邮件的连接超时时间
   router_id LVS_1                              #路由ID,相当于机器名,每个机器的ID必须不一样
   vrrp_skip_check_adv_addr
   vrrp_strict                                  #严格遵循VRRP协议
   vrrp_garp_interval 0                         #用来通知交换机"我的VIP换了",0标识最快速度发送
   vrrp_gna_interval 0                          #邻居通告间隔
}

vrrp_instance VI_1 {                            #定义一个高可用的实例,名字叫做VI_1
    state MASTER                                #角色为MASTER
    interface ens160                            #绑定在ens160网卡(VIP在这个网卡上飘)
    virtual_router_id 51                        #集群ID,主备必须一样
    priority 100                                #优先级,数字越大越优先成为主
    advert_int 1                                #心跳包发送间隔、1秒钟发送一次检测存活
    authentication {                            #集群认证(防止乱入节点)
        auth_type PASS                          #认证模式,密码认证
        auth_pass 1111                          #密码1111(主备必须一致)
    }
    virtual_ipaddress {                         #虚拟IP(VIP)
        192.168.8.50                            #VIP地址
    }
}


virtual_server 192.168.8.50 80 {                #定义LVS虚拟服务器,VIP 192.168.8.50 80端口
    delay_loop 6                                #每隔6秒检查一次后端服务器是否存活
    lb_algo rr                                  #负载均衡算法为: rr轮询
    lb_kind DR                                  #LVS模式: DR
    persistence_timeout 50                      #会话保持时间50(持续50秒都是一个主机提供服务)
    protocol TCP                                #协议TCP
    
 real_server 192.168.8.100 80 {                 #真实服务器的地址 和 端口号
        weight 1
        TCP_CHECK {                             #健康检查方式 TCP 端口检查
            connect_timeout 3                   #连接超时时间为3秒
            retry 3                             #失败后再重新尝试3次
            delay_before_retry 3                #每次重试前等待3秒
        }
    }
    real_server 192.168.8.200 80 {              #真实服务器的地址 和 端口号
        weight 1
        TCP_CHECK {                             #健康检查方式 TCP 端口检查
            connect_timeout 3                   #连接超时时间3秒
            retry 3                             #失败重新3次
            delay_before_retry 3                #重试前等待3秒
        }
    }
}

截图中红色部分即需要修改的内容:

注意该配置: persistence_timeout 50 #会话保持时间50(持续50秒都是一个主机提供服务),测试的时候可以适当调整该参数

2.4.3 启动服务并验证
bash 复制代码
[root@lvs1 ~]# dnf -y install ipvsadm          #安装ipvsadm,查看集群
[root@lvs1 ~]# systemctl start keepalived      #重启服务
[root@lvs1 ~]# ip a s ens160                   #查看网卡已经有了 浮动IP(VIP)
[root@lvs1 ~]# ipvsadm -Ln                     #查看集群状态

注意,这里安装ipvsadm 仅仅是为了可以使用-Ln命令查看集群

2.5 备调度器lvs2配置

2.5.1 安装依赖并同步配置
  • lvs2主机安装keepalived
  • keepalived主配置文件:/etc/keepalived/keepalived.conf
  • lvs2主机直接从lvs1主机下载keepalived.conf,再做个性化修改即可
bash 复制代码
# 安装keepalived和ipvsadm
[root@lvs2 ~]# dnf -y install keepalived ipvsadm
# 备份配置文件
[root@lvs2 ~]# cp /etc/keepalived/keepalived.conf /opt/
# 从主调度器同步配置文件
[root@lvs2 ~]# scp root@192.168.8.5:/etc/keepalived/keepalived.conf /etc/keepalived/
2.5.2 修改备节点配置

lvs2修改keepalived.conf配置文件

bash 复制代码
[root@lvs2 ~]# vim /etc/keepalived/keepalived.conf
# 修改3处核心配置
router_id LVS_2                              # 路由ID(唯一)
state BACKUP                                 # 角色:备节点
priority 80                                  # 优先级(低于主节点)
2.5.3 启动服务并验证
bash 复制代码
# 启动keepalived
[root@lvs2 ~]# systemctl start keepalived
# 查看LVS集群规则
[root@lvs2 ~]# ipvsadm -Ln

2.6 Real Server(web1+web2)配置

2.6.1 配置lo网卡伪装VIP(web1)
  • web1安装network服务,配置伪装IP,配置在lo网卡的虚拟接口上
  • 伪装IP配在本地回环 lo 网卡,可通过内核参数禁止 lo 上 VIP 发送 ARP 应答,只让调度器响应 ARP
    (配置完伪装IP之后不可以立刻重启网络服务,必须配置完核参数抑制ARP响应之后再重启)
bash 复制代码
# 安装network服务(用于配置lo虚拟网卡)
[root@web1 ~]# dnf -y install network-scripts
# 进入网卡配置目录
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
# 复制lo网卡配置,创建虚拟接口lo:0
[root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
# 编辑lo:0配置
[root@web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0									 #设备名称
IPADDR=192.168.8.50                          # 伪装VIP(与调度器VIP一致)
NETMASK=255.255.255.255                      # 32位掩码,仅本机生效
ONBOOT=yes									 #开机自动启动此配置
BOOTPROTO=static							 #配置方式为静态手动配置
2.6.2 内核参数抑制ARP响应(web1)
  • web1防止地址冲突,修改内核参数,禁止对外广播自己是192.168.4.50
bash 复制代码
# 编辑内核参数配置文件
[root@web1 ~]# vim /etc/sysctl.conf
# 添加以下4行,抑制lo网卡VIP的ARP响应
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
#当有arp广播问谁是192.168.4.15时,本机忽略该ARP广播,不做任何回应
#本机不要向外宣告自己的lo回环地址是192.168.4.50

# 生效内核参数
[root@web1 ~]# sysctl -p
# 重启网络服务
[root@web1 ~]# systemctl restart network
# 验证lo网卡VIP配置
[root@web1 ~]# ip a s
#查看ip地址,lo网卡上边已经有了4.50的伪装IP
2.6.3 web2重复上述配置
bash 复制代码
# 安装network服务
[root@web2 ~]# dnf -y install network-scripts
# 复制lo配置
[root@web2 ~]# cd /etc/sysconfig/network-scripts/
[root@web2 network-scripts]# cp ifcfg-lo ifcfg-lo:0
# 配置lo:0
[root@web2 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.8.50
NETMASK=255.255.255.255
ONBOOT=yes
BOOTPROTO=static

# 配置内核参数
[root@web2 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2

# 生效并验证
[root@web2 ~]# sysctl -p
[root@web2 ~]# systemctl restart network
[root@web2 ~]# ip a s

2.7 客户端验证负载均衡与高可用

2.7.1 正常访问(会话保持50秒)
  • client主机访问VIP:http://192.168.8.50,50秒内由同一个服务器提供服务
  • 因为keepalived中有persistence_timeout 50配置
bash 复制代码
# 客户端访问VIP,50秒内固定访问同一节点
[root@client~]# curl 192.168.8.50
web1
[root@client~]# curl 192.168.8.50
web1
2.7.2 关闭会话保持,验证轮询
bash 复制代码
# lvs1注释会话保持配置
[root@lvs1 ~]# sed -i '/persistence/s/^./#/' /etc/keepalived/keepalived.conf
#直接注释掉会话保持项
[root@lvs1 ~]# systemctl restart keepalived

# lvs2同步修改
[root@lvs2 ~]# sed -i '/persistence/s/^./#/' /etc/keepalived/keepalived.conf
[root@lvs2 ~]# systemctl restart keepalived

# 客户端访问,实现轮询
[root@client~]# curl 192.168.8.50
web1
[root@client~]# curl 192.168.8.50
web2
2.7.3 模拟调度器故障,验证VIP浮动(健康检查)
  • 模拟lvs1宕机,关闭keepalived服务
  • 此刻VIP会自动浮动至lvs2主机,客户端不影响问访问
bash 复制代码
# 停止主调度器lvs1的keepalived
[root@lvs1 ~]# systemctl stop keepalived
# 备调度器lvs2自动绑定VIP
[root@lvs2 ~]# ip a s ens160
# 客户端正常访问,业务无中断
[root@client~]# curl 192.168.8.50
web1
2.7.4 模拟后端节点故障,自动剔除/加入
  • 模拟web1宕机,关闭httpd服务
  • 此刻LVS会自动将其移除集群,再次启动会将此主机再次加入集群(全程自动)
    需要注意,重启服务之后再次加入集群并不是实时的,有等待时间(可手动更改)
bash 复制代码
# 停止web1的httpd服务,模拟故障
[root@web1 ~]# systemctl stop httpd
# 调度器自动剔除故障节点
[root@lvs2 ~]# ipvsadm -Ln
# 客户端仅访问web2
[root@client~]# curl 192.168.8.50
web2

# 恢复web1服务
[root@web1 ~]# systemctl start httpd
# 调度器自动重新加入节点
[root@lvs2 ~]# ipvsadm -Ln
# 客户端恢复轮询
[root@client~]# curl 192.168.8.50
web1

当前架构优化思路:可以使用dns分离解析让两台调度器同时工作,不至于让一台主机一直工作到挂掉

目前架构的缺点:仅能处理静态页面(配置动静分离);无备份(crond周期备份数据;网站部署在额外主机,使用nfs挂载在web主机上)。

三、核心总结

  1. Keepalived核心 :基于VRRP协议实现VIP浮动,解决单点故障;主备节点virtual_router_id、认证密码必须一致router_id、优先级必须不同
  2. LVS-DR模式核心 :Real Server在lo网卡配置伪装VIP(32位掩码),通过内核参数抑制ARP响应,避免IP冲突;调度器仅转发请求,Real Server直接响应客户端,性能更高。
  3. 高可用+负载均衡核心
    • Keepalived保障调度器无单点;
    • LVS实现流量分发与后端节点健康检查;
    • 全程故障自动切换、节点自动上下线,无需人工干预,适合企业级Web服务高并发、高可用场景。
相关推荐
晚风予卿云月12 小时前
【Linux】初步构建框架—虚拟地址空间(二)—mm_struct结构体揭秘与页表标志位
linux·运维·服务器·数据结构
zandy101112 小时前
Hermes Agent 完全安装指南(Linux、macOS、Windows、Android)
linux·windows·macos·agent·安装指南
z2005093012 小时前
【linux学习】Linux中的进程地址空间和fork的使用
linux·网络·学习
草莓熊Lotso12 小时前
LangChain 实战指南:聊天模型与工具调用全解析
linux·c++·python·langchain·软件工程·ai编程
拾光Ծ12 小时前
【Linux系统】线程(下)
linux·运维·线程·条件变量·互斥量·posix信号量
Cloud_Shy61812 小时前
Linux 系统定时任务 Cron(d) 服务应用实践(一:关于用户定时任务的那些事)
linux·运维·服务器·centos·云计算
IpdataCloud12 小时前
IP归属地查询总是不准?原因分析与专业IP数据平台的选择
运维·服务器
薛定猫AI12 小时前
【深度解析】QN 3.7 Max 编码智能体能力:从前端生成到 MCP 工作流自动化实践
运维·前端·自动化
日晨难再12 小时前
cmd&PowerShell:切换工作目录
linux·运维·服务器