侧边栏壁纸
博主头像
LLJJJJ的博客

行动起来,活在当下

  • 累计撰写 15 篇文章
  • 累计创建 9 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Keepalived的介绍以及部署配置

Administrator
2026-08-17 / 0 评论 / 0 点赞 / 10 阅读 / 0 字

一、Keepalived 是什么?

定义:Keepalived 是一个基于 VRRP(虚拟路由冗余协议) 实现的高可用解决方案,主要用于 Linux 服务器的故障自动切换,保证关键服务持续在线。

二、Keepalived 的工作原理

1️⃣ VIP 绑定

  • 主服务器持有 VIP(虚拟 IP,如 192.168.1.100),对外提供服务。

  • 备服务器监听主的心跳,处于待命状态。

2️⃣ 心跳检测(VRRP 通告)

  • 主服务器每隔 1 秒(默认)发送一次 VRRP 通告。

  • 通告里包含主服务器的 优先级(priority)虚拟路由 ID(virtual_router_id)

3️⃣ 故障切换

  • 备服务器如果在 3 秒内(3 个通告周期)未收到主的通告,则判定主已故障。

  • 备服务器升级为主,立即绑定 VIP。

  • 备服务器发送 免费 ARP(Gratuitous ARP),通知交换机更新 MAC 地址表,确保网络流量切换到新主。

  • 整个切换过程对用户完全透明

4️⃣ 主恢复

  • 主服务器恢复后,根据配置的模式决定行为:

    • 抢占模式(默认):主立即抢回 VIP,重新变为主。

    • 非抢占模式:主不抢 VIP,继续当备。

架构图

三、Keepalived 的安装配置

你需要准备两台服务器

角色

主机名

IP 地址

说明

主服务器 (Master)

nginx-master

192.168.1.10

持有 VIP,处理流量

备服务器 (Backup)

nginx-backup

192.168.1.11

待命,主挂了接管

虚拟 IP (VIP)

-

192.168.1.100

对外提供服务的浮动 IP

安装keepalived

apt install keepalived -y

1️⃣ 主服务器配置 (192.168.1.10)

编辑 /etc/keepalived/keepalived.conf

bash

vim /etc/keepalived/keepalived.conf

写入以下内容:

bash

! 全局定义
global_defs {
   router_id nginx_master          # 本机标识,主备不同即可
}

vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2          # 每 2 秒检查一次
    weight -20          # 检查失败时,本机优先级减 20
}
! VRRP 实例定义
vrrp_instance VI_1 {
    state MASTER                   # 角色:主
    interface eth0                 # VIP 绑定的网卡名,用 ip a 查看
    virtual_router_id 51           # 虚拟路由 ID,主备必须一致(范围 0-255)
    priority 100                   # 优先级,主必须高于备
    advert_int 1                   # 心跳间隔(秒)
    
    ! 认证
    authentication {
        auth_type PASS
        auth_pass 1234             # 认证密码,主备必须一致
    }
    
    ! 虚拟 IP(VIP)
    virtual_ipaddress {
        192.168.1.100/24           # VIP 地址,/24 是子网掩码
    }
    track_script {
        check_nginx
    }
}

注意interface eth0 要换成你实际的网卡名,执行 ip a 查看(可能是 ens3ens192enp0s3 等)。

执行ip a发现出现了虚拟的ip192.168.1.100

2️⃣ 备服务器配置 (192.168.1.11)

编辑 /etc/keepalived/keepalived.conf

bash

! 全局定义
global_defs {
   router_id nginx_backup          # 和主不同
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2          # 每 2 秒检查一次
    weight -20          # 检查失败时,本机优先级减 20
}

! VRRP 实例定义
vrrp_instance VI_1 {
    state BACKUP                   # 角色:备
    interface eth0                 # 和主保持一致
    virtual_router_id 51           # 和主保持一致
    priority 90                    # 低于主
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass 1234             # 和主保持一致
    }
    
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        check_nginx
    }
}

3️⃣ 编写检测脚本(两台服务器都做)

创建 /etc/keepalived/check_nginx.sh

bash

#!/bin/bash
# 检查 Nginx 是否在监听 80 端口
if ss -tuln | grep -q ':80\b'; then
    exit 0
else
    exit 1
fi
chmod +x /etc/keepalived/check_nginx.sh

4️⃣ 测试效果(模拟 Nginx 崩溃)

在主节点执行systemctl stop nginx

在备服务器执行:检查 VIP,发现vip漂移到了备节点
ip a | grep 192.168.1.100

并且业务也能成功恢复

恢复主节点 Nginx

# 1. 在主服务器执行:重新启动 Nginx
systemctl start nginx

# 2. 等待 2-4 秒

# 3. 在主服务器执行:检查 VIP,因为是抢占模式,主节点优先级更高,发现vip又回到主节点
ip a | grep 192.168.1.100

# 4. 在备服务器执行:检查 VIP 是否已释放
ip a | grep 192.168.1.100

# 5. 访问 VIP
curl http://192.168.1.100

四、预防脑裂

1️⃣ 启用单播模式

默认的多播模式容易受交换机影响,改成单播后主备之间直接点对点通信,可靠性大幅提升。

bash

vrrp_instance VI_1 {
    # ... 其他配置 ...
    unicast_src_ip 192.168.1.10      # 本机 IP
    unicast_peer {
        192.168.1.11                 # 对端 IP
    }
}

0

评论区