Keepalived基础实现

目录

[1 实验环境](#1 实验环境)

[2 主备模式](#2 主备模式)

[3 单波模式](#3 单波模式)

[4 日志分离](#4 日志分离)

[5 独立子配置文件](#5 独立子配置文件)

[6 非抢占模式](#6 非抢占模式)

[7 延迟抢占](#7 延迟抢占)

[8 业务VIP迁移告警](#8 业务VIP迁移告警)

[8.1 邮件告警环境](#8.1 邮件告警环境)

[8.2 设定告警脚本](#8.2 设定告警脚本)

[9 双主互备模式](#9 双主互备模式)


1 实验环境

复制代码
 # RS配服务
 [root@RS1 ~]# dnf install httpd -y >/dev/null
 [root@RS1 ~]# echo RS1 - 172.25.254.20 > /var/www/html/index.html
 [root@RS1 ~]# systemctl enable --now httpd
 [2026-02-22 02:16.46]  ~
 [Is XiaFeng Computer.IsXiaFengComputer] ⮞ curl 172.25.254.20
 RS1 - 172.25.254.20
 [2026-02-22 02:18.05]  ~
 [Is XiaFeng Computer.IsXiaFengComputer] ⮞ curl 172.25.254.30
 RS2 - 172.25.254.30
 # 设定本地解析(四台都有彼此的)
 [root@KA1 ~]# vim /etc/hosts
 [root@KA1 ~]# tail -n4 /etc/hosts
 172.25.254.50   KA1
 172.25.254.60   KA2
 172.25.254.20   RS1
 172.25.254.30   RS1
 [root@KA1 ~]# for i in {60,20,30};do
 > scp /etc/hosts 172.25.254.$i:/etc/hosts
 > done
 # KA时间源同步
 # KA1允许KA2同步时间源
 [root@KA1 ~]# vim /etc/chrony.conf
  26 #allow 192.168.0.0/16
  27 allow 172.25.254.60/32
  28
  29 # Serve time even if not synchronized to a time source.
  30 #local stratum 10
  31 local stratum 10
 [root@KA1 ~]# systemctl restart chronyd
 [root@KA1 ~]# systemctl enable --now chronyd
 # KA2同步KA1时间源
 [root@KA2 ~]# vim /etc/chrony.conf
   3 #pool 2.rhel.pool.ntp.org iburst
   4 pool 172.25.254.50 iburst
 [root@KA2 ~]# systemctl restart chronyd
 [root@KA2 ~]# systemctl enable --now chronyd
 [root@KA2 ~]# chronyc sources -v
 ………………
 MS Name/IP address         Stratum Poll Reach LastRx Last sample
 ===============================================================================
 ^* KA1                           2   6    17     4  +1285ns[  +27us] +/-   50ms

2 主备模式

复制代码
 # KA1设定为Master,KA2设定为Backup
 [root@KA2 ~]# dnf install keepalived.x86_64 -y >/dev/null
 # 在Master
 [root@KA1 ~]# vim /etc/keepalived/keepalived.conf
   3 global_defs {
 ………………
  12    router_id KA1
  13    vrrp_skip_check_adv_addr
  14    #vrrp_strict
  15    vrrp_garp_interval 1
  16    vrrp_gna_interval 1
  17    vrrp_mcast_group4 224.0.0.44
  18 }
  20 vrrp_instance VI_1 {
 ………………
  30     virtual_ipaddress {
  31         172.25.254.100/24 dev eth0 label eth0:0
  32     }
  33 }
 [root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
 [root@KA1 ~]# systemctl enable --now keepalived.service
 [root@KA1 ~]# scp /etc/keepalived/keepalived.conf root@172.25.254.60:/etc/keepalived/keepalived.conf
 [root@KA1 ~]# ip a | grep eth0:0$
     inet 172.25.254.100/24 scope global secondary eth0:0
 ​
 # 在Backup
 # 改state、priority即可
   3 global_defs {
 ………………
  12    router_id KA2
 ………………
  18 }
  20 vrrp_instance VI_1 {
  21     state BACKUP
  22     interface eth0
  23     virtual_router_id 51
  24     priority 80     # 比主(100)低即可
 ………………
  33 }

测试:

3 单波模式

为什么要单播,组播模式使用的网址资源最少,但是不能跨网络,如果主备两台主机是跨网络的,那么只能启用单播来实现vrrp通告。

复制代码
 # KA1
 [root@KA1 ~]# vim /etc/keepalived/keepalived.conf
   3 global_defs {
 ………………
  17    #vrrp_mcast_group4 224.0.0.44    # 关闭组播
  18 }
  19
  20 vrrp_instance WEB_VIP {
 ………………
  24     priority 100
  25     advert_int 1
  26     unicast_src_ip 172.25.254.50        # 指定单播源地址,通常是本机IP
  27     unicast_peer {
  28       172.25.254.60                     # 指定单播接收地址
  29     }
 ………………
  37 }
 [root@KA1 ~]# systemctl reload keepalived.service
 # KA2
 [root@KA2 ~]# vim /etc/keepalived/keepalived.conf
   3 global_defs {
 ………………
  17    #vrrp_mcast_group4 224.0.0.44
  18 }
  19
  20 vrrp_instance WEB_VIP {
 ………………
  24     priority 80
  25     advert_int 1
  26     unicast_src_ip 172.25.254.60        # 指定单播源地址,通常是本机IP
  27     unicast_peer {
  28       172.25.254.50                     # 指定单播接收地址
  29     }
 ………………
  37 }
 [root@KA2 ~]# systemctl reload keepalived.service
 # 测试:
 # 在KA1正常时KA2播报信息不显示通告内容;KA1出现故障时VIP会被迁移到KA2,KA2上开始显示播报内容,当KA1恢复时,VIP因为优先级被KA1抢占,KA2中播报停止。

4 日志分离

默认情况下。keepalived的日志会被保存在/var/log/messages文件中,这个文件中除了含有keepalived的日志外,还有其他服务的日志信息,这样不利于对于keepalived的日志进行查看

复制代码
 [root@KA1 ~]# vim /etc/sysconfig/keepalived
  14 #KEEPALIVED_OPTIONS="-D"
  15 KEEPALIVED_OPTIONS="-D -S 6"
 [root@KA1 ~]# systemctl restart keepalived.service      #  这里用reload的话不会产生文件
 [root@KA1 ~]# vim /etc/rsyslog.conf
  69 local6.*                                                /var/log/keepalived.log
 [root@KA1 ~]# systemctl restart rsyslog.service
 [root@KA1 ~]# ll /var/log/keepalived.log
 -rw------- 1 root root 6827 Feb 22 04:12 /var/log/keepalived.log

5 独立子配置文件

复制代码
 [root@KA1 ~]# vim /etc/keepalived/keepalived.conf
  19 include /etc/keepalived/conf.d/*.conf           #指定独立子配置文件
 [root@KA1 ~]# mkdir -p /etc/keepalived/conf.d
 [root@KA1 ~]# vim /etc/keepalived/conf.d/webvip.conf
   1 vrrp_instance WEB_VIP {
 ………………
  14 }
  15
  16 vrrp_instance DB_VIP {
 ………………
  28     }
  29 }
 [root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
 [root@KA1 ~]# systemctl reload keepalived.service
 [root@KA1 ~]# ip a s |grep eth0:1
     inet 172.25.254.100/24 scope global secondary eth0:1

6 非抢占模式

抢占模式 (默认):谁优先级高就把vip放到哪里。

非抢占模式:持有vip只要vrrp通告正常就不做vip迁移

复制代码
 # 非抢占模式互为backup
 #kA1中
 [root@KA1 ~]# vim /etc/keepalived/keepalived.conf
 vrrp_instance WEB_VIP {
     state BACKUP            
     interface eth0
     virtual_router_id 51
     nopreempt               # 启动非抢占模式
     priority 100
 ………………
 }
 [root@KA1 ~]# systemctl stop keepalived.service
 #KA2中
 [root@KA2 ~]# vim /etc/keepalived/keepalived.conf
 vrrp_instance WEB_VIP {
     state BACKUP
     interface eth0
     virtual_router_id 51
     nopreempt               #开启非抢占模式
     priority 80
 ………………
 }
 [root@KA2 ~]# systemctl stop keepalived.service
 #测试:
 [root@KA1 ~]# systemctl start keepalived.service
 [root@KA2 ~]# systemctl start keepalived.service
 [root@KA1 ~]# ifconfig
 ………………
 eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
         inet 172.25.254.100  netmask 255.255.255.0  broadcast 0.0.0.0
         ether 00:0c:29:26:33:d9  txqueuelen 1000  (Ethernet)
 ………………
 [root@KA1 ~]# systemctl stop keepalived.service
 ifconfig[root@KA2 ~]# ifconfig
 ………………
 eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
         inet 172.25.254.100  netmask 255.255.255.0  broadcast 0.0.0.0
         ether 00:0c:29:1e:fd:7a  txqueuelen 1000  (Ethernet)
 ………………
 # 开启KA1的服务ip不会被抢占到1中
 [root@KA1 ~]# ifconfig
 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
         inet 172.25.254.50  netmask 255.255.255.0  broadcast 172.25.254.255
         inet6 fe80::3901:aeea:786a:7227  prefixlen 64  scopeid 0x20<link>
         ether 00:0c:29:26:33:d9  txqueuelen 1000  (Ethernet)
         RX packets 19102  bytes 1561277 (1.4 MiB)
         RX errors 0  dropped 0  overruns 0  frame 0
         TX packets 35034  bytes 3375682 (3.2 MiB)
         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 ………………

7 延迟抢占

复制代码
 # KA1
 [root@KA1 ~]# vim /etc/keepalived/keepalived.conf
  20 vrrp_instance WEB_VIP {
  21     state BACKUP            # 非抢占模式互为backup
  22     interface eth0
  23     virtual_router_id 51
  24     preempt_delay 10                # 启动延迟抢占,延迟10s抢占
  25     priority 100
 ………………
  34 }
 [root@KA1 ~]# systemctl stop keepalived.service
 # KA2
 [root@KA2 ~]# vim /etc/keepalived/keepalived.conf
  20 vrrp_instance WEB_VIP {
  21     state BACKUP
  22     interface eth0
  23     virtual_router_id 51
  24     preempt_delay 10                # 启动延迟抢占,延迟10s抢占
  25     priority 80
 ………………
  34 }
 [root@KA2 ~]# systemctl stop keepalived.service
 # 测试
 [root@KA1 ~]# systemctl start keepalived.service
 [root@KA2 ~]# systemctl start keepalived.service
 [root@KA1 ~]# watch -n 1 ifconfig

测试:

8 业务VIP迁移告警

8.1 邮件告警环境

复制代码
 # 安装邮件软件
 [root@KA1 ~]# dnf install s-nail postfix -y >/dev/null
 [root@KA2 ~]# dnf install s-nail postfix -y >/dev/null
 # 启动邮件代理
 [root@KA1 ~]# systemctl start postfix.service
 [root@KA2 ~]# systemctl start postfix.service

开启IMAP/SMT服务

复制代码
 #在Linux主机中配置mailrc(KA1+KA2)
 [root@KA1+KA2 ~]# vim /etc/mail.rc
 set smtp=smtp.163.com           # SMTP 服务器地址
 set smtp-auth=login             # 认证方式,使用 LOGIN 明文认证
 set smtp-auth-user=             # 发件邮箱账号
 set smtp-auth-password=         # 邮箱密码或授权码,授权码就是刚刚开启IMAP/SMT服务时给的
 set from=                       # 发件人显示地址(通常与 smtp-auth-user 相同)
 set ssl-verify=ignore           # 忽略 SSL 证书验证
 #测试邮件
 [root@KA1 mail]# echo hello | mailx -s test 2319125958@qq.com
 [root@KA1 mail]# mailq      # 查看邮件队列
 Mail queue is empty
 [root@KA1 mail]# mail       # 查看是否又退信
 s-nail version v14.9.22.  Type `?' for help
 /var/spool/mail/root: 1 message
 ▸   1 Mail Delivery Subsys  2026-01-28 16:26   69/2210  "Returned mail: see transcript for details  "
 &q  # 退出
 #查看对应邮箱是否有邮件收到

8.2 设定告警脚本

复制代码
 [root@KA1 ~]# mkdir  -p /etc/keepalived/scripts
 [root@KA2 ~]# mkdir  -p /etc/keepalived/scripts
 [root@KA1 ~]# vim /etc/keepalived/scripts/warning.sh
 #!/bin/bash
 mail_dest='2319125958@qq.com'
 mail_send()
 {
     mail_subj="$HOSTNAME to be $1 vip 转移"
     mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"
     echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
 }
 case $1 in
     master)
     mail_send master
     ;;
     backup)
     mail_send backup
     ;;
     fault)
     mail_send fault
     ;;
     *)
     exit 1
     ;;
 esac
 [root@KA1 ~]# chmod +x /etc/keepalived/scripts/warning.sh   # 后续配置keepalived告警
 [root@KA1 ~]# scp /etc/keepalived/scripts/warning.sh root@172.25.254.60:/etc/keepalived/scripts/warning.sh
 [root@KA1 ~]# sh /etc/keepalived/scripts/warning.sh master
 # 对应邮箱中会出现邮件
 ​
 # 配置keepalived告警
 global_defs {
    notification_email {
      2319125958@qq.com    # 收件人
    }
    notification_email_from xiafeng_68@163.com   # 发件人显示
    smtp_server 127.0.0.1    # 走本地 Postfix 
    smtp_connect_timeout 30
 ………………
    enable_script_security
    script_user root
 }
 vrrp_instance WEB_VIP {
 ………………
     virtual_ipaddress {
         172.25.254.100/24 dev eth0 label eth0:0
     }
     # 使用本地global_defs {}中的脚本时注释掉这些钩子,使用这些钩子时注释掉global_defs {}中的邮件设置。
     #notify_master "/etc/keepalived/scripts/waring.sh master"
     #notify_backup "/etc/keepalived/scripts/waring.sh backup"
     #notify_fault "/etc/keepalived/scripts/waring.sh fault"
 }

当 KA1 的 WEB_VIP 从 master 变 fault 时:Keepalived 会通过内置 SMTP 逻辑,直接调用本地 Postfix 给notification_email { 收件人 }发一封固定内容的邮件(内容由 Keepalived 内置,无法自定义) 。

配置项 作用 触发方式 是否依赖 Postfix
global_defs中的 SMTP 配置 Keepalived 内置邮件告警 Keepalived 进程直接触发(无脚本) 是(依赖本地 SMTP 服务器)
notify_* 钩子 + 自定义脚本 自定义告警(邮件 / 日志 / 其他) 仅通过 notify_* 钩子触发脚本 是(脚本里调用 mail 命令依赖)

9 双主互备模式

复制代码
 # 双主模式目标:两台服务器各持有一个VIP,互为备份。
 # KA1是WEB_VIP主、DB_VIP备;KA2是DB_VIP主、WEB_VIP备。(KA1拿100VIP,KA2拿200VIP)
 # KA1
 [root@KA1 ~]# vim /etc/keepalived/keepalived.conf
  20 vrrp_instance WEB_VIP {
  21     state MASTER        # 第一个虚拟路由,以master身份设定
  22     interface eth0
  23     virtual_router_id 51
  24     priority 100
 …………
  30     virtual_ipaddress {
  31         172.25.254.100/24 dev eth0 label eth0:1
  32     }
  33 }
  34
  35 vrrp_instance DB_VIP {
  36     state BACKUP        # 第二个虚拟路由,以backup身份设定
  37     interface eth0
  38     virtual_router_id 52
  39     priority 80
 ………………
  45     virtual_ipaddress {
  46         172.25.254.200/24 dev eth0 label eth0:0
  47     }
  48 }
 [root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
 [root@KA1 ~]# scp /etc/keepalived/keepalived.conf root@172.25.254.60:/etc/keepalived/keepalived.conf
 [root@KA1 ~]# systemctl reload keepalived.service
 # KA2
 [root@KA2 ~]# vim /etc/keepalived/keepalived.conf
 [root@KA2 ~]# vim /etc/keepalived/keepalived.conf
  20 vrrp_instance WEB_VIP {
  21     state BACKUP
  22     interface eth0
  23     virtual_router_id 51
  24     preempt_delay 10    # 避免VIP“抖动”、保障服务就绪
  25     priority 80
 ………………
  34 }
  35
  36 vrrp_instance DB_VIP {
  37     state MASTER
  38     interface eth0
  39     virtual_router_id 52
  40     preempt_delay 10
  41     priority 100
 ………………
  50 }
 [root@KA2 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
 (DB_VIP) Warning - preempt delay will not work with initial state MASTER - clearing
 [root@KA2 ~]# systemctl reload keepalived.service

preempt_delay 10:延迟10秒后才会尝试抢占VIP

10 秒的延迟能确保:

  1. 故障节点的服务(WEB/DB)完全启动,而非仅 Keepalived 服务启动。

  2. 网络、心跳检测稳定,避免因临时网络波动导致的误抢占。

  3. 减少 VIP 切换对业务的冲击,给应用层足够的时间适应。

  4. 这种延迟机制在高可用环境中非常重要,可以有效避免因网络抖动或不稳定导致的频繁切换。

测试:

相关推荐
linyanRPA31 分钟前
影刀RPA店群自动化实战:多店铺活动自动报名与促销管理架构设计
运维·自动化·办公自动化·rpa·python脚本·爬虫自动化·店群自动化
mounter62544 分钟前
现代 Linux 内存管理的演进与变革:从传统 LRU 到多代架构 MGLRU
linux·服务器·kernel
会Tk矩阵群控的小木1 小时前
安卓群控系统对于游戏工作室实战教程
android·运维·游戏·adb·开源软件·个人开发
佛山个人技术开发1 小时前
GitCode SSH连接配置教程
运维·ssh·gitcode
The Sheep 20232 小时前
Vue复习
linux·服务器·数据库
OpsEye3 小时前
系统负载高一定是CPU问题吗?
运维·cpu·it
源图客3 小时前
Minio配置HTTPS服务
服务器·网络协议·https
修炼室3 小时前
外网环境原生直连校内服务器:基于内网穿透 + SSH 密钥认证的完整实践指南
服务器·ssh·php
Titan20244 小时前
Linux动静态库
linux·服务器·c++
AOwhisky4 小时前
MySQL 学习笔记(第六期):MySQL 备份与恢复
运维·数据库·笔记·学习·mysql·云计算