求助keepalived 配置vipvip不能访问

24被浏览4865分享邀请回答0添加评论分享收藏感谢收起用户名:自由linux
文章数:290
评论数:280
访问量:415184
注册日期:
阅读量:1297
阅读量:3317
阅读量:585294
阅读量:470978
51CTO推荐博文
一 故障描述我在台湾合作方给定的两台虚拟机上部署HAProxy+Keepalived负载均衡高可用方案。在配置完Keepalived后,重新启动Keepalived,Keepalived没有绑定VIP。Keepalived执行程序路径为/data/app_platform/keepalived/sbin/keepalived配置文件路径为/data/app_platform/keepalived/conf/keepalived.conf &Keepalived的启动脚本为/etc/init.d/keepalivedkeepalived.conf的内容LB1 Master!&Configuration&File&for&keepalived
global_defs&{
&&&notification_email&{
&&&notification_email_from&
&&&smtp_server&127.0.0.1
&&&smtp_connect_timeout&30
&&&router_id&LB1_MASTER
&vrrp_script&chk_haproxy&{
&&&&&&&&script&"killall&-0&haproxy"
&&&&&&&&interval&2
&&&&weight&2
vrrp_instance&VI_1&{
&&&&state&MASTER
&&&&interface&eth1
&&&&virtual_router_id&51
&&&&priority&100
&&&&advert_int&1
&&&&authentication&{
&&&&&&&&auth_type&PASS
&&&&&&&&auth_pass&1111
&&&&virtual_ipaddress&{
&&&&&10.1.1.200/24&&&&&&brd&10.1.1.255&&&&&&dev&eth1&label&eth1:vip
&&&&track_script&{
&&&&&&&&chk_haproxy
&&&&&&&&&&&&&&&&&}
}重新启动Keepalived查看日志Mar&&3&18:09:00&cv-1&Keepalived[20138]:&Stopping&Keepalived&v1.2.15&(02/28,2015)
Mar&&3&18:09:00&cv-1&Keepalived[20259]:&Starting&Keepalived&v1.2.15&(02/28,2015)
Mar&&3&18:09:00&cv-1&Keepalived[20260]:&Starting&Healthcheck&child&process,&pid=20261
Mar&&3&18:09:00&cv-1&Keepalived[20260]:&Starting&VRRP&child&process,&pid=20262
Mar&&3&18:09:00&cv-1&Keepalived_vrrp[20262]:&Registering&Kernel&netlink&reflector
Mar&&3&18:09:00&cv-1&Keepalived_vrrp[20262]:&Registering&Kernel&netlink&command&channel
Mar&&3&18:09:00&cv-1&Keepalived_vrrp[20262]:&Registering&gratuitous&ARP&shared&channel
Mar&&3&18:09:00&cv-1&Keepalived_healthcheckers[20261]:&Registering&Kernel&netlink&reflector
Mar&&3&18:09:00&cv-1&Keepalived_healthcheckers[20261]:&Registering&Kernel&netlink&command&channel
Mar&&3&18:09:00&cv-1&Keepalived_healthcheckers[20261]:&Configuration&is&using&:&3924&Bytes
Mar&&3&18:09:00&cv-1&Keepalived_healthcheckers[20261]:&Using&LinkWatch&kernel&netlink&reflector...
Mar&&3&18:09:00&cv-1&Keepalived_vrrp[20262]:&Configuration&is&using&:&55712&Bytes
Mar&&3&18:09:00&cv-1&Keepalived_vrrp[20262]:&Using&LinkWatch&kernel&netlink&reflector...
Mar&&3&18:09:18&cv-1&kernel:&__ratelimit:&1964&callbacks&suppressed
Mar&&3&18:09:18&cv-1&kernel:&Neighbour&table&overflow.
Mar&&3&18:09:18&cv-1&kernel:&Neighbour&table&overflow.
Mar&&3&18:09:18&cv-1&kernel:&Neighbour&table&overflow.
Mar&&3&18:09:18&cv-1&kernel:&Neighbour&table&overflow.
Mar&&3&18:09:18&cv-1&kernel:&Neighbour&table&overflow.
Mar&&3&18:09:18&cv-1&kernel:&Neighbour&table&overflow.
Mar&&3&18:09:18&cv-1&kernel:&Neighbour&table&overflow.
Mar&&3&18:09:18&cv-1&kernel:&Neighbour&table&overflow.
Mar&&3&18:09:18&cv-1&kernel:&Neighbour&table&overflow.
Mar&&3&18:09:18&cv-1&kernel:&Neighbour&table&overflow.查看VIP绑定情况$&ifconfig&eth1:vip
eth1:vip&&&Link&encap:Ethernet&&HWaddr&00:16:3E:F2:37:6B&&
&&&&&&&&&&UP&BROADCAST&RUNNING&MULTICAST&&MTU:1500&&Metric:1
&&&&&&&&&&Interrupt:13没有VIP绑定二 排查过程1)检查VIP的配置情况向合作方确认提供的VIP的详细情况IPADDR &&10.1.1.200NETMASK & 255.255.255.0GATEWAY & 10.1.1.1Brodcast &10.1.1.255&&&这里设置的是10.1.1.200/24 & & &brd 10.1.1.255 & & &dev eth1 label eth1:vip2)检查iptables和selinux的设置情况$&sudo&service&iptables&stop
$&sudo&setenforce&0
setenforce:&SELinux&is&disabled如果非要开启iptables的话,需要作些设定iptables&-I&INPUT&-i&eth1&-d&224.0.0.0/8&-j&ACCEPT
service&iptables&savekeepalived使用224.0.0.18作为Master和Backup健康检查的通信IP3)检查相关的内核参数HAProxy+Keepalived架构需要注意的内核参数有:# Controls IP packet forwardingnet.ipv4.ip_forward = 1开启IP转发功能net.ipv4.ip_nonlocal_bind = 1开启允许绑定非本机的IP如果使用LVS的DR或者TUN模式结合Keepalived需要在后端真实服务器上特别设置两个arp相关的参数。这里也设置好。net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.lo.arp_announce = 2net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 24)检查VRRP的设置情况LB1 Masterstate&MASTER
&&&&interface&eth1
&&&&virtual_router_id&51
&&&&priority&100LB2 Backupstate&BACKUP
&&&&interface&eth1
&&&&virtual_router_id&51
&&&&priority&99Master和Backup的virtual_router_id需要一样,priority需要不一样,数字越大,优先级越高5)怀疑是编译安装Keepalived版本出现了问题重新下载并编译2.1.13的版本,并重新启动keepalived,VIP仍然没有被绑定。线上有个平台的keepalived是通过yum安装的,于是打算先用yum安装keepalived后将配置文件复制过去看看是否可以绑定VIPrpm -ivh
yum -y install keepalivedcp&/data/app_platform/keepalived/conf/keepalived.conf &/etc/keepalived/keepalived.conf重新启动keepalived然后查看日志Mar&&4&16:42:46&xxxxx&Keepalived_healthcheckers[17332]:&Registering&Kernel&netlink&reflector
Mar&&4&16:42:46&xxxxx&Keepalived_healthcheckers[17332]:&Registering&Kernel&netlink&command&channel
Mar&&4&16:42:46&xxxxx&Keepalived_vrrp[17333]:&Opening&file&'/etc/keepalived/keepalived.conf'.
Mar&&4&16:42:46&xxxxx&Keepalived_vrrp[17333]:&Configuration&is&using&:&65250&Bytes
Mar&&4&16:42:46&xxxxx&Keepalived_vrrp[17333]:&Using&LinkWatch&kernel&netlink&reflector...
Mar&&4&16:42:46&xxxxx&Keepalived_vrrp[17333]:&VRRP&sockpool:&[ifindex(3),&proto(112),&unicast(0),&fd(10,11)]
Mar&&4&16:42:46&xxxxx&Keepalived_healthcheckers[17332]:&Opening&file&'/etc/keepalived/keepalived.conf'.
Mar&&4&16:42:46&xxxxx&Keepalived_healthcheckers[17332]:&Configuration&is&using&:&7557&Bytes
Mar&&4&16:42:46&xxxxx&Keepalived_healthcheckers[17332]:&Using&LinkWatch&kernel&netlink&reflector...
Mar&&4&16:42:46&xxxxx&Keepalived_vrrp[17333]:&VRRP_Script(chk_haproxy)&succeeded
Mar&&4&16:42:47&xxxxx&Keepalived_vrrp[17333]:&VRRP_Instance(VI_1)&Transition&to&MASTER&STATE
Mar&&4&16:42:48&xxxxx&Keepalived_vrrp[17333]:&VRRP_Instance(VI_1)&Entering&MASTER&STATE
Mar&&4&16:42:48&xxxxx&Keepalived_vrrp[17333]:&VRRP_Instance(VI_1)&setting&protocol&VIPs.
Mar&&4&16:42:48&xxxxx&Keepalived_vrrp[17333]:&VRRP_Instance(VI_1)&Sending&gratuitous&ARPs&on&eth1&for&10.1.1.200
Mar&&4&16:42:48&xxxxx&Keepalived_healthcheckers[17332]:&Netlink&reflector&reports&IP&10.1.1.200&added
Mar&&4&16:42:53&xxxxx&Keepalived_vrrp[17333]:&VRRP_Instance(VI_1)&Sending&gratuitous&ARPs&on&eth1&for&10.1.1.200再查看IP绑定情况$&ifconfig&eth1:vip
eth1:vip&&Link&encap:Ethernet&&HWaddr&00:16:3E:F2:37:6B&&
&&&&&&&&&&inet&addr:10.1.1.200&&Bcast:10.1.1.255&&Mask:255.255.255.0
&&&&&&&&&&UP&BROADCAST&RUNNING&MULTICAST&&MTU:1500&&Metric:1
&&&&&&&&&&Interrupt:13再通过yum将keepalived卸载掉yum remove keepalived恢复到原来的启动脚本/etc/init.d/keepalived重新启动keepalived后还是无法绑定VIP怀疑是keepalived启动脚本/etc/init.d/keepalived的问题检查/etc/init.d/keepalived#&Source&function&library.
.&/etc/rc.d/init.d/functions
exec="/data/app_platform/keepalived/sbin/keepalived"
prog="keepalived"
config="/data/app_platform/keepalived/conf/keepalived.conf"
[&-e&/etc/sysconfig/$prog&]&&&&.&/etc/sysconfig/$prog
lockfile=/var/lock/subsys/keepalived
&&&&[&-x&$exec&]&||&exit&5
&&&&[&-e&$config&]&||&exit&6
&&&&echo&-n&$"Starting&$prog:&"
&&&&daemon&$exec&$KEEPALIVED_OPTIONS
&&&&retval=$?
&&&&[&$retval&-eq&0&]&&&&touch&$lockfile
&&&&return&$retval
}关键是这一行daemon&$exec&$KEEPALIVED_OPTIONS由于没有复制/etc/sysconfig/keepalived,所以将直接执行damon /data/app_platform/keepalived/sbin/keepalived由于keepalived默认使用的是/etc/keepalived/keepalived.conf作为配置文件,而这里指定了不同的配置文件,所以要修改成为&daemon&$exec&-D&-f&$config重新启动keepalived,查看日志和VIP绑定情况$&ifconfig&eth1:vip
eth1:vip&&Link&encap:Ethernet&&HWaddr&00:16:3E:F2:37:6B&&
&&&&&&&&&&inet&addr:10.1.1.200&&Bcast:10.1.1.255&&Mask:255.255.255.0
&&&&&&&&&&UP&BROADCAST&RUNNING&MULTICAST&&MTU:1500&&Metric:1
&&&&&&&&&&Interrupt:136)将LB2 Backup的keepalived启动脚本也修改一下,观察VIP接管情况查看LB1 Master$&ifconfig&eth1:vip
eth1:vip&&Link&encap:Ethernet&&HWaddr&00:16:3E:F2:37:6B&&
&&&&&&&&&&inet&addr:10.1.1.200&&Bcast:10.1.1.255&&Mask:255.255.255.0
&&&&&&&&&&UP&BROADCAST&RUNNING&MULTICAST&&MTU:1500&&Metric:1
&&&&&&&&&&Interrupt:13查看LB2 Backup$&ifconfig&eth1:vip
eth1:vip&&Link&encap:Ethernet&&HWaddr&00:16:3E:F2:37:6B&&
&&&&&&&&&&inet&addr:10.1.1.200&&Bcast:10.1.1.255&&Mask:255.255.255.0
&&&&&&&&&&UP&BROADCAST&RUNNING&MULTICAST&&MTU:1500&&Metric:1
&&&&&&&&&&Interrupt:13问题出现了,LB1 Master和LB2 Backup都绑定了VIP 10.1.1.200,这是不正常的!!!!在LB1和LB2上登录10.1.1.200看看[lb1&~]$&ssh&10.1.1.200&
Last&login:&Wed&Mar&&4&17:31:33&2015&from&10.1.1.200
[lb1&~]$[lb2&~]$&ssh&10.1.1.200
Last&login:&Wed&Mar&&4&17:54:57&2015&from&101.95.153.246
[b2&&~]$在LB1上停掉keepalived,ping下10.1.1.200这个IP,发现无法ping通在LB2上停掉keepalived,ping下10.1.1.200这个IP,发现也无法ping通然后开启LB1上的keepalived,LB1上可以ping通10.1.1.200,LB2上不行开启LB2上的keepalived,LB2上可以ping通10.1.1.200由此得出,LB1和LB2各自都将VIP 10.1.1.200绑定到本机的eth1网卡上。两台主机并没有VRRP通信,没有VRRP的优先级比较。7)排查影响VRRP通信的原因重新启动LB1 Master的Keepalived查看日志Mar&&5&15:45:36&gintama-taiwan-lb1&Keepalived_vrrp[32303]:&Configuration&is&using&:&65410&Bytes
Mar&&5&15:45:36&gintama-taiwan-lb1&Keepalived_vrrp[32303]:&Using&LinkWatch&kernel&netlink&reflector...
Mar&&5&15:45:36&gintama-taiwan-lb1&Keepalived_vrrp[32303]:&VRRP&sockpool:&[ifindex(3),&proto(112),&unicast(0),&fd(10,11)]
Mar&&5&15:45:36&gintama-taiwan-lb1&Keepalived_vrrp[32303]:&VRRP_Script(chk_haproxy)&succeeded
Mar&&5&15:45:37&gintama-taiwan-lb1&Keepalived_vrrp[32303]:&VRRP_Instance(VI_1)&Transition&to&MASTER&STATE
Mar&&5&15:45:38&gintama-taiwan-lb1&Keepalived_vrrp[32303]:&VRRP_Instance(VI_1)&Entering&MASTER&STATE
Mar&&5&15:45:38&gintama-taiwan-lb1&Keepalived_vrrp[32303]:&VRRP_Instance(VI_1)&setting&protocol&VIPs.
Mar&&5&15:45:38&gintama-taiwan-lb1&Keepalived_vrrp[32303]:&VRRP_Instance(VI_1)&Sending&gratuitous&ARPs&on&eth1&for&10.1.1.200
Mar&&5&15:45:38&gintama-taiwan-lb1&Keepalived_healthcheckers[32302]:&Netlink&reflector&reports&IP&10.1.1.200&added
Mar&&5&15:45:43&gintama-taiwan-lb1&Keepalived_vrrp[32303]:&VRRP_Instance(VI_1)&Sending&gratuitous&ARPs&on&eth1&for&10.1.1.200发现LB1 Master上的Keepalived直接进入Master状态,然后接管VIP再重新启动LB2 Backup上的Keepalived,查看日志Mar&&5&15:47:42&gintama-taiwan-lb2&Keepalived_vrrp[30619]:&Configuration&is&using&:&65408&Bytes
Mar&&5&15:47:42&gintama-taiwan-lb2&Keepalived_vrrp[30619]:&Using&LinkWatch&kernel&netlink&reflector...
Mar&&5&15:47:42&gintama-taiwan-lb2&Keepalived_vrrp[30619]:&VRRP_Instance(VI_1)&Entering&BACKUP&STATE
Mar&&5&15:47:42&gintama-taiwan-lb2&Keepalived_vrrp[30619]:&VRRP&sockpool:&[ifindex(3),&proto(112),&unicast(0),&fd(10,11)]
Mar&&5&15:47:46&gintama-taiwan-lb2&Keepalived_vrrp[30619]:&VRRP_Instance(VI_1)&Transition&to&MASTER&STATE
Mar&&5&15:47:47&gintama-taiwan-lb2&Keepalived_vrrp[30619]:&VRRP_Instance(VI_1)&Entering&MASTER&STATE
Mar&&5&15:47:47&gintama-taiwan-lb2&Keepalived_vrrp[30619]:&VRRP_Instance(VI_1)&setting&protocol&VIPs.
Mar&&5&15:47:47&gintama-taiwan-lb2&Keepalived_vrrp[30619]:&VRRP_Instance(VI_1)&Sending&gratuitous&ARPs&on&eth1&for&10.1.1.200
Mar&&5&15:47:47&gintama-taiwan-lb2&Keepalived_healthcheckers[30618]:&Netlink&reflector&reports&IP&10.1.1.200&added
Mar&&5&15:47:52&gintama-taiwan-lb2&Keepalived_vrrp[30619]:&VRRP_Instance(VI_1)&Sending&gratuitous&ARPs&on&eth1&for&10.1.1.200可以看到LB2上的Keepalived先进入BACKUP状态,然后又转为MASTER状态,然后接管VIP这样就说明VRRP组播有问题。既然VRRP组播有问题,就尝试使用单播发送VRRP报文。修改LB1和LB2的配置LB1添加以下配置&&&&unicast_src_ip&&10.1.1.12
&&&&unicast_peer&{
&&&&&&&&&&&&&&&&&&10.1.1.17
&&&&&&&&&&&&&&&&&}LB2添加以下配置&unicast_src_ip&&10.1.1.17
&unicast_peer&{
&&&&&&&&&&&&&&&&&&10.1.1.12
&&&&&&&&&&&&&&&&&}unicast_src_ip 表示发送VRRP单播报文使用的源IP地址unicast_peer 表示对端接收VRRP单播报文的IP地址然后各自重新加载keepalived,观察日志LB1Mar&&5&16:13:35&gintama-taiwan-lb1&Keepalived_vrrp[2551]:&VRRP_Instance(VI_1)&setting&protocol&VIPs.
Mar&&5&16:13:35&gintama-taiwan-lb1&Keepalived_vrrp[2551]:&VRRP_Script(chk_haproxy)&considered&successful&on&reload
Mar&&5&16:13:35&gintama-taiwan-lb1&Keepalived_vrrp[2551]:&Configuration&is&using&:&65579&Bytes
Mar&&5&16:13:35&gintama-taiwan-lb1&Keepalived_vrrp[2551]:&Using&LinkWatch&kernel&netlink&reflector...
Mar&&5&16:13:35&gintama-taiwan-lb1&Keepalived_vrrp[2551]:&VRRP&sockpool:&[ifindex(3),&proto(112),&unicast(1),&fd(10,11)]
Mar&&5&16:13:36&gintama-taiwan-lb1&Keepalived_vrrp[2551]:&VRRP_Instance(VI_1)&Transition&to&MASTER&STATE
Mar&&5&16:13:48&gintama-taiwan-lb1&Keepalived_vrrp[2551]:&VRRP_Instance(VI_1)&Received&lower&prio&advert,&forcing&new&election
Mar&&5&16:13:48&gintama-taiwan-lb1&Keepalived_vrrp[2551]:&VRRP_Instance(VI_1)&Sending&gratuitous&ARPs&on&eth1&for&10.1.1.200
Mar&&5&16:13:48&gintama-taiwan-lb1&Keepalived_vrrp[2551]:&VRRP_Instance(VI_1)&Received&lower&prio&advert,&forcing&new&election
Mar&&5&16:13:48&gintama-taiwan-lb1&Keepalived_vrrp[2551]:&VRRP_Instance(VI_1)&Sending&gratuitous&ARPs&on&eth1&for&10.1.1.200LB2Mar&&5&16:13:48&gintama-taiwan-lb2&Keepalived_vrrp[453]:&VRRP_Instance(VI_1)&Received&higher&prio&advert
Mar&&5&16:13:48&gintama-taiwan-lb2&Keepalived_vrrp[453]:&VRRP_Instance(VI_1)&Entering&BACKUP&STATE
Mar&&5&16:13:48&gintama-taiwan-lb2&Keepalived_vrrp[453]:&VRRP_Instance(VI_1)&removing&protocol&VIPs.
Mar&&5&16:13:48&gintama-taiwan-lb2&Keepalived_healthcheckers[452]:&Netlink&reflector&reports&IP&10.1.1.200&removed查看VIP绑定情况,发现LB2上的VIP已经移除在LB1上LB2上执行ping 10.1.1.200这个VIP[lb1&~]$&ping&-c&5&10.1.1.200
PING&10.1.1.200&(10.1.1.200)&56(84)&bytes&of&data.
64&bytes&from&10.1.1.200:&icmp_seq=1&ttl=64&time=0.028&ms
64&bytes&from&10.1.1.200:&icmp_seq=2&ttl=64&time=0.020&ms
64&bytes&from&10.1.1.200:&icmp_seq=3&ttl=64&time=0.020&ms
64&bytes&from&10.1.1.200:&icmp_seq=4&ttl=64&time=0.021&ms
64&bytes&from&10.1.1.200:&icmp_seq=5&ttl=64&time=0.027&ms
---&10.1.1.200&ping&statistics&---
5&packets&transmitted,&5&received,&0%&packet&loss,&time&3999ms
rtt&min/avg/max/mdev&=&0.020/0.023/0.028/0.004&ms[lb2&~]$&ping&-c&5&10.1.1.200&
PING&10.1.1.200&(10.1.1.200)&56(84)&bytes&of&data.
---&10.1.1.200&ping&statistics&---
5&packets&transmitted,&0&received,&100%&packet&loss,&time&14000ms当LB1接管VIP的时候LB2居然无法ping通VIP,同样将LB1的Keepalived停掉,LB2可以接管VIP,但是在LB1上无法ping通这个VIP在LB1和LB2上进行抓包lb1&~]$&sudo&tcpdump&-vvv&&-i&eth1&host&10.1.1.17
tcpdump:&listening&on&eth1,&link-type&EN10MB&(Ethernet),&capture&size&65535&bytes
16:46:04.827357&IP&(tos&0xc0,&ttl&255,&id&328,&offset&0,&flags&[none],&proto&VRRP&(112),&length&40)
&&&&10.1.1.12&&&10.1.1.17:&VRRPv2,&Advertisement,&vrid&51,&prio&102,&authtype&simple,&intvl&1s,&length&20,&addrs:&10.1.1.200&auth&"1111^@^@^@^@"
16:46:05.827459&IP&(tos&0xc0,&ttl&255,&id&329,&offset&0,&flags&[none],&proto&VRRP&(112),&length&40)
&&&&10.1.1.12&&&10.1.1.17:&VRRPv2,&Advertisement,&vrid&51,&prio&102,&authtype&simple,&intvl&1s,&length&20,&addrs:&10.1.1.200&auth&"1111^@^@^@^@"
16:46:06.828234&IP&(tos&0xc0,&ttl&255,&id&330,&offset&0,&flags&[none],&proto&VRRP&(112),&length&40)
&&&&10.1.1.12&&&10.1.1.17:&VRRPv2,&Advertisement,&vrid&51,&prio&102,&authtype&simple,&intvl&1s,&length&20,&addrs:&10.1.1.200&auth&"1111^@^@^@^@"
16:46:07.828338&IP&(tos&0xc0,&ttl&255,&id&331,&offset&0,&flags&[none],&proto&VRRP&(112),&length&40)
&&&&10.1.1.12&&&10.1.1.17:&VRRPv2,&Advertisement,&vrid&51,&prio&102,&authtype&simple,&intvl&1s,&length&20,&addrs:&10.1.1.200&auth&"1111^@^@^@^@"lb2&~]$&sudo&tcpdump&-vvv&-i&eth1&host&10.1.1.12
tcpdump:&listening&on&eth1,&link-type&EN10MB&(Ethernet),&capture&size&65535&bytes
16:48:07.000029&IP&(tos&0xc0,&ttl&255,&id&450,&offset&0,&flags&[none],&proto&VRRP&(112),&length&40)
&&&&10.1.1.12&&&10.1.1.17:&VRRPv2,&Advertisement,&vrid&51,&prio&102,&authtype&simple,&intvl&1s,&length&20,&addrs:&10.1.1.200&auth&"1111^@^@^@^@"
16:48:07.999539&IP&(tos&0xc0,&ttl&255,&id&451,&offset&0,&flags&[none],&proto&VRRP&(112),&length&40)
&&&&10.1.1.12&&&10.1.1.17:&VRRPv2,&Advertisement,&vrid&51,&prio&102,&authtype&simple,&intvl&1s,&length&20,&addrs:&10.1.1.200&auth&"1111^@^@^@^@"
16:48:08.999252&IP&(tos&0xc0,&ttl&255,&id&452,&offset&0,&flags&[none],&proto&VRRP&(112),&length&40)
&&&&10.1.1.12&&&10.1.1.17:&VRRPv2,&Advertisement,&vrid&51,&prio&102,&authtype&simple,&intvl&1s,&length&20,&addrs:&10.1.1.200&auth&"1111^@^@^@^@"
16:48:09.999560&IP&(tos&0xc0,&ttl&255,&id&453,&offset&0,&flags&[none],&proto&VRRP&(112),&length&40)
&&&&10.1.1.12&&&10.1.1.17:&VRRPv2,&Advertisement,&vrid&51,&prio&102,&authtype&simple,&intvl&1s,&length&20,&addrs:&10.1.1.200&auth&"1111^@^@^@^@"在LB1和LB2所在物理机上的其他虚拟机进行VIP ping测试,同样只能是LB1上绑定的VIP只能是LB1所在的物理机上的虚拟机可以ping通,LB2所在的物理机上的虚拟机无法ping通,反之也是一样有同行建议说VRRP和DHCP也有关系,经过查看对方提供的VM的IP地址居然是DHCP分配的,但是经过测试,VRRP和DHCP没有关系。线上环境最好不要使用DHCP来获取IP地址。8)请对方技术人员配合检查VIP无法ping通的问题最终查明对方的内网居然使用的虚拟网络,网关是没有实际作用的。所以部分虚拟机无法通过10.1.1.1这个网关去访问VIP。让对方虚拟机提供方的技术人员到服务器调试HAProxy+Keepalived,他们通过网络设置使得10.1.1.200这个VIP可以通过内网访问。但是当我测试时,发现当HAProxy挂掉后,Keepalived无法作VIP的切换。9)解决当HAProxy挂掉后,Keepalived无法对VIP切换的问题。经过反复测试,发现当Keepalived挂掉后,VIP可以切换。但是当HAProxy挂掉后,VIP无法切换。仔细检查配置文件和查阅相关资料,最终确定是Keepalived的weight和priority两个参数的大小设置问题。原来的配置文件中我设置LB1的weight为2,priority为100。LB2的weight为2,priority为99对方在调试的时候将LB1的priority更改为160.这样反复测试当LB1的HAProxy挂掉后,VIP都无法迁移到LB2上。将LB1上的priority更改为100就可以了。这里需要注意的是:主keepalived的priority值与vrrp_script的weight值相减的数字小于备用keepalived的priority 值即可!vrrp_script 里的script返回值为0时认为检测成功,其它值都会当成检测失败* weight 为正时,脚本检测成功时此weight会加到priority上,检测失败时不加。主失败:& && && && &主 priority & 从 priority + weight 时会切换。主成功:& && && && &主 priority + weight & 从 priority + weight 时,主依然为主* weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority - abs(weight)主失败:& && && &&&主 priority - abs(weight) & 从priority 时会切换主从主成功:& && && &&&主 priority & 从priority 主依然为主。最终的配置文件为:!&Configuration&File&for&keepalived
global_defs&{
&&&notification_email&{
&&&notification_email_from&
&&&smtp_server&127.0.0.1
&&&smtp_connect_timeout&30
&&&router_id&LB1_MASTER
&vrrp_script&chk_haproxy&{
&&&&script&"killall&-0&haproxy"
&&&&interval&2
&&&&weight&2
#设置外网的VIP
vrrp_instance&eth0_VIP&{
&&&&state&MASTER
&&&&interface&eth0
&&&&virtual_router_id&51
&&&&priority&100
&&&&advert_int&1
&&&&authentication&{
&&&&&&&&auth_type&PASS
&&&&&&&&auth_pass&1111
&&&&unicast_src_ip&&8.8.8.6&&&&&&&&#使用VRRP的单播
&&&&unicast_peer&{
&&&&&&&&&&&&&&&&&&&8.8.8.7
&&&&&&&&&&&&&&&&&}
&&&&virtual_ipaddress&{
&&&&&8.8.8.8/25&&brd&8.8.8.255&&dev&eth0&label&eth0:vip
&&&&track_script&{
&&&&&&&&chk_haproxy
&&&&&&&&&&&&&&&&&}
#设置内网的VIP
vrrp_instance&eth1_VIP&{
&&&&state&MASTER
&&&&interface&eth1
&&&&virtual_router_id&52
&&&&priority&100
&&&&advert_int&1
&&&&authentication&{
&&&&&&&&auth_type&PASS
&&&&&&&&auth_pass&1111
&&&&unicast_src_ip&&10.1.1.12
&&&&unicast_peer&{
&&&&&&&&&&&&&&&&&&10.1.1.17
&&&&&&&&&&&&&&&&&}
&&&&virtual_ipaddress&{
&&&&&10.1.1.200/24&&&&&brd&10.1.1.255&&&&&&dev&eth1&label&eth1:vip
&&&&track_script&{
&&&&&&&&chk_haproxy
&&&&&&&&&&&&&&&&&}
}三 排查总结在配置Keepalived的时候,需要注意以下几点:A.内核开启IP转发和允许非本地IP绑定功能,如果是使用LVS的DR模式还需设置两个arp相关的参数。B.如果Keepalived所在网络不允许使用组播,可以使用VRRP单播C.需要注意主备的weight和priority的值,这两个值如果设置不合理可能会影响VIP的切换。D.如果使用的配置文件不是默认的配置文件,在启动Keepalived的时候需要使用 -f 参数指定配置文件。参考文档:
本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
15:15:15 16:06:20keepalived工作原理和配置说明 - 为程序员服务
为程序员服务
keepalived工作原理和配置说明
keepalived是什么
keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于,用来防止单点故障。
keepalived工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据来。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
keepalived的配置文件
keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。
global_defs区域
主要是配置故障发生时的通知对象以及机器标识
global_defs {
notification_email {
notification_email_from
smtp_server
smtp_connect_timeout 30
enable_traps
router_id host163
notification_email 故障发生时给谁发邮件通知。
notification_email_from 通知邮件从哪个地址发出。
smpt_server 通知邮件的smtp地址。
smtp_connect_timeout 连接smtp服务器的超时时间。
enable_traps 开启SNMP陷阱()。
router_id 标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。
static_ipaddress和static_routes区域
static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。
static_ipaddress {
10.210.214.163/24 brd 10.210.214.255 dev eth0
static_routes {
10.0.0.0/8 via 10.210.214.1 dev eth0
以上分别表示启动/关闭keepalived时在本机执行的如下命令:
# /sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0
# /sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0
注意: 请忽略这两个区域,因为我坚信你的机器肯定已经配置了IP和路由。
vrrp_script区域
用来做健康检查的,当时检查失败时会将vrrp_instance的priority减少相应的值。
vrrp_script chk_http_port {
script "&/dev/tcp/127.0.0.1/80"
interval 1
weight -10
以上意思是如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。
vrrp_instance和vrrp_sync_group区域
vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。
vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:
两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。
vrrp_sync_group VG_1 {
inside_network
# name of vrrp_instance (below)
outside_network
# One for each moveable IP.
notify_master /path/to_master.sh
notify_backup /path/to_backup.sh
notify_fault "/path/fault.sh VG_1"
notify /path/notify.sh
smtp_alert
vrrp_instance VI_1 {
state MASTER
interface eth0
use_vmac &VMAC_INTERFACE&
dont_track_primary
track_interface {
mcast_src_ip &IPADDR&
lvs_sync_daemon_interface eth1
garp_master_delay 10
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
virtual_ipaddress {
10.210.214.253/24 brd 10.210.214.255 dev eth0
192.168.1.11/24 brd 192.168.1.255 dev eth1
virtual_routes {
172.16.0.0/12 via 10.210.214.1
192.168.1.0/24 via 192.168.1.1 dev eth1
default via 202.102.152.1
track_script {
chk_http_port
preempt_delay 300
notify_master &STRING&|&QUOTED-STRING&
notify_backup &STRING&|&QUOTED-STRING&
notify_fault &STRING&|&QUOTED-STRING&
notify &STRING&|&QUOTED-STRING&
smtp_alert
notify_master/backup/fault 分别表示切换为主/备/出错时所执行的脚本。
notify 表示任何一状态切换时都会调用该脚本,并且该脚本在以上三个脚本执行完成之后进行调用,keepalived会自动传递三个参数($1 = "GROUP"|"INSTANCE",$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。
smtp_alert 表示是否开启邮件通知(用全局区域的邮件设置来发通知)。
state 可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
interface 节点固有IP(非VIP)的网卡,用来发VRRP包。
use_vmac 是否使用VRRP的虚拟MAC地址。
dont_track_primary 忽略VRRP网卡错误。(默认未设置)
track_interface 监控以下网卡,如果任何一个不通就会切换到FALT状态。(可选项)
mcast_src_ip 修改vrrp组播包的源地址,默认源地址为master的IP。(由于是组播,因此即使修改了源地址,该master还是能收到回应的)
lvs_sync_daemon_interface 绑定lvs syncd的网卡。
garp_master_delay 当切为主状态后多久更新ARP缓存,默认5秒。
virtual_router_id 取值在0-255之间,用来区分多个instance的VRRP组播。
注意: 同一网段中virtual_router_id的值不能重复,否则会出错,相关错误信息如下。
Keepalived_vrrp[27120]: ip address associated with VRID not present in received packet :
one or more VIP associated with VRID mismatch actual MASTER advert
bogus VRRP packet received on eth1 !!!
receive an invalid ip number count associated with VRID!
VRRP_Instance(xxx) ignoring received advertisment...
可以用这条命令来查看该网络中所存在的vrid:tcpdump -nn -i any net 224.0.0.0/8
priority 用来选举master的,要成为master,那么这个选项的值,该项是1-255(在此范围之外会被识别成默认值100)。
advert_int 发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)。
authentication 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。
virtual_ipaddress vip,不解释了。
virtual_routes 虚拟路由,当IP漂过来之后需要添加的路由信息。
virtual_ipaddress_excluded 发送的VRRP包里不包含的IP地址,为减少回应VRRP包的个数。在网卡上绑定的IP地址比较多的时候用。
nopreempt 允许一个priority比较低的节点作为master,即使有priority更高的节点启动。
首先nopreemt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。我个人推荐使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能,当想手动将某节点切换为MASTER时只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。
当使用track_script时可以不用加nopreempt,只需要加上preempt_delay 5,这里的间隔时间要大于vrrp_script中定义的时长。
preempt_delay master启动多久之后进行接管资源(VIP/Route信息等),并提是没有nopreempt选项。
virtual_server_group和virtual_server区域
virtual_server_group一般在超大型的LVS中用到,一般LVS用不过这东西,因此不多说。
virtual_server IP Port {
delay_loop &INT&
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
lb_kind NAT|DR|TUN
persistence_timeout &INT&
persistence_granularity &NETMASK&
protocol TCP
ha_suspend
virtualhost &STRING&
quorum &INT&
hysteresis &INT&
quorum_up &STRING&|&QUOTED-STRING&
quorum_down &STRING&|&QUOTED-STRING&
sorry_server &IPADDR& &PORT&
real_server &IPADDR& &PORT& {
weight &INT&
inhibit_on_failure
notify_up &STRING&|&QUOTED-STRING&
notify_down &STRING&|&QUOTED-STRING&
# HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
HTTP_GET|SSL_GET {
path &STRING&
# Digest computed with genhash
digest &STRING&
status_code &INT&
connect_port &PORT&
connect_timeout &INT&
nb_get_retry &INT&
delay_before_retry &INT&
delay_loop 延迟轮询时间(单位秒)。
lb_algo 后端调试算法(load balancing algorithm)。
lb_kind LVS调度类型//。
virtualhost 用来给HTTP_GET和SSL_GET配置请求header的。
sorry_server 当所有real server宕掉时,sorry server顶替。
real_server 真正提供服务的服务器。
weight 权重。
notify_up/down 当real server宕掉或启动时执行的脚本。
健康检查的方式,N多种方式。
path 请求real serserver上的路径。
digest/status_code 分别表示用genhash算出的结果和http状态码。
connect_port 健康检查,如果端口通则认为服务器正常。
connect_timeout,nb_get_retry,delay_before_retry分别表示超时时长、重试次数,下次重试的时间延迟。
其他选项暂时不作说明。
keepalived主从切换
主从切换比较让人蛋疼,需要将backup配置文件的priority选项的值调整的比master高50个点,然后reload配置文件就可以切换了。当时你也可以将master的keepalived停止,这样也可以进行主从切换。
keepalived仅做HA时的配置
请看该文档同级目录下的配置文件示例。
说明: 10.210.214.113 为keepalived的备机,其配置文件为113.keepalived.conf 10.210.214.163 为keepalived的主机,其配置文件为163.keepalived.conf 10.210.214.253 为Virtual IP,即提供服务的内网IP地址,在网卡eth0上面 192.168.1.11 为模拟的提供服务的公网IP地址,在网卡eth1上面
用tcpdump命令来捕获的结果如下:
17:20:07.919419 IP 10.210.214.163 & 224.0.0.18: VRRPv2, Advertisement, vrid 1, prio 200, authtype simple, intvl 1s, length 20
LVS+Keepalived配置
注Keepalived与LVS结合使用时一般还会用到一个工具ipvsadm,用来查看相关VS相关状态,关于ipvsadm的用法可以参考man手册。
10.67.15.95为keepalived master,VIP为10.67.15.94,配置文件为95-lvs-keepalived.conf 10.67.15.96为keepalived master,VIP为10.67.15.94,配置文件为96-lvs-keepalived.conf 10.67.15.195为real server
当使用LVS+DR+Keepalived配置时,需要在real server上添加一条iptables规则(其中dport根据情况添加或缺省):
# iptables -t nat -A PREROUTING -p tcp -d 10.67.15.94 --dport 80 -j REDIRECT
当使用LVS+NAT+Keepalived配置时,需要将real server的默认路由配置成Director的VIP10.67.15.94,必须确保client的请求是通过10.67.15.94到达real server的。
安装keepalived
从keepalived官网合适的版本,解压并执行如下命令完成安装。
# cd keepalived-xxx
# ./configure --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --mandir=/usr/share
# make && make install
你也可以打成包,然后安装。
我们用到的HA场景如下: 两台主机host113和host163,内网IP在eth1网卡上,分别是10.210.214.113和10.210.214.163,VIP为公网IP在eth0上,IP地址是202.102.152.253,网关为202.102.152.1。当VIP在host113上提供服务时,host113上的默认路由为202.102.152.1,提供服务的端口为202.102.152.253:443。host113发生故障需要将VIP及服务切回到host163上的时候,需要以下几步,第一将VIP接管过来,第二添加默认路由202.102.152.1,第三启动在端口202.102.152.253:443上的服务。
如此一来,keepalived需要另外的脚本来完成添加默认路由和启动服务工作,这点和heartbeat中的resources是相同的。目前我进行了测试,发现keepalived速度要比heartbeat快,也就是说效率比heartbeat高。并且,最重要的一点,keepalived支持多个backup。
不要问我为何有以上需求。要为两个不同的域名提供https服务,由于SSL证书问题,必须有两个公网IP地址分别绑定443端口。
当然,通过也可以实现一个公网IP绑定443端口来为多个域名提供https服务,但是这需要浏览器支持(M$的IE浏览器不支持)。(/)
keepalived的主从切换比较让人蛋疼,需要修改配置文件或停止一方的运行。但是由于keepalived是通过vrrp协议来实现failover(故障转移)的,因此也决定了手动主从切换的不便。
keepalived的文档也很旧了,一直都找不到合适的文档,之前我就一直忽略了vrrp_script这个区域,导致很多事情想不通。
另外,我发现我越来越喜欢keepalived了。。。
推荐阅读:
相关聚客文章

我要回帖

更多关于 keepalived vip 不通 的文章

 

随机推荐