Linux服务器高可用:Keepalived配置详解与故障切换方案


Linux服务器高可用:Keepalived配置详解与故障切换方案

想象一下这样的场景:你的核心业务运行在一台Linux服务器上,突然服务器宕机,业务中断,造成巨大的损失。高可用,即High Availability (HA),就是为了解决这个问题而生的。其中,Keepalived 是一个非常流行的解决方案,尤其适用于Linux服务器集群。

Keepalived简介及工作原理

Keepalived 本质上是一个路由设备(router)的健康检查和故障转移机制。它基于VRRP(Virtual Router Redundancy Protocol)协议,通过虚拟IP地址(Virtual IP,VIP)实现主备服务器的切换。简单来说,就是多台服务器组成一个集群,对外提供一个VIP,客户端访问VIP就相当于访问集群服务。当主服务器出现故障时,Keepalived 会自动将VIP切换到备用服务器,从而保证服务的连续性。

VRRP协议的核心在于选举Master节点。集群中的所有节点会通过VRRP报文进行通信,根据优先级选举出一个Master节点。Master节点负责响应客户端的请求,而Backup节点则处于待命状态,随时准备接管Master节点的工作。

Keepalived配置详解

下面我们以一个具体的例子来说明 Keepalived 的配置。假设我们有两台服务器:server1 (192.168.1.100) 和 server2 (192.168.1.101),我们希望对外提供一个 VIP:192.168.1.200。server1 作为主服务器,server2 作为备用服务器。

1. 安装 Keepalived

在两台服务器上分别安装 Keepalived

sudo apt update
sudo apt install keepalived

2. 配置 Keepalived (server1 – 主服务器)

编辑 /etc/keepalived/keepalived.conf 文件:

! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
    script_user root
    enable_script_security
}

vrrp_script chk_http_port {
    script "/etc/keepalived/check_http.sh"
    interval 2
    weight -20
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0  # 根据你的实际网卡名称修改
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200
    }
    track_script {
        chk_http_port
    }
}

3. 配置 Keepalived (server2 – 备用服务器)

编辑 /etc/keepalived/keepalived.conf 文件:

! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
    script_user root
    enable_script_security
}

vrrp_script chk_http_port {
    script "/etc/keepalived/check_http.sh"
    interval 2
    weight -20
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0  # 根据你的实际网卡名称修改
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200
    }
    track_script {
        chk_http_port
    }
}

4. 健康检查脚本 (两台服务器)

创建 /etc/keepalived/check_http.sh 文件,用于检查HTTP服务是否正常运行:

#!/bin/bash

TIMEOUT=2
HTTP_PORT=80

curl --silent --max-time $TIMEOUT http://localhost:$HTTP_PORT/index.html > /dev/null 2>&1

if [ $? -eq 0 ]; then
    exit 0
else
    exit 1
fi

确保脚本具有执行权限:

sudo chmod +x /etc/keepalived/check_http.sh

5. 启动 Keepalived

在两台服务器上分别启动 Keepalived

sudo systemctl start keepalived
sudo systemctl enable keepalived

配置项说明:

  • router_id: 集群中每台服务器的唯一标识。
  • vrrp_instance: VRRP实例,可以配置多个实例。
  • state: 服务器的角色,可以是 MASTERBACKUP
  • interface: 监听的网卡接口。
  • virtual_router_id: VRRP实例的ID,同一个集群中必须相同。
  • priority: 优先级,数值越大优先级越高,Master节点的优先级必须高于Backup节点。
  • advert_int: VRRP报文的发送间隔,单位为秒。
  • authentication: 认证信息,用于防止未经授权的服务器加入集群。
  • virtual_ipaddress: 虚拟IP地址,客户端通过该地址访问集群服务。
  • track_script: 健康检查脚本,用于检测服务器的健康状态。

故障切换方案

上述配置中,我们通过 track_script 配置了一个健康检查脚本。当 server1 上的HTTP服务出现故障时,该脚本会返回非零值,Keepalived 会降低 server1 的优先级,从而触发主备切换。server2 检测到 server1 的优先级降低后,会自动提升为Master节点,并接管VIP。

除了HTTP服务,你还可以根据实际情况配置其他健康检查脚本,例如检查数据库连接、磁盘空间等。关键在于编写合适的脚本,能够准确地检测服务器的健康状态。

Keepalived的进阶应用

Keepalived 的应用场景非常广泛,除了简单的Web服务,还可以用于数据库、负载均衡器等各种服务的HA。例如,你可以将 KeepalivedHAProxy 结合使用,构建一个高可用的负载均衡集群。你也可以为MySQL数据库配置Keepalived,实现数据库的主备切换。

另外, Keepalived 还支持多种高级特性,例如:

  • 预先分配的VIP (Preempt): Backup服务器在恢复后立即抢占VIP。
  • 延迟启动 (Delay): 避免服务器启动时立即抢占VIP。
  • 多实例 (Multiple Instances): 在同一台服务器上运行多个 Keepalived 实例。

结合vDisk云桌面解决方案

在企业IT架构