Skip to content

高可用性配置:Keepalived

为了确保集群的高可用性,需要在服务器上安装 Keepalived 来实现IP地址的浮动:当集群中的某个节点发生故障时,Keepalived 能够自动将虚拟IP地址切换至备用节点,保证服务不中断。

支持平台:仅支持 Linux 系统, 请在 Linux 系统中创建集群

IP 地址浮动与 Keepalived

在高可用性集群配置中,IP 地址浮动(Floating IP)是指通过虚拟 IP 地址(VIP)来实现故障切换。当集群中的主节点发生故障时,虚拟 IP 地址会自动从故障节点切换到另一个健康节点,从而确保外部客户端始终可以访问到集群服务,而无需感知到节点的切换。

Keepalived 故障切换流程

  • 主节点故障:流量自动切换到下一个优先级较高的备用节点。
  • 备用节点故障:下一个备用节点会接管处理流量。
  • 节点恢复:恢复的节点会根据优先级重新成为主节点或备用节点,流量切换回优先节点。

节点故障切换示例:ABC 三个节点的场景

假设集群中有三个节点:ABC,并且配置了 Keepalived 来进行故障切换,虚拟 IP 地址(VIP)192.168.1.100

  1. 正常状态:

    • 节点 A 被配置为 Master 节点,负责处理所有客户端请求。
    • 节点 A 上绑定了 浮动 IP 地址(VIP) 192.168.1.100
    • 节点 B节点 C 作为 Backup 节点,待命并监听 VIP。
    • 客户端请求通过访问 192.168.1.100 来连接集群。
  2. 节点 A 故障:

    • 如果 节点 A 发生故障或不可用,Keepalived 会监控到节点 A 的状态变化。
    • Keepalived 会自动将 VIP (192.168.1.100)节点 A 转移到 节点 B,假如 节点 B 的优先级高于 节点 C
    • 此时,客户端请求会自动被路由到 节点 B,即使客户端不知道节点 A 已经失败,仍然通过 192.168.1.100 进行访问。
  3. 节点 B 故障:

    • 如果 节点 B 发生故障,Keepalived 会将 VIP (192.168.1.100) 切换到 节点 C
    • 客户端会继续通过 192.168.1.100 访问集群,流量会被自动路由到 节点 C,即使节点 B 已故障。
  4. 节点恢复:

    • 如果 节点 A节点 B 恢复,Keepalived 会根据预设的优先级将 VIP (192.168.1.100) 切换回恢复的节点,保证优先级较高的节点接管流量。
    • 例如,节点 A 恢复后,VIP 会从节点 C 切换回节点 A。

Keepalived 配置

Ubuntu 系统为例,安装和配置 Keepalived,可以按照以下步骤进行操作:

1. 更新系统

首先,确保你的系统包是最新的。运行以下命令更新软件包列表:

bash
sudo apt update
sudo apt upgrade
sudo apt update
sudo apt upgrade

2. 安装 Keepalived

使用 apt 包管理器安装 Keepalived:

bash
sudo apt install keepalived
sudo apt install keepalived

安装完成后,Keepalived 会自动启动并设置为开机启动。

3. 配置 Keepalived

编写心跳检测脚本

首先,编写一个脚本来检测指定的 URL。你可以使用 curl 来发送 HTTP 请求并检查返回内容。

创建脚本文件,例如:/usr/local/bin/check_heartbeat.sh,并确保它是可执行的。

bash
sudo vim /usr/local/bin/check_heartbeat.sh
sudo vim /usr/local/bin/check_heartbeat.sh

在脚本中,使用 curl 发送请求并检查返回的响应:

bash
#!/bin/bash

# 发送HTTP请求
response=$(curl -s http://127.0.0.1:6635/admin/system/heartbeat4kp)

# 检查返回值是否为 SUCCEED
if [[ "$response" == "SUCCEED" ]]; then
    exit 0   # 成功,返回0
else
    exit 1   # 失败,返回1
fi
#!/bin/bash

# 发送HTTP请求
response=$(curl -s http://127.0.0.1:6635/admin/system/heartbeat4kp)

# 检查返回值是否为 SUCCEED
if [[ "$response" == "SUCCEED" ]]; then
    exit 0   # 成功,返回0
else
    exit 1   # 失败,返回1
fi

你需要给脚本文件增加执行权限:

bash
sudo chmod +x /usr/local/bin/check_heartbeat.sh
sudo chmod +x /usr/local/bin/check_heartbeat.sh
主服务器(Master)配置:

Keepalived 主要通过配置文件 /etc/keepalived/keepalived.conf 来工作。根据你的需求,可以配置 VRRP、健康检查等。

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

bash
sudo vim /etc/keepalived/keepalived.conf
sudo vim /etc/keepalived/keepalived.conf

在主服务器上,配置如下:

bash
vrrp_instance VI_1 {
    state MASTER
    interface eth0       # 设置要绑定的网络接口
    virtual_router_id 51 # VRRP虚拟路由器ID,确保两台机器的ID相同
    priority 101         # 主服务器的优先级,数字越大优先级越高
    advert_int 1         # 广播广告的时间间隔(秒)
    authentication {
        auth_type PASS     # 认证类型
        auth_pass 123456     # 认证密码,生产环境中替换为实际的密码
    }
    
    virtual_ipaddress {
        192.168.1.100      # 虚拟IP地址
    }
    
    track_script {
        # 使用自定义脚本进行健康检查
        check_heartbeat.sh
    }
}

# 健康检查脚本配置
vrrp_script check_heartbeat.sh {
    script "/usr/local/bin/check_heartbeat.sh" # 生产环境中替换为实际的脚本路径
    interval 3           # 每3秒执行一次
    weight -20           # 如果健康检查失败,减少20的优先级
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0       # 设置要绑定的网络接口
    virtual_router_id 51 # VRRP虚拟路由器ID,确保两台机器的ID相同
    priority 101         # 主服务器的优先级,数字越大优先级越高
    advert_int 1         # 广播广告的时间间隔(秒)
    authentication {
        auth_type PASS     # 认证类型
        auth_pass 123456     # 认证密码,生产环境中替换为实际的密码
    }
    
    virtual_ipaddress {
        192.168.1.100      # 虚拟IP地址
    }
    
    track_script {
        # 使用自定义脚本进行健康检查
        check_heartbeat.sh
    }
}

# 健康检查脚本配置
vrrp_script check_heartbeat.sh {
    script "/usr/local/bin/check_heartbeat.sh" # 生产环境中替换为实际的脚本路径
    interval 3           # 每3秒执行一次
    weight -20           # 如果健康检查失败,减少20的优先级
}
备用服务器(Backup)配置:

在备份服务器上,编辑 /etc/keepalived/keepalived.conf 文件:

bash
sudo vim /etc/keepalived/keepalived.conf
sudo vim /etc/keepalived/keepalived.conf

从服务器配置如下:

bash
vrrp_instance VI_1 {
    state BACKUP
    interface eth0       # 设置要绑定的网络接口
    virtual_router_id 51 # 与主服务器相同
    priority 100         # 从服务器的优先级,低于主服务器
    advert_int 1         # 广播广告的时间间隔(秒)
    authentication {
        auth_type PASS     # 认证类型
        auth_pass 123456     # 认证密码,生产环境中替换为实际的密码
    }
    
    virtual_ipaddress {
        192.168.1.100      # 虚拟IP地址
    }
    
    track_script {
        # 使用自定义脚本进行健康检查
        check_heartbeat.sh
    }
}

# 健康检查脚本配置
vrrp_script check_heartbeat.sh {
    script "/usr/local/bin/check_heartbeat.sh" # 生产环境中替换为实际的脚本路径
    interval 3           # 每3秒执行一次
    weight -20           # 如果健康检查失败,减少20的优先级
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0       # 设置要绑定的网络接口
    virtual_router_id 51 # 与主服务器相同
    priority 100         # 从服务器的优先级,低于主服务器
    advert_int 1         # 广播广告的时间间隔(秒)
    authentication {
        auth_type PASS     # 认证类型
        auth_pass 123456     # 认证密码,生产环境中替换为实际的密码
    }
    
    virtual_ipaddress {
        192.168.1.100      # 虚拟IP地址
    }
    
    track_script {
        # 使用自定义脚本进行健康检查
        check_heartbeat.sh
    }
}

# 健康检查脚本配置
vrrp_script check_heartbeat.sh {
    script "/usr/local/bin/check_heartbeat.sh" # 生产环境中替换为实际的脚本路径
    interval 3           # 每3秒执行一次
    weight -20           # 如果健康检查失败,减少20的优先级
}
  • state: 指定该节点是 MASTER 还是 BACKUP
  • interface: 配置绑定的网络接口,可以使用命令ls /sys/class/net/查看具体的网络接口,如 eth0
  • priority: 设置节点的优先级,MASTER 节点优先级通常高一些。
  • virtual_ipaddress: 配置虚拟IP地址。

4. 启动 Keepalived 服务

编辑完配置文件后,重启 Keepalived 服务以使配置生效:

bash
sudo systemctl restart keepalived
sudo systemctl restart keepalived

你可以检查服务是否正常启动:

bash
sudo systemctl status keepalived
sudo systemctl status keepalived

5. 配置防火墙(如果需要)

确保防火墙允许 VRRP 流量。如果使用 ufw,可以添加相应规则:

bash
sudo ufw allow proto vrrp
sudo ufw allow proto vrrp

6. 验证配置

  • 在主服务器和备份服务器上,使用 ip a 命令查看虚拟IP是否已经绑定。
bash
ip a
ip a
  • 可以在主服务器和备份服务器上执行 keepalived 日志检查,查看是否有任何错误。
bash
sudo journalctl -u keepalived
sudo journalctl -u keepalived