高可用虚拟IP通常与高可用软件(如Keepalived)配合使用,来帮助您搭建高可用主备服务。
本文介绍了如何通过高可用虚拟IP和Keepalived搭建面向公网的高可用主备集群。
同一个高可用虚拟IP绑定到与其处于相同私有网络中的两个边缘实例,并绑定弹性公网IP。边缘实例通过地址解析协议ARP宣告该高可用虚拟IP。在这两个边缘实例上分别部署Keepalived软件,将其中一个边缘实例配置为主实例,另外一个边缘实例配置为备实例。
正常情况下,主实例通过弹性公网IP来对公网提供服务。当主实例出现故障时,备实例自动接管原来的主实例的业务,继续对公网提供服务。
本文使用到的资源信息如下表所示。
以下资源的名称、网段、IP地址、镜像版本等均为示例值。在实际配置过程中,请将示例值替换为实际值。
资源 | 描述 |
---|---|
私有网络 | 网段:192.168.0.0/16 |
主边缘实例 | 名称:veEN_01 |
备边缘实例 | 名称:veEN_02 |
高可用虚拟IP | 名称:havip_example |
弹性公网IP | 名称:eip_example |
镜像 | CentOS 7.6 64位 |
高可用虚拟IP只支持单播。
确保已经配置以下garp信息。Keepalived依赖ARP报文更新IP信息。如果缺少以下参数,在某些场景下,主设备不发送ARP报文、导致通信异常。
garp_master_delay 1 garp_master_refresh 5
确保为同一私有网络下的每个主备集群配置不同的虚拟路由器ID,即virtual_router_id的值须唯一。
确定没有采用“strict”模式,即需要删除vrrp_strict配置。
合理评估并设置advert_int参数值。当advert_int参数值过小时,容易受网络抖动影响发生频繁主备切换或双主情况。当advert_int参数值过大时,主设备故障后,主备切换耗时较长。
track_script脚本的具体执行项(如checkhaproxy)中的interval参数的值请适当提高,避免脚本执行超时导致 FAULT 状态的出现。
登录边缘计算节点控制台。
在左侧导航栏中,选择边缘网络 > 高可用虚拟IP。
在高可用虚拟IP页面,单击创建高可用虚拟IP。
在创建高可用虚拟IP页面,参照下表配置必填参数。
配置项 | 描述 |
---|---|
名称 | 输入高可用虚拟IP的名称。 |
节点 | 选择高可用虚拟IP所属的节点。 |
私有网络 | 选择高可用虚拟IP所属的私有网络。 |
子网 | 选择高可用虚拟IP所属的子网。 |
IP分配方式 | 选择IP地址的分配方式。 |
确认配置无误后,单击提交。
说明
以下内容以CentOS 7.6 64位操作系统为例进行说明。不同操作系统的配置可能存在差异。
登录边缘实例veEN_01。
执行以下命令,查看Keepalived安装包的版本。
yum list keepalived
CentOS 7.6默认的Keepalived版本如下图所示。以下配置以Keepalived版本1.3.5-19.e17为例进行介绍。
执行以下命令安装Keepalived。
yum install -y keepalived
执行以下命令,进入keepalived.conf
文件目录。
vim /etc/keepalived/keepalived.conf
按i
键进入编辑模式。
参照以下内容修改Keepalived配置文件。
! Configuration File for keepalived 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 checkhaproxy { script "/etc/keepalived/do_sth.sh" # 检测业务进程是否运行正常。“do_sth.sh”是自定义的业务进程检测脚本,请根据业务需要来执行。执行时,“do_sth.sh”须替换为实际的脚本名称。 interval 5 } vrrp_instance VI_1 { state MASTER # 设置Keepalived节点的初始状态。MASTER表示主用状态,BACKUP表示备用状态。本示例中,设置veEN_01为MASTER。 interface eth0 # 设置绑定高可用虚拟IP的实例网卡。该网卡用于发送VRRP包。本示例中,使用eth0。 virtual_router_id 51 # 设置集群的虚拟路由器ID。 nopreempt # 设置为非抢占模式。当高优先级的边缘实例恢复后,低优先级的边缘实例仍为MASTER。 preempt_delay 10 # 设置仅state为MASTER时的抢占延迟。 priority 100 # 设置优先级,数字越大优先级越高。本示例中,veEN_01优先级设置为100。 advert_int 5 authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 192.168.7.8 # 设置边缘实例veEN_01的私网IP地址。本示例中,使用192.168.7.8,您在操作时须替换为实际的私网IP地址。 unicast_peer { 192.168.7.9 # 设置对端设备(边缘实例veEN_02)的私网IP地址。本示例中,使用192.168.7.9,您在操作时须替换为实际的私网IP地址。 } virtual_ipaddress { 192.168.7.4 # 设置高可用虚拟IP的IP地址。本示例中,使用192.168.7.4,您在操作时须替换为实际的高可用虚拟IP的IP地址。 } notify_master "/etc/keepalived/notify_action.sh MASTER" # notify_action的示例参见“notify_action配置说明”。 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_delay 1 # 设置边缘实例切换为主用状态后更新ARP缓存的时间。 garp_master_refresh 5 # 设置主边缘实例发送ARP报文的时间间隔。 track_interface { eth0 # 使用绑定了高可用虚拟IP的网卡。本示例中,使用eth0。 } track_script { checkhaproxy } }
notify_action配置说明
Keepalived主要的日志保存在/var/log/messages文件中。此外,您可以通过配置/etc/keepalived/notify_action来实现对Keepalived日志的记录。以下为一个配置示例,请您根据实际情况进行修改。
#!/bin/bash #/etc/keepalived/notify_action.sh log_file=/var/log/keepalived.log log_write() { echo "[`date '+%Y-%m-%d %T'`] $1" >> $log_file } [ ! -d /var/keepalived/ ] && mkdir -p /var/keepalived/ case "$1" in "MASTER" ) # 在这里添加自定义脚本,定义在实例切换到MASTER状态时执行的操作 ;; "BACKUP" ) # 在这里添加自定义脚本,定义在实例切换到BACKUP状态时执行的操作 ;; "FAULT" ) # 在这里添加自定义脚本,定义在实例切换到FAULT状态时执行的操作 ;; "STOP" ) # 在这里添加自定义脚本,定义在实例切换到STOP状态时执行的操作 ;; *) log_write "notify_action.sh: STATE ERROR!!!" ;; esac
按Esc
键后,输入:wq
,然后按Enter
键来保存设置并退出编辑器。
执行以下命令,启动veEN_01的Keepalived,使步骤6中的配置生效。
systemctl start keepalived
参照“在边缘实例veEN_01上安装Keepalived”的步骤1~步骤5,安装Keepalived并进入keepalived.conf
文件的编辑模式。
参照以下内容修改Keepalived配置文件。
! Configuration File for keepalived 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 checkhaproxy { script "/etc/keepalived/do_sth.sh" # 以检测业务进程是否运行正常。“do_sth.sh”是自定义的业务进程检测脚本,请根据业务需要来执行。执行时,“do_sth.sh”须替换为实际的脚本名称。 interval 5 } vrrp_instance VI_1 { state BACKUP # 设置Keepalived节点的初始状态。MASTER表示主用状态,BACKUP表示备用状态。本示例中,设置veEN_02为BACKUP。 interface eth0 # 设置绑定高可用虚拟IP的实例网卡。该网卡用于发送VRRP包。本示例中,使用eth0。 virtual_router_id 51 # 设置集群的虚拟路由器ID。 nopreempt # 设置为非抢占模式。当高优先级的边缘实例恢复后,低优先级的边缘实例仍为MASTER。 preempt_delay 10 # 设置仅state为MASTER时抢占延迟。 priority 50 # 设置优先级,数字越大优先级越高。本示例中,veEN_02优先级设置为50。 advert_int 5 authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 192.168.7.9 # 设置边缘实例veEN_02的私网IP地址。本示例中,使用192.168.7.9,您在操作时须替换为实际的私网IP地址。 unicast_peer { 192.168.7.8 # 设置对端设备(边缘实例veEN_01)的私网IP地址。本示例中,使用192.168.7.8,您在操作时须替换为实际的私网IP地址。 } virtual_ipaddress { 192.168.7.4 # 设置高可用虚拟IP的IP地址。本示例中,使用192.168.7.4,您在操作时须替换为实际的高可用虚拟IP的IP地址。 } notify_master "/etc/keepalived/notify_action.sh MASTER" # notify_action 的示例参见“notify_action配置说明”。 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_delay 1 # 设置边缘实例切换为主用状态后更新ARP缓存的时间。 garp_master_refresh 5 # 设置主边缘实例发送ARP报文的时间间隔。 track_interface { eth0 # 使用绑定了高可用虚拟IP的网卡。本示例中,使用eth0。 } track_script { checkhaproxy } }
按Esc
键后,输入:wq
,然后按Enter
键来保存设置并退出编辑器。
执行以下命令,启动veEN_02的Keepalived,使步骤6中的配置生效。
systemctl start keepalived
参照以下步骤分别将高可用虚拟IP绑定到两个边缘实例: