KeepAlived故障转移实现高可用

简介

上一篇文章学习了一些KeepAlive基础,了解到KeepAlive使用VRRP协议实现高可用,主要有两个功能,分别是管理LVS的后端RealServer以及对Director的高可用,现在我们把这两个功能分开,先来对KeepAlived的高可用做实验。另外说下KeepAlived的常见工作模式。

  • 主/备模式:即单实例模式
  • 主/主模式:即多实例模式,也称双主模型, 即在配置文件中加入第二个虚拟IP,但是2个VIP所做的事情是一样的,这样的好处在于,能在实现高可用的同时,还能实现负载均衡的目的。

单实例模型的高可用

拓扑图

Keppalive的单实例高可用.png-7.4kB
Keppalive的单实例高可用.png-7.4kB

2台KeepAlived的服务器共同维护一个实例,默认A为MASTER,B为BACKUP当A发生故障后,由B接替。

同步时间:

[root@dr1 ~]# vim /etc/chrony.conf
server ntp1.aliyun.com iburst   #修改为阿里云的时间服务器
server ntp2.aliyun.com iburst

[root@dr2 ~]# vim /etc/chrony.conf
server ntp1.aliyun.com iburst   #修改为阿里云的时间服务器
server ntp2.aliyun.com iburst

安装keepalive

[root@dr1 ~]# yum install keepalived -y
[root@dr2 ~]# yum install keepalived -y

清空防火墙规则和关闭SELINUX

[root@dr1 ~]# iptables -F
[root@dr2 ~]# iptables -F

对默认的配置文件先做一个备份

[root@dr1 keepalived]# cp keepalived.conf{,.bak}
[root@dr2 keepalived]# cp keepalived.conf{,.bak}

编辑配置文件
DR1的配置

! Configuration File for keepalived

global_defs {
   notification_email {     #报警邮件
     root@localhost     #收件人地址
   }
   notification_email_from keepalive@localhost  #发件人地址
   smtp_server 127.0.0.1        #smtp服务器
   smtp_connect_timeout 30      #超时时间
   router_id DR1                #用于标识该机器的RID,应当是唯一的
    vrrp_garp_master_repeat 1   #当转换为MASTER状态时,在一组中一次发送的免费ARP数量。默认是5
    vrrp_mcast_group4 224.0.1.11    #用于发送和接受VRRP协议的组播地址
}



vrrp_instance VI_1 {
    state MASTER            #指定为MASTER
    interface ens33         #绑定在哪个网卡上
    virtual_router_id 51    #用于识别实例的VRID,同一实例中的VRID应当是相同的
    priority 100        #优先级
    advert_int 1        #通告发送间隔
    authentication {    #认证
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {     #VIP设置
        172.16.1.99/24 dev ens33 label ens33:0
    }

}

DR2的配置

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalive@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id DR2
   vrrp_garp_interval 0
   vrrp_gna_interval 0
    vrrp_mcast_group4 224.0.1.11
    vrrp_garp_master_repeat 1  
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 96
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
        172.16.1.99/24 dev ens33 label ens33:0
    }


}

抓包分析

在BACKUP的节点上对组播IP地址抓包,能抓到MASTER发过来的报文

[root@dr2 keepalived]# tcpdump -i ens33 -nn host 224.0.1.11
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
16:13:24.656748 IP 192.168.30.99 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
16:13:25.658750 IP 192.168.30.99 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20

测试能否冗余

在MASTER上把KeepAlived服务停掉,查看故障转移是否工作正常
未转移前的状态信息:

[root@dr2 keepalived]# systemctl status keepalived 
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; 


7月 02 16:25:20 dr2 Keepalived_vrrp[16878]: Registering gratuitous ARP shared channel
7月 02 16:25:20 dr2 Keepalived_vrrp[16878]: Opening file '/etc/keepalived/keepalived.conf'.
7月 02 16:25:30 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) removing protocol VIPs.
7月 02 16:25:30 dr2 Keepalived_vrrp[16878]: Using LinkWatch kernel netlink reflector...
7月 02 16:25:30 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) Entering BACKUP STATE
7月 02 16:25:30 dr2 Keepalived_vrrp[16878]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]

把MASTER停止后,BACKUP的状态信息

7月 02 16:30:26 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) Entering MASTER STATE   #转换为MASTER状态

7月 02 16:30:26 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) setting protocol VIPs.  #设置VIP
7月 02 16:30:26 dr2 Keepalived_vrrp[16878]: Sending gratuitous ARP on ens33 for 172.16.1.99    
7月 02 16:30:26 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for....1.99 #在ens33上发送免费ARP
7月 02 16:30:31 dr2 Keepalived_vrrp[16878]: Sending gratuitous ARP on ens33 for 172.16.1.99
7月 02 16:30:31 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for....1.99
Hint: Some lines were ellipsized, use -l to show in full.

转换时的抓包信息

[root@dr2 ~]# tcpdump -i ens33 -nn host 224.0.1.11
#以下是MASTER发出的VRRP通告,priorty为100
16:30:21.716547 IP 192.168.30.99 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
#当STOP掉MASTER的KeepAlived后,MASTER发出一个优先级为0的通告
16:30:25.026892 IP 192.168.30.99 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 0, authtype simple, intvl 1s, length 20
#随即,BACKUP就会抢掉该实例的MASTER位置
16:30:25.653251 IP 192.168.30.98 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 96, authtype simple, intvl 1s, length 20
#转为MASTER后,一直发出通告,此时priorty为96
16:30:26.655380 IP 192.168.30.98 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 96, authtype simple, intvl 1s, length 20

自定义报警脚本

脚本内容:

#!/bin/bash 
#
sendto=root@localhost

notify() {
subject="$(hostname) to be $1 ,vip floating"
body="$(date +%F" "%T):VRRP transition $(hostname) to be $1"
echo "$body" | mail -s "$subject" $sendto
}




case $1 in 
master)
    notify master 
    ;;
backup)
    notify backup
    ;;
fault)
    notify fault
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit 1
    ;;
esac

写好后,在vrrp实例中调用。

[root@dr1 keepalived]# vim keepalived.conf
vrrp_instance VI_1 {
notify_master "/etc/keepalived master"
notify_backup "/etc/keepalived backup"
notify_fault "/etc/keepalived fault"
}

当发生状态切换时,能够能够发送邮件

[root@dr1 keepalived]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 3 messages 2 unread
>U  1 root                  Mon Jul  2 17:36  19/667   "dr1 to be master ,vip floating"
 U  2 root                  Mon Jul  2 17:38  19/667   "dr1 to be backup ,vip floating"
    3 root                  Mon Jul  2 17:40  19/668   "dr1 to be master ,vip floating"

使用脚本更好的调试KeepAlived

在调试中,可能需要对KeepAlived进行多次转移操作,此时可以预先设置一个脚本,如果脚本返回非0值,则减少该实例的优先级,可以让BACKUP抢占。

首先定义一个脚本

[root@dr1 keepalived]# vim chk_down.sh 
#!/bin/bash
[ -f /etc/keepalived/down ] && exit 1 || exit 0
#此脚本的作用就是检查/etc/keepalived/是否存在down这个文件,如果存在则返回1,如果不存在此文件则返回0

在配置中定义一个脚本,并调用(单独一个新的上下文定义)

[root@dr1 keepalived]# vim keepalived.conf

vrrp_script chk_down {
    script "/etc/keepalived/chk_down.sh"     #检查/etc/keepalived/是否有down文件,如果有,则返回exit1,如果不存在则返回0
    interval 1  #检查间隔
    weight -5   #当检查失败,脚本返回非0值,即-5的优先级
    }


定义好后,在实例中启用脚本

vrrp_instance VI_1 {
 track_script {     #追踪此脚本
       chk_down
        }


}

当在当前节点上面的/etc/keepalived目录下创建了一个叫down的文件,keepalived在执行脚本的时候将会检查出,并且根据事先定义好的脚本规则,把优先级-5,小于BACKUP的优先级,BACKUP将会抢占该实例的MASTER位置;同理,如果删除该文件后,优先级将会+5,这时,就会抢回MASTER位置。

双主模型

Keppalive的双主模型.png-11.3kB
Keppalive的双主模型.png-11.3kB

简介

双主模型简单来说就是增加多一个实例,使用不同的VIP,如图所示,在实例1(VIP1)中,A为主(MASTER)B为备(BACKUP),在实例2(VIP2)中,A为备,B为主。

配置

在ServerA上增加一个实例,设置为备

[root@dr1 keepalived]# vim keepalived.conf

vrrp_instance VI_2 {
    state BACKUP        #设置为BACKUP
    interface ens33     #一个网卡能绑定多个实例。
    virtual_router_id 52    #VRID不同实例不能一样
    priority 96         #优先级
    advert_int 1        #VRRP报文的通告间隔
    authentication {    #认证相关
        auth_type PASS
        auth_pass ABC123
    }


    virtual_ipaddress {     #设置虚拟IP
        172.16.1.98/24 dev ens33 label ens33:1
    }


track_script {
        chk_down
}

#notify_master "/etc/keepalived/notify.sh master"
##notify_backup "/etc/keepalived/notify.sh backup"
#notify_fault "/etc/keepalived/notify.sh fault"
}

把配置复制到ServerB上,修改相应配置

[root@dr2 ~]# vim /etc/keepalived/keepalived.conf

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass ABC123
    }


    virtual_ipaddress {
        172.16.1.98/24 dev ens33 label ens33:1
    }


track_script {
        chk_down
}

#notify_master "/etc/keepalived/notify.sh master"
##notify_backup "/etc/keepalived/notify.sh backup"
#notify_fault "/etc/keepalived/notify.sh fault"
}

重启服务

[root@dr1 ~]# systemctl restart keepalived
[root@dr2 ~]# systemctl restart keepalived

分别查看ServerA和ServerB的IP情况

[root@dr1 keepalived]# ifconfig     #ServerA
...
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.1.99  netmask 255.255.255.0  broadcast \
        
        
        
[root@dr2 ~]# ifconfig      #ServerB
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.1.98  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:0c:29:1e:7a:1a  txqueuelen 1000  (Ethernet)

测试

先来检查ServerA的172.16.1.99故障转移能否工作
在前面已经指定了脚本,在此目录下一旦有名字down的文件,优先级将会减少5。此时BACKUP会抢占MASTER位置
在ServerA的/etc/keepalived/目录下新建down文件

[root@dr1 keepalived]# touch down

此时,实例1的VIP已经转移到了ServerB上

[root@dr2 ~]# tail -n 10 /var/log/messages 
Jul  2 22:40:46 node1 Keepalived_vrrp[21878]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jul  2 22:40:47 node1 Keepalived_vrrp[21878]: VRRP_Instance(VI_1) Entering MASTER STATE
Jul  2 22:40:47 node1 Keepalived_vrrp[21878]: VRRP_Instance(VI_1) setting protocol VIPs.

把ServerA的down文件删除,此时ServerA会重新抢占实例1 MASTER的位置

[root@dr1 keepalived]# tail -n 10 /var/log/messages 
Jul  2 22:43:37 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jul  2 22:43:38 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_1) Entering MASTER STATE
Jul  2 22:43:38 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_1) setting protocol VIPs.
Jul  2 22:43:38 node1 Keepalived_vrrp[24055]: Sending gratuitous ARP on ens33 for 172.16.1.99

接下来再来检查ServerB的172.16.1.98故障转移能否工作。
在ServerB的/etc/keepalived/目录下新建down文件

[root@dr2 keepalived]# touch down 

此时,实例2的VIP已经转移到了ServerA上

[root@dr1 keepalived]# tail /var/log/messages

Jul  2 22:46:12 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_2) forcing a new MASTER election
Jul  2 22:46:13 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_2) Transition to MASTER STATE
Jul  2 22:46:14 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_2) Entering MASTER STATE
Jul  2 22:46:14 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_2) setting protocol VIPs.
Jul  2 22:46:14 node1 Keepalived_vrrp[24055]: Sending gratuitous ARP on ens33 for 172.16.1.98

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容