HAVIP结合Keepalived实现主备多机高可用
概览
通过高可用虚拟IP(High-Availability Virtual IP Address,简称HAVIP)和Keepalived配合使用,实现主备集群的搭建,默认主集群承接客户端访问流量。当主集群发生故障时,备集群会自动接管主集群的服务,实现业务高可用。
方案概述
本文以下图场景为例,创建四台BCC实例和一个HAVIP,BCC内网IP分别为192.168.0.2,192.168.1.2,192.168.2.2,192.168.0.5,HAVIP内网IP为192.168.2.3。通过Keepalived使得192.168.0.2为主服务器,192.168.1.2和192.168.2.2为备服务器,模拟客户端(192.168.0.5)去访问HAVIP(192.168.2.3)。
配置步骤
步骤一:创建HAVIP
1.选择“产品服务>私有网络 VPC”,在左侧导航栏选择“网卡>高可用虚拟IP”。
2.点击“创建虚拟IP”,出现创建虚拟IP弹框。填写下列配置信息:
配置项 | 说明 |
---|---|
虚拟IP名称 | 用户自定义HAVIP名称 |
所在网络 | 选择待创建 HAVIP所在的私有网络 |
所在子网 | HAVIP具有子网属性,请下拉选择当前VPC下的子网 |
IP地址 | 默认选择自动分配IP地址,支持输入指定IP,该IP要求未被占用 |
描述 | 编辑HAVIP相关描述信息 |
3.点击“确定”,高可用虚拟IP创建完成。
步骤二:在主备服务器上安装Keepalived
1.登录 云服务器BCC 控制台进入实例页面,点击“创建实例”,填写配置信息后完成BCC创建。具体操作请参见创建实例导航。
2.登录云服务器实例。具体操作请参见登录方式概述。
3.在主服务器和备服务器上搭建Keepalived,使用 yum 方式安装软件包。
# yum install keepalived -y
步骤三:配置Keepalived绑定HAVIP到主备服务器
1.登录 高可用虚拟IP 控制台,点击实例名称进入详情页面,在左侧导航栏选择绑定服务器后进入后端服务器列表,点击“添加后端服务器”选择需要绑定的云服务器。
2.登录主服务器,执行vim /etc/keepalived/keepalived.conf,修改相关配置。
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script checkService
{
script "/etc/keepalived/check_status.sh" # 检测业务进程是否运行正常。其中"check_status.sh"文件为用户自定义的业务进程检测脚本,请根据业务需要来执行,执行时"check_status.sh"更换为实际的脚本名称。
interval 1
}
vrrp_instance VI_1 {
state MASTER # 设置初始状态为"主"
interface eth0 # 设置绑定 VIP 的网卡,例如 eth0
virtual_router_id 51 # 配置集群 virtual_router_id 值
nopreempt # 设置非抢占模式,
priority 100 # 优先级值越大,优先级越高,优先级范围为1—254
advert_int 1 # #通告发送间隔, 默认为1。
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 192.168.0.2 # 设置本机内网IP地址
unicast_peer {
192.168.1.2
192.168.2.2 # 高可用虚拟VIP绑定的其它对端设备的内网IP地址
}
virtual_ipaddress {
192.168.2.3 # 设置高可用虚拟VIP
}
notify_master "/etc/keepalived/notify_action.sh MASTER"
notify_backup "/etc/keepalived/notify_action.sh BACKUP"
notify_fault "/etc/keepalived/notify_action.sh FAULT"
notify_stop "/etc/keepalived/notify_action.sh STOP"
garp_master_refresh 5 # 设置主节点发送 ARP 报文的时间间隔
garp_master_delay 1 # 设置当切为主状态后多久更新 ARP 缓存
track_interface {
eth0 # 使用绑定 VIP 的网卡 例如 eth0
}
track_script {
checkService
}
}
3.登录备服务器1,执行vim /etc/keepalived/keepalived.conf,修改相关配置。
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script checkService
{
script "/etc/keepalived/check_status.sh" # 检测业务进程是否运行正常。其中"check_status.sh"文件为用户自定义的业务进程检测脚本,请根据业务需要来执行,执行时"check_status.sh"更换为实际的脚本名称。
interval 1
}
vrrp_instance VI_1 {
state BACKUP # 设置初始状态为"备"
interface eth0 # 设置绑定 VIP 的网卡 例如 eth0
virtual_router_id 51 # 配置集群 virtual_router_id 值
nopreempt # 设置非抢占模式,
priority 100 # 优先级值越大,优先级越高,优先级范围为1—254
advert_int 1 # #通告发送间隔, 默认为1。
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 192.168.1.2 # 设置本机内网IP地址
unicast_peer {
192.168.0.2
192.168.2.2 # 高可用虚拟VIP绑定的其它对端设备的内网IP地址
}
virtual_ipaddress {
192.168.2.3 # 设置高可用虚拟VIP
}
notify_master "/etc/keepalived/notify_action.sh MASTER"
notify_backup "/etc/keepalived/notify_action.sh BACKUP"
notify_fault "/etc/keepalived/notify_action.sh FAULT"
notify_stop "/etc/keepalived/notify_action.sh STOP"
garp_master_refresh 5 # 设置主节点发送 ARP 报文的时间间隔
garp_master_delay 1 # 设置当切为主状态后多久更新 ARP 缓存
track_interface {
eth0 # 使用绑定 VIP 的网卡 例如 eth0
}
track_script {
checkService
}
}
4.登录备服务器2,执行vim /etc/keepalived/keepalived.conf,修改相关配置。
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script checkService
{
script "/etc/keepalived/check_status.sh" # 检测业务进程是否运行正常。其中"check_status.sh"文件为用户自定义的业务进程检测脚本,请根据业务需要来执行,执行时"check_status.sh"更换为实际的脚本名称。
interval 1
}
vrrp_instance VI_1 {
state BACKUP # 设置初始状态为"备"
interface eth0 # 设置绑定 VIP 的网卡 例如 eth0
virtual_router_id 51 # 配置集群 virtual_router_id 值
nopreempt # 设置非抢占模式,
priority 100 # 优先级值越大,优先级越高,优先级范围为1—254
advert_int 1 # #通告发送间隔, 默认为1。
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 192.168.2.2 # 设置本机内网IP地址
unicast_peer {
192.168.0.2
192.168.1.2 # 高可用虚拟VIP绑定的其它对端设备的内网IP地址
}
virtual_ipaddress {
192.168.2.3 # 设置高可用虚拟VIP
}
notify_master "/etc/keepalived/notify_action.sh MASTER"
notify_backup "/etc/keepalived/notify_action.sh BACKUP"
notify_fault "/etc/keepalived/notify_action.sh FAULT"
notify_stop "/etc/keepalived/notify_action.sh STOP"
garp_master_refresh 5 # 设置主节点发送 ARP 报文的时间间隔
garp_master_delay 1 # 设置当切为主状态后多久更新 ARP 缓存
track_interface {
eth0 # 使用绑定 VIP 的网卡 例如 eth0
}
track_script {
checkService
}
}
5.检查业务check_status.sh,您可以根据自己的业务编写正确的脚本内容,调整脚本路径,同步更新keepalived.conf配置。这里通过/tmp/down文件是否存在来判断服务是否正常,如果不存在/tmp/down文件,认为服务正常返回0,否则返回1认为服务异常,通知Keepalived切主。脚本内容和权限(755及以上)如下:
/etc/keepalived/check_status.sh
#!/bin/sh
if [ ! -f /tmp/down ]
then
exit 0
fi
exit 1
6.重启 keepalived 进程使配置生效。
systemctl start keepalived
systemctl restart keepalived
systemctl status keepalived
7.登录 高可用虚拟IP 控制台,能够看到HAVIP绑定的主服务器(192.168.0.2)、备服务器1(192.168.1.2)、备服务器2(192.168.2.2),如下图所示。
步骤四:HAVIP绑定EIP(可选)
1.登录 高可用虚拟IP 控制台,点击步骤1中创建的HAVIP操作中的绑定。
- 在弹出的弹性公网IP绑定弹框中选择待绑定的EIP,并单击确定。如果没有可用的EIP,可点击右上角的创建公网IP进行申请。
步骤五:测试验证
- 根据Keepalived配置文件启动后,服务器(192.168.0.2)为主(state=MASTER,priority 100,检查虚机是否正常周期为1s);
- 模拟客户端(192.168.0.5)持续ping HAVIP:ping 192.168.2.3 -i 0.001
- 在主服务器(192.168.0.2)上,/tmp目录下创建down文件,通过Keepalived周期任务检查是否存在/tmp/down来模拟业务异常,从而切换HAVIP;
- 在备服务器1(192.168.1.2)、备服务器2(192.168.2.2)上抓HAVIP的免费ARP包、ICMP包。
- 服务器(192.168.2.2) 切为主,可以看到发送免费ARP的时间。
- 服务器(192.168.2.2) 切流完成,可以收到ICMP报文的时间。
5.完成主备切换后,在控制台可以看到绑定主机已经切换为云服务器(192.168.2.2)。