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

测试:

相关推荐
暴力求解2 小时前
Linux---基础IO详解
linux·运维·服务器
猫头虎3 小时前
[精选] 2025最新MySQL和PostgreSQL区别、迁移、安全、适用场景全解析
运维·数据库·mysql·安全·postgresql·云原生·容器
心本无晴.3 小时前
RAG检索优化:文本分块策略如何大幅提升检索准确度
java·linux·服务器
生活很暖很治愈3 小时前
Linux——线程互斥,互斥锁
linux·运维·服务器
小李独爱秋3 小时前
模拟面试:说一下数据库主从不同步的原因。
运维·服务器·mysql·面试·职场和发展·性能优化
tryCbest4 小时前
Linux常用命令V2026
linux·运维
茶杯梦轩4 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
服务器·后端·面试
先做个垃圾出来………6 小时前
DeepDiff差异语义化特性
服务器·前端
i建模6 小时前
Omarchy挂载windows磁盘
linux·运维·windows