Appearance
高可用性配置:Keepalived 
为了确保集群的高可用性,需要在服务器上安装 Keepalived 来实现IP地址的浮动:当集群中的某个节点发生故障时,Keepalived 能够自动将虚拟IP地址切换至备用节点,保证服务不中断。
支持平台:仅支持 Linux 系统, 请在 Linux 系统中创建集群
IP 地址浮动与 Keepalived 
在高可用性集群配置中,IP 地址浮动(Floating IP)是指通过虚拟 IP 地址(VIP)来实现故障切换。当集群中的主节点发生故障时,虚拟 IP 地址会自动从故障节点切换到另一个健康节点,从而确保外部客户端始终可以访问到集群服务,而无需感知到节点的切换。
Keepalived 故障切换流程 
- 主节点故障:流量自动切换到下一个优先级较高的备用节点。
- 备用节点故障:下一个备用节点会接管处理流量。
- 节点恢复:恢复的节点会根据优先级重新成为主节点或备用节点,流量切换回优先节点。
节点故障切换示例:ABC 三个节点的场景 
假设集群中有三个节点:A、B、C,并且配置了 Keepalived 来进行故障切换,虚拟 IP 地址(VIP) 为 192.168.1.100。
- 正常状态: - 节点 A 被配置为 Master 节点,负责处理所有客户端请求。
- 节点 A 上绑定了 浮动 IP 地址(VIP) 192.168.1.100。
- 节点 B 和 节点 C 作为 Backup 节点,待命并监听 VIP。
- 客户端请求通过访问 192.168.1.100来连接集群。
 
- 节点 A 故障: - 如果 节点 A 发生故障或不可用,Keepalived 会监控到节点 A 的状态变化。
- Keepalived 会自动将 VIP (192.168.1.100) 从 节点 A 转移到 节点 B,假如 节点 B 的优先级高于 节点 C 。
- 此时,客户端请求会自动被路由到 节点 B,即使客户端不知道节点 A 已经失败,仍然通过 192.168.1.100进行访问。
 
- 节点 B 故障: - 如果 节点 B 发生故障,Keepalived 会将 VIP (192.168.1.100) 切换到 节点 C。
- 客户端会继续通过 192.168.1.100访问集群,流量会被自动路由到 节点 C,即使节点 B 已故障。
 
- 如果 节点 B 发生故障,Keepalived 会将 VIP (
- 节点恢复: - 如果 节点 A 或 节点 B 恢复,Keepalived 会根据预设的优先级将 VIP (192.168.1.100) 切换回恢复的节点,保证优先级较高的节点接管流量。
- 例如,节点 A 恢复后,VIP 会从节点 C 切换回节点 A。
 
- 如果 节点 A 或 节点 B 恢复,Keepalived 会根据预设的优先级将 VIP (
Keepalived 配置 
以 Ubuntu 系统为例,安装和配置 Keepalived,可以按照以下步骤进行操作:
1. 更新系统 
首先,确保你的系统包是最新的。运行以下命令更新软件包列表:
bash
sudo apt update
sudo apt upgradesudo apt update
sudo apt upgrade2. 安装 Keepalived 
使用 apt 包管理器安装 Keepalived:
bash
sudo apt install keepalivedsudo apt install keepalived安装完成后,Keepalived 会自动启动并设置为开机启动。
3. 配置 Keepalived 
编写心跳检测脚本 
首先,编写一个脚本来检测指定的 URL。你可以使用 curl 来发送 HTTP 请求并检查返回内容。
创建脚本文件,例如:/usr/local/bin/check_heartbeat.sh,并确保它是可执行的。
bash
sudo vim /usr/local/bin/check_heartbeat.shsudo 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.shsudo 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.confsudo 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.confsudo 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 keepalivedsudo systemctl restart keepalived你可以检查服务是否正常启动:
bash
sudo systemctl status keepalivedsudo systemctl status keepalived5. 配置防火墙(如果需要) 
确保防火墙允许 VRRP 流量。如果使用 ufw,可以添加相应规则:
bash
sudo ufw allow proto vrrpsudo ufw allow proto vrrp6. 验证配置 
- 在主服务器和备份服务器上,使用 ip a命令查看虚拟IP是否已经绑定。
bash
ip aip a- 可以在主服务器和备份服务器上执行 keepalived日志检查,查看是否有任何错误。
bash
sudo journalctl -u keepalivedsudo journalctl -u keepalived