keepalived的工作原理与配置

Keepalived 的工作原理基于 VRRP(虚拟路由冗余协议)LVS(Linux 虚拟服务器),通过多层次协作实现服务器的高可用性和负载均衡。以下是其核心机制的详细说明:

一、VRRP 协议基础

VRRP(Virtual Router Redundancy Protocol) 是 Keepalived 实现高可用的核心协议,其作用是:

  • 将多台服务器组成一个 虚拟路由器,对外提供一个统一的虚拟 IP(VIP)。
  • 通过选举机制确定哪台服务器作为 主路由器(Master) 处理流量,其他作为 备份路由器(Backup)。
  • 当 Master 故障时,Backup 自动接管 VIP,实现无缝切换。

二、Keepalived 的三层架构

Keepalived 采用模块化设计,分为三层:

1. 用户空间层(User Space)

  • 配置解析模块:读取并解析 /etc/keepalived/keepalived.conf 配置文件。
  • 控制平面:管理 VRRP 和 LVS 进程的启动、停止和状态监控。

2. VRRP 层

  • VRRP 状态机:实现 Master/Backup 角色选举和状态切换。
  • VRRP 通告:通过组播(224.0.0.18)定期发送 VRRP 报文,维护集群成员状态。
  • 优先级机制:配置文件中 priority 值决定选举结果,值越高越优先成为 Master。

3. LVS 层(可选)

  • IPVS 内核模块:实现四层负载均衡(如 NAT、DR、TUN 模式)。
  • 健康检查:监控 Real Server(RS)状态,动态调整负载均衡策略。

三、工作流程详解

1. 初始化与配置加载

  1. Keepalived 启动时解析配置文件,初始化 VRRP 和 LVS 模块。
  2. 根据 state 参数(MASTER/BACKUP)设置初始角色。

2. VRRP 选举过程

  • 优先级比较:各节点通过比较 priority 值选举 Master(默认 100)。

  • 抢占模式:若高优先级节点恢复,是否重新成为 Master(由 nopreempt 控制)。

  • VRRP 通告

    :Master 定期(默认 1 秒)发送 VRRP 报文,Backup 监听该报文:

    • 若在超时时间(默认 3 秒)内未收到通告,Backup 认为 Master 故障,触发选举。

3. VIP 管理

  • Master 职责

    • 将 VIP 绑定到本地网卡。
    • 通过 ARP 广播通知网络设备 VIP 的新位置。
    • 处理所有发往 VIP 的流量。
  • Backup 职责

    • 监听 VRRP 通告,不绑定 VIP。
    • 当检测到 Master 故障时,提升为 Master 并接管 VIP。

4. 健康检查机制

Keepalived 通过 脚本监控服务状态检测 确保高可用性:

  • 脚本监控

    :通过

    vrrp_script
    

    配置自定义脚本,定期执行(如检查 Nginx 进程)。

    vrrp_script check_nginx {
        script "/etc/keepalived/check_nginx.sh"  # 检测 Nginx 是否运行
        interval 2  # 每2秒执行一次
        weight -20  # 检测失败时降低优先级20
    }
    
  • 服务状态检测:结合 LVS 监控 Real Server 的健康状态,自动剔除故障节点。

四、状态切换过程

当 Master 节点故障(如 Keepalived 进程停止):

  1. Backup 节点在超时时间后未收到 VRRP 通告,触发状态切换。
  2. 优先级最高的 Backup 节点将自己提升为 Master。
  3. 新 Master:
    • 将 VIP 绑定到本地网卡。
    • 发送 ARP 广播更新 VIP 的 MAC 地址。
    • 开始处理流量。
  4. 客户端通过新的 MAC 地址访问 VIP,无需修改配置。

五、LVS 负载均衡集成

Keepalived 可结合 LVS 实现负载均衡,工作流程:

  1. Keepalived 配置 LVS 规则(如虚拟服务器、Real Server、调度算法)。
  2. 客户端请求发往 VIP。
  3. LVS 根据调度算法(如 RR、WRR、LC)将请求转发至 Real Server。
  4. Real Server 处理请求并直接返回响应给客户端(DR 模式)或通过 LVS 返回(NAT 模式)。

六、关键配置参数

理解以下参数对掌握 Keepalived 原理至关重要:

  • VRRP 实例参数

    • state:初始状态(MASTER/BACKUP)。
    • priority:优先级(1-255,值越高越优先)。
    • advert_int:VRRP 通告间隔(秒)。
    • authentication:认证方式(确保集群安全)。
  • 健康检查参数

    • script:自定义检测脚本。
    • interval:检测间隔。
    • weight:检测失败时调整优先级。

七、典型应用场景

  1. Web 服务器高可用:为 Nginx/Apache 配置 Keepalived,确保单点故障时服务自动切换。
  2. 数据库高可用:实现 MySQL 主从切换,避免数据库单点故障。
  3. 负载均衡集群:结合 LVS 构建高性能负载均衡系统,支持数万并发连接。

总结

Keepalived 通过 VRRP 协议实现服务器的高可用,通过 LVS 实现负载均衡,两者结合提供了强大的基础设施保障。其核心优势在于 自动故障检测与切换透明的 VIP 管理灵活的配置,是构建高可用架构的首选开源方案。

八、配置文件结构

Keepalived 配置文件位于 /etc/keepalived/keepalived.conf,主要包含三部分:

# 全局定义
global_defs {
    router_id LVS_DEVEL  # 节点标识(唯一)
    script_user root  # 执行脚本的用户
    enable_script_security  # 启用脚本安全模式
}

# VRRP 实例(高可用模块)
vrrp_instance VI_1 {
    state MASTER  # 初始状态:MASTER 或 BACKUP
    interface eth0  # 绑定的网卡
    virtual_router_id 51  # 虚拟路由 ID(0-255,主备必须相同)
    priority 100  # 优先级(数值越大越优先)
    advert_int 1  # VRRP 通告间隔(秒)
    
    authentication {  # 认证配置(主备必须相同)
        auth_type PASS
        auth_pass 1111
    }
    
    virtual_ipaddress {  # 虚拟 IP 地址(可多个)
        192.168.1.100/24 dev eth0 label eth0:0
    }
}

# 虚拟服务器(负载均衡模块,可选)
virtual_server 192.168.1.100 80 {
    delay_loop 6  # 健康检查间隔
    lb_algo rr  # 负载均衡算法:rr(轮询)、wrr(加权轮询)、lc(最小连接)
    lb_kind NAT  # 负载均衡模式:NAT、DR、TUN
    persistence_timeout 50  # 会话保持时间(秒)
    
    # 真实服务器列表
    real_server 192.168.1.11 80 {
        weight 1  # 权重
        SSL_GET {  # 健康检查方式
            url { path "/" digest ff20ad2481f97b1754ef3e12ecd3a9cc }
            url { path "/mrtg/" digest 9b3a0c85a8872256d663a3a277a72552 }
            connect_timeout 3  # 连接超时
            retry 3  # 重试次数
            delay_before_retry 3  # 重试间隔
        }
    }
}

九、高可用(HA)配置示例

场景:两台服务器实现 Nginx 高可用
  • 主服务器(MASTER):192.168.1.10,优先级 100
  • 备服务器(BACKUP):192.168.1.11,优先级 90
  • 虚拟 IP(VIP):192.168.1.100
主服务器配置
global_defs {
    router_id LVS_MASTER
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"  # 检测 Nginx 状态的脚本
    interval 2  # 每2秒执行一次
    weight -20  # 检测失败时优先级降低20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    
    track_script {
        chk_nginx  # 关联检测脚本
    }
    
    virtual_ipaddress {
        192.168.1.100/24
    }
}
备服务器配置

仅需修改 statepriority

vrrp_instance VI_1 {
    state BACKUP
    priority 90  # 低于主服务器
    # 其他配置与主服务器相同
}
检测脚本(check_nginx.sh)
#!/bin/bash
if ! pgrep -x nginx >/dev/null; then
    systemctl restart nginx
    sleep 2
    if ! pgrep -x nginx >/dev/null; then
        exit 1  # 退出状态非0表示检测失败
    fi
fi
exit 0

权限设置

chmod +x /etc/keepalived/check_nginx.sh

十、负载均衡(LVS)配置示例

场景:通过 Keepalived+LVS 实现 Web 负载均衡
  • 负载均衡器(VIP):192.168.1.100
  • Web 服务器 1:192.168.1.11
  • Web 服务器 2:192.168.1.12
配置文件
global_defs {
    router_id LVS_LOADBALANCER
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 80 {
    delay_loop 6
    lb_algo wrr  # 加权轮询
    lb_kind DR   # 直接路由模式
    persistence_timeout 50
    
    real_server 192.168.1.11 80 {
        weight 3
        SSL_GET {
            url { path "/" digest ff20ad2481f97b1754ef3e12ecd3a9cc }
            connect_timeout 3
            retry 3
        }
    }
    
    real_server 192.168.1.12 80 {
        weight 2
        SSL_GET {
            url { path "/" digest ff20ad2481f97b1754ef3e12ecd3a9cc }
            connect_timeout 3
            retry 3
        }
    }
}

十一、关键配置参数详解

1. 全局配置(global_defs)

参数 说明 示例值
router_id 节点唯一标识 LVS_DEVEL
smtp_server SMTP 服务器地址(告警邮件用) 192.168.1.1
enable_script_security 启用脚本安全模式(限制脚本路径) 无值,直接声明

2. VRRP 实例配置(vrrp_instance)

参数 说明 示例值
state 初始状态(MASTER/BACKUP) MASTER
interface 绑定的网卡名称 eth0
virtual_router_id 虚拟路由 ID(0-255) 51
priority 优先级(值越大越优先) 100
advert_int VRRP 通告间隔(秒) 1
nopreempt 禁止抢占模式(高优先级节点不主动接管) 无值,直接声明
authentication 认证方式(PASS/HA) auth_type PASS auth_pass 1111

3. 健康检查配置(vrrp_script)

参数 说明 示例值
script 检测脚本路径 “/etc/keepalived/check_nginx.sh”
interval 执行间隔(秒) 2
weight 检测失败时调整的优先级 -20
rise 连续成功多少次后认为服务正常 2
fall 连续失败多少次后认为服务异常 2

4. 虚拟服务器配置(virtual_server)

参数 说明 示例值
lb_algo 负载均衡算法 rr(轮询)、wrr(加权轮询)、lc(最小连接)
lb_kind 负载均衡模式 NAT、DR、TUN
persistence_timeout 会话保持时间(秒) 50
protocol 协议类型 TCP、UDP

十二、启动与验证

1. 启动 Keepalived

# 启动服务
sudo systemctl start keepalived

# 设置开机自启
sudo systemctl enable keepalived

# 查看状态
sudo systemctl status keepalived

2. 验证 VIP 状态

# 查看 VIP 是否绑定(主服务器)
ip addr show eth0 | grep 192.168.1.100

# 测试 VIP 连通性
ping 192.168.1.100

3. 模拟故障切换

# 在主服务器上停止 Keepalived
sudo systemctl stop keepalived

# 在备服务器上查看 VIP 是否已接管
ip addr show eth0

# 恢复主服务器 Keepalived(若未配置 nopreempt,将重新接管 VIP)
sudo systemctl start keepalived

十三、常见问题与解决方案

1. VIP 无法 ping 通

  • 原因:防火墙阻止 VRRP 协议或 VIP 未正确绑定。

  • 解决方案

    # 开放 VRRP 协议(CentOS/RHEL)
    sudo firewall-cmd --add-protocol=vrrp --permanent
    sudo firewall-cmd --reload
    
    # 关闭 SELinux(临时)
    sudo setenforce 0
    

2. 脑裂(双主)问题

  • 原因:网络分区导致心跳不通,多个节点同时认为自己是 Master。

  • 解决方案

    • 增加冗余网络连接。

    • 使用脚本检测对端状态(如

      ping
      

      VIP):

      vrrp_script chk_peer {
          script "ping -c 3 192.168.1.100 >/dev/null || exit 1"
          interval 5
          weight -30
      }
      

3. LVS 负载均衡不生效

  • 原因:IPVS 模块未加载或配置错误。

  • 解决方案

    # 加载 IPVS 模块
    sudo modprobe ip_vs
    
    # 查看 IPVS 规则
    sudo ipvsadm -L -n
    
    # 检查 Real Server 配置(确保路由可达)
    

十四、高级配置技巧

1. 多 VIP 配置

为不同服务创建独立的 VRRP 实例:

vrrp_instance VI_WEB {
    virtual_router_id 51
    virtual_ipaddress { 192.168.1.100 }
}

vrrp_instance VI_DB {
    virtual_router_id 52
    virtual_ipaddress { 192.168.1.101 }
}

2. 告警邮件配置

global_defs {
    notification_email {
        [email protected]
    }
    notification_email_from [email protected]
    smtp_server 192.168.1.1
    smtp_connect_timeout 30
}

3. 自定义监控脚本

监控 MySQL 服务状态:

#!/bin/bash
mysql -h 127.0.0.1 -u monitor -pPASSWORD -e "SELECT 1;" >/dev/null 2>&1
if [ $? -ne 0 ]; then
    systemctl restart mysqld
    sleep 5
    mysql -h 127.0.0.1 -u monitor -pPASSWORD -e "SELECT 1;" >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        exit 1
    fi
fi
exit 0

总结

Keepalived 通过简单的配置即可实现高可用和负载均衡,关键在于理解:

  1. VRRP 机制:通过优先级选举 Master,实现 VIP 自动切换。
  2. 健康检查:通过脚本监控服务状态,确保故障及时发现。
  3. LVS 集成:结合 IPVS 实现四层负载均衡,支持多种调度算法。

根据实际需求调整配置参数,可构建出适合不同场景的高可用架构。

你可能感兴趣的:(云计算,网络,云计算,linux)