keepalived知识点

Keepalived 完整知识点总结

一、核心定位

Keepalived = 基于 VRRP 协议实现的 Linux 高可用(HA)集群软件 核心作用:

  1. 解决单点故障:主服务器宕机,备机自动接管 IP(虚拟 IP VIP 漂移)
  2. 常搭配 LVS、Nginx、Apache、MySQL 实现负载均衡 + 高可用架构
  3. 自带健康检测机制,故障自动切换、恢复自动切回

二、底层协议:VRRP(虚拟路由冗余协议)

1. VRRP 基础概念

  • VRRP 组:一组主备服务器共用一个虚拟 VIP,同一网段
  • MASTER(主节点):正常工作,持有 VIP,持续发送 VRRP 广播报文(通告)
  • BACKUP(备节点):平时休眠,监听主节点报文
  • 虚拟路由器 ID(VRID):一组主备统一编号(0~255),同 VRID 才属于同一集群
  • 优先级 priority:数值越大优先级越高(默认 100),决定主备身份

2. 切换原理

  1. Master 每隔advert_int(默认 1s) 向组播地址 224.0.0.18 发送 VRRP 通告
  2. Backup 收不到通告超时后(默认 3 倍通告时间 = 3s),判定主节点故障
  3. 优先级最高的 Backup 升级为 Master,抢占 VIP,业务无缝切换

3. 抢占模式 vs 非抢占模式

  • 抢占模式(默认):故障主机恢复上线后,优先级更高会重新抢回 VIP
  • 非抢占 nopreempt:主节点修好上线,也不夺回 VIP,避免频繁抖动,生产常用

三、Keepalived 三大核心模块

1. VRRP Stack(VRRP 协议栈)

负责主备选举、VIP 漂移、VRRP 报文收发,最核心模块

2. Checkers(健康检测模块)

对后端服务 / 本机业务做存活探测,探测失败会降低本机优先级、直接释放 VIP 支持探测方式:

  • TCP 端口检测(最常用:检测 Nginx 80 端口)
  • HTTP/HTTPS 请求检测
  • 脚本自定义检测(shell 脚本,灵活适配 MySQL、业务进程等)

3. IPVS Stack(LVS 负载均衡模块)

内置 LVS 管理能力,可直接配置 LVS 四种调度模式,实现四层负载均衡 + 高可用 调度算法:rr、wrr、lc、wlc、sh、dh 等

四、核心配置文件详解

路径:/etc/keepalived/keepalived.conf 整体结构:全局配置 → VRRP 实例配置 → 健康检查配置

1. 全局段 global_defs

global_defs {
   router_id LVS_01       # 节点唯一标识,主备不一样
   notification_email {   # 故障告警邮箱
     xxx@163.com
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   vrrp_mcast_group4 224.0.0.18 # VRRP组播地址
}

2. VRRP 实例段 vrrp_instance VI_1(主备核心)

vrrp_instance VI_1 {
    state MASTER        # 主节点写MASTER,备节点BACKUP
    interface eth0      # 绑定网卡(承载VIP)
    virtual_router_id 51 # VRID,主备必须完全一致
    priority 150        # 优先级:主>备(备一般设100)
    advert_int 1        # 通告间隔1秒
    nopreempt           # 关闭抢占(可选)
    authentication {    # VRRP报文认证,主备密码一致
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress { # 漂移VIP,可多个
        192.168.1.100/24 dev eth0 label eth0:0
    }
    # 切换触发脚本:主变备、备变主执行自定义脚本
    notify_master "/etc/keepalived/master.sh"
    notify_backup "/etc/keepalived/backup.sh"
    notify_fault "/etc/keepalived/fault.sh"
}

3. 健康检查 vrrp_script 示例

检测 Nginx 进程,异常则优先级下调 50,让出 VIP

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2    # 2秒检测一次
    weight -50    # 检测失败,优先级减50
}
# 将脚本挂载到vrrp实例
track_script {
    chk_nginx
}

简易检测脚本 check_nginx.sh

#!/bin/bash
systemctl is-active --quiet nginx
exit $?

五、两种主流部署架构

1. 主备架构(单 VIP,最常用)

一台 MASTER + 一台 BACKUP 优点:简单稳定;缺点:备机平时闲置,资源浪费

2. 双主架构(互为主备,双 VIP)

两台节点互相作为对方备机

  • 节点 1:VI1 主(VIP1)、VI2 备
  • 节点 2:VI1 备、VI2 主(VIP2) 优点:两台机器同时承载业务,资源利用率翻倍

六、常见启停、查看命令

# 安装
yum install keepalived -y / apt install keepalived -y

# 启停
systemctl start keepalived
systemctl stop keepalived
systemctl restart keepalived
systemctl enable keepalived

# 查看运行状态
systemctl status keepalived

# 查看VIP是否绑定
ip addr

# 日志排查(故障首选)
tail -f /var/log/messages
journalctl -u keepalived -f

# 抓包查看VRRP报文
tcpdump -i eth0 vrrp

七、故障切换场景(触发 VIP 切换)

  1. Keepalived 进程意外退出
  2. 本机网卡宕机、IP 地址丢失
  3. 健康检测脚本探测业务异常(Nginx/MySQL 挂掉)
  4. 服务器关机、断电、内核崩溃

八、生产环境注意事项

  1. 防火墙放行 VRRP:放行组播 224.0.0.18,协议号 112
    firewall-cmd --add-protocol=vrrp --permanent
    
  2. 关闭抢占模式:避免主节点恢复后频繁切换引发业务波动
  3. 禁止单节点多 VRID 冲突;同 VRID 必须网段一致
  4. 健康检测必不可少:不仅检测服务器,还要检测上层业务
  5. 内网环境慎用组播:交换机关闭组播会导致主备双主(都抢到 VIP,IP 冲突) 组播异常解决方案:改用单播模式 unicast_peer
    unicast_peer {
        192.168.1.11  # 对端节点IP
    }
    
  6. VIP 不要和物理 IP 网段冲突

九、常见问题

  1. 双主现象(两端都拿到 VIP) 原因:VRRP 报文不通(防火墙拦截、交换机禁用组播、VRID 不一致、密码不同)
  2. 主节点恢复后 VIP 切回频繁 解决:添加 nopreempt 非抢占
  3. 业务宕机但 VIP 不切换 原因:未配置业务健康检测,只检测系统存活

十、典型应用场景

  1. Nginx+Keepalived:Web 服务高可用
  2. LVS+Keepalived:四层负载均衡集群
  3. MySQL 主从 + Keepalived:数据库 VIP 高可用
  4. Redis、Tomcat 等中间件单点 HA 保障

十一、Keepalived+Nginx 双主架构实操 + NFS 网页共享

一、环境规划不变

节点物理 IP网卡角色VIP
node1192.168.118.100ens160VI1 主、VI2 备VIP1:192.168.118.200
node2192.168.118.101ens160VI1 备、VI2 主VIP2:192.168.10.201

架构特点:

  1. 两台机器同时跑 Nginx,分别承载两个 VIP 流量,资源不闲置
  2. 任意一台宕机,两个 VIP 全部漂移至另一台,业务不间断
  3. NFS 统一存放网页文件,两台 Nginx 页面内容完全一致,切换无内容差异

二、前期统一操作(两台节点都执行)

1. 安装软件
# CentOS
yum install nginx keepalived nfs-utils rpcbind -y
# Ubuntu
apt install nginx keepalived nfs-kernel-server -y
2. 关闭防火墙 + SELinux(测试环境)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
3. 编写 Nginx 健康检测脚本(两台一致)
vim /etc/keepalived/check_nginx.sh
#!/bin/bash
systemctl is-active --quiet nginx
exit $?

赋权:

chmod +x /etc/keepalived/check_nginx.sh

三、部署 NFS 共享网页目录(统一页面内容)

方案:node1 充当 NFS 服务端,共享网页目录;node2 挂载使用

1)node1(NFS 服务端)配置
  1. 创建共享目录
mkdir -p /data/nginx_html
# 写入统一首页内容
echo "Nginx双主高可用集群 | 共享网页目录" > /data/nginx_html/index.html
  1. 编辑 NFS 配置文件
vim /etc/exports

写入:

/data/nginx_html 192.168.118.0/24(rw,sync,no_root_squash)

参数解释:

  • 192.168.118.0/24:允许整个网段挂载
  • rw:读写权限
  • sync:同步写入磁盘
  • no_root_squash:root 用户权限不压缩
  1. 启动 NFS、rpcbind 并开机自启
systemctl start rpcbind nfs-server
systemctl enable rpcbind nfs-server
# 生效配置
exportfs -r
# 查看共享
showmount -e localhost
2)node2(客户端)挂载共享目录
# 临时挂载
mount 192.168.118.100:/data/nginx_html /usr/share/nginx/html
# 永久挂载(开机自动挂载)
vim /etc/fstab
# 添加一行
192.168.118.100:/data/nginx_html  /usr/share/nginx/html  nfs defaults 0 0
# 验证挂载
mount -a
df -h
3)两台 Nginx 统一网页目录

node1 修改 nginx 默认网页根目录指向本地共享文件夹:

vim /etc/nginx/nginx.conf
# 找到 root 配置,修改
root /data/nginx_html;

node2 无需修改,已经挂载好了。

启动 Nginx:

systemctl start nginx
systemctl enable nginx

分别访问两台机器 IP,页面内容完全相同。

四、Keepalived 双主配置文件

清空原有配置:> /etc/keepalived/keepalived.conf

node1 完整配置

global_defs {
   router_id nginx_node1
}

# Nginx健康检测脚本
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -50
}

# 实例1:VIP1 192.168.118.100 node1为主
vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 51
    priority 150
    advert_int 1
    # 单播通信,规避交换机组播问题
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.118.200/24 dev ens160
    }
    track_script {
        chk_nginx
    }
}

# 实例2:VIP2 192.168.118.101 node1为备
vrrp_instance VI_2 {
    state BACKUP
    interface ens160
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.118.201/24 dev ens160
    }
    track_script {
        chk_nginx
    }
}

node2 完整配置

global_defs {
   router_id nginx_node2
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -50
}

# 实例VI_1:VIP 192.168.10.100 备节点
vrrp_instance VI_1 {
    state BACKUP
    interface ens160
    virtual_router_id 51
    priority 100
    advert_int 1
    nopreempt

    unicast_peer {
        192.168.118.100
    }

    authentication {
        auth_type PASS
        auth_pass Vrrp@8899
    }

    virtual_ipaddress {
        192.168.10.100/24
    }

    track_script {
        chk_nginx
    }
}

# 实例VI_2:VIP 192.168.10.200 主节点
vrrp_instance VI_2 {
    state BACKUP
    interface ens160
    virtual_router_id 52
    priority 150
    advert_int 1
    nopreempt

    unicast_peer {
        192.168.118.100
    }

    authentication {
        auth_type PASS
        auth_pass Vrrp@8899
    }

    virtual_ipaddress {
        192.168.10.200/24
    }

    track_script {
        chk_nginx
    }
}

配置关键点总结

  1. VRID 必须不同:VI1=51,VI2=52
  2. 优先级错开:主 150、备 100
  3. 互相写入对方 IP,开启单播,杜绝双主 IP 冲突
  4. 密码两台全程一致

五、启动服务

两台节点依次执行:

systemctl start keepalived
systemctl enable keepalived
systemctl status keepalived

六、分场景测试验证

场景 1:正常运行状态

  1. node1 网卡:拥有 192.168.10.100
  2. node2 网卡:拥有 192.168.10.200 访问:

场景 2:关闭 node1 的 Nginx

node1 执行:

systemctl stop nginx

检测脚本失败,优先级下降 50 结果: VIP1 10.100 漂移到 node2 此时两个 VIP 都在 node2,全部流量由 node2 承接 访问两个 VIP 均可正常打开网页

场景 3:node1 整机关机断电

node1 直接关机 3 秒左右切换完成: VIP1、VIP2 全部漂移至 node2,业务无中断

场景 4:node1 重新开机上线

两台重新恢复初始状态: VIP1 回归 node1、VIP2 留在 node2,再次负载分担

场景 5:修改网页内容统一生效

node1 修改首页:

echo "更新后的网页内容 双主+NFS集群" > /data/nginx_html/index.html

刷新两个 VIP 页面,内容同步更新

七、生产优化补充

1. NFS 单点隐患解决

NFS 搭建在 node1 存在单点故障,两种方案:

  1. 改用rsync+inotify实时双向同步网页文件(无单点)
  2. 搭建 NFS 主备集群
2. 关闭抢占模式

需要稳定不频繁切换时,在 vrrp_instance 内添加 nopreempt

3. 日志排查
# 实时日志
journalctl -u keepalived -f
# 抓包vrrp报文
tcpdump -i ens33 vrrp
4. 客户端统一访问

前端 DNS 可以将两个 VIP 做轮询解析,实现入口负载均衡。

八、常见故障

  1. 挂载 NFS 失败:防火墙、端口 2049 未放行
  2. 双主抢 VIP:VRID 不一致、密码错误、未开单播
  3. Nginx 宕机不切换:没配置 vrrp_script 健康检测
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值