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 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