keepalived使用子网卡的ip创建HA失败
Keepalived是个一个基于VRRP 协议来实现的 LVS 服务高可用方案的开源组件,可以利用其来解决单点故障问题。一个LVS服务器(Linux Virtual Server Linux虚拟服务器)会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
当利用keepalived配置主备ip地址进行组建HA时,发现当使用的ip为子网卡上的ip时,组建HA失败。
[ root@localhost ~]# ifconfig eth0: flags=4163 mtu 1500 inet 101.13.17.174 netmask 255.255.255.0 broadcast 10.14.15.255 inet6 2001:123::121 prefixlen 64 scopeid 0x0 inet6 fe80::eda:4lff:feld:b3f0 prefixlen 64 scopeid 0x20 ether 0c:da:4l:ld:b3:f0 txqueuelen 1000 (Ethernet) RX packets 4275596 bytes 902081284 (860.2 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1526855 bytes 209418917 (199.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0:1: flags=4l63 mtu 1500 inet 101.13.17.233 netmask 255.255.255.0 broadcast 10.14.15.255 ether 0c:da:4l:ld:b3:f0 txqueuelen 1000 (Ethernet) lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0xl0 loop txqueuelen 1000 (L ocal Loopback ) RX packets 1062532 bytes 164572192 (156.9 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1062532 bytes 164572192 (156.9 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@localhost ~]#
其中eth0:1 为eth0的子网卡。
先了解下eth0 和 eth0:1 的区别, eth0属于物理网卡,eth0:1属于子网卡。
物理网卡 :物理网卡指的是服务器上实际的网络接口设备,比如上面的配置中只有一个eth0网络接口。
子网卡 :子网卡在这里并不是实际上的网络接口设备,但是可以作为网络接口在系统中出现,如eth0:1、eth1:2这种网络接口。它们必须要依赖于物理网卡,虽然可以与物理网卡的网络接口同时在系统中存在并使用不同的IP地址,而且也拥有它们自己的网络接口配置文件。但是当所依赖的物理网卡不启用时(Down状态)这些子网卡也将一同不能工作。
因此从上面了解到,子网卡并不是实际的网络接口设备,依赖于对应的物理网卡。
接下来继续keepalived组HA时,主节点或者备节点配置子网卡上的ip时组HA失败问题。
当配置HA时,主或备节点使用子网卡上的ip时,启动keepalived时会出现如下错误
# cat keepalived.conf ! Configuration File for keepalived global_defs{ router_id 11.12.13.54 } vrrp_instance VI_1_t{ state BACKUP insterface eth0:1 mcast_src_cp 11.12.13.54 virtual_router_id 99 priority 20 advert_int 1 nopreempt authentication{ auth_type PASS auth_pass 1111 } virtual_ipaddress{ 11.12.13.99 } }
通过查看日志发现,主节点使用的ip为eth0上的ip,而备节点使用的ip为eth0:1上的ip,搭建HA时失败,通过查看日志,显示如下# cat /var/log/messages Keepalived_vrrp[42201]: Opening file "/opt/keepalived.conf" ... Keepalived_vrrp[42201]: Cant find interface eth0:1 for vrrp_instance VI_1_t !!! Keepalived_vrrp[42201]: Configuration error: VRRP definition must belong to an interface Keepalived_vrrp[42201]: VRRP_Instance(VI_1_t) Unknown interface ! Keepalived_vrrp[42201]: Thread task. ...
从上面的日志来看,是没有找到实例对应的eth0:1网络接口。
根据keepalived的源码进行分析了解到static void start_vrrp(void) { ... kernel_netlink_init(); ... init_data(conf_file, vrrp_init_keywords); ... if(!vrrp_complete_init()) { stop_vrrp(KEEPALIVED_EXIT_CONFIG); return; } } kernel_netlink_init() { ... init_interface_queue(); ... } void init_interface_queue() { init_if_queue(); netlink_interface_lookup(NULL); #ifdef _HAVE_VRRP_VMAC set_base_ifp(); #endif } static void init_if_queue() { if_queue = alloc_list(free_if, dump_if); }
1、keepalived启动时,在调用start_vrrp(void)时,会调用init_interface_queue(), 该函数的作用就是从内核中读取系统的网卡设备,然后把网卡信息放到if_queue的全局链表中。
if_queue链表中保存的都是实际的网卡设备信息,而eth0:1属于子网卡并不是实际的网络接口设备。因此链表中不存在eth0:1的信息。void init_data(const char *conf_file, vector_t *(*init_keywords)(void)) { ... (*init_keywords)(); ... } vector_t * vrrp_init_keywords(void) { init_global_keywords(reload); init_vrrp_keywords(true); #ifdef _WITH_LVS_ init_check_keywords(false); #endif #ifdef _WITH_BFD_ init_bfd_keywords(true); #endif return keywords; }
2、接下来start_vrrp(void)调用init_data(conf_file, vrrp_init_keywords)进行初始化。
init_data的作用就是读取keepalived.conf配置文件中的实例来初始化全局vrrp_data链表,vrrp_data中有个vrrp的链表,vrrp链表节点中保存的是vrrp_instance, 该vrrp_instance就是keepalived.conf配置文件中的关键字,然后获取配置中的信息,挂到vrrp链表节点中。
在初始化节点过程中当读到interface eth0:1时,会根据获取的名字eth0:1 从if_queue的全局链表中获取网卡接口实例信息来初始化vrrp节点中的ifp字段。由于获取不到,所以日志会打印:
Cant find interface eth0:1 for vrrp_instance VI_1_t !!!
此时ifp字段是空的。
在从配置文件读取virtual_ipaddress 初始化虚拟ip的时候(对应函数vrrp_vip_handler),它会判断ifp字段是否为空,若为空,则打印日志
Configuration error : VRRP definition must belong to an interface
bool vrrp_complete_init(void) { ... LIST_FOREACH(vrrp_data->vrrp, vrrp, e){ if(!vrrp_complete_instance(vrrp)) return false; if(vrrp->ifp->mtu > max_mtu_len) max_mtu_len = vrrp->ifp->mtu; } ... } static bool vrrp_complete_instance(vrrp_t *vrrp) { .... if(!chk_min_cfg(vrrp)) return false; ... } static bool chk_min_cfg(vrrp_t *vrrp) { ... if(!vrrp->ifp){ log_message(LOG_INFO, "(%s) Unknown interface!", vrrp->iname); return false; } }
3、接下来start_vrrp(void)调用vrrp_complete_init()进一步完成vrrp的初始化工作,同时判断一些之前的初始化值是否成功,由于第二步初始化ifp字段时该值为空,也就是找不到eth0:1的接口实例,因此会打印日志:
VRRP_Instance(VI_1_t) Unknown interface !
并返回失败,结束keepalived。
所以使用keepalived组HA使用子网卡的ip时,由于子网卡不是网络设备,导致keepalived启动时根据配置文件获取不到网卡信息,导致keepalived启动失败。
因此使用keepalived组HA使用子网卡的ip时,keepalived.conf 中的insterface 字段要设置为子网卡(eth0:1 )对应的物理网卡(eth0)。
脚本中根据子网卡ip获取物理网卡脚本如下:[ rootelocalhost ~]# ip addr l: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00: 00:00:00:00 brd 00: 00: 00:00:00:00 inet 127.0.0.1/8 scope host lo valid lft forever preferred lft forever inet6 : :1/128 scope host valid lft forever preferred lft forever 2: eth0: mtu 1500 qdisc pfifo fast state UP group default qle1000 link/ether 0c:da:41:1d:b3:f0 brd ff:ff:ff:ff:ff:ff 10 inet 101.11.12.174/23 brd 10.14.15.255 scope global eth0 valid lft forever preferred lft forever inet 101.11.12.233/23 brd 10.14.15.255 scope global secondary eth0:1 valid lft forever preferred lft forever #获取子网卡101.11.12.233 (eth0:1) 对应的物理网卡 [ rootelocalhost ~]# ip addr | grep -w 101.11.12.233 | awk "{print $NF}" | head -n 1 | cut -d ":" -f 1 #去掉冒号取第一列 eth0
家在长安(散文)九十年代初期,我随三线厂搬迁到西安南郊电子城,在那里工作生活了二十多年。起初虽无缘去长安县游玩,但常听身边朋友提起有关长安县的诸多说法离城较远,交通不便,有山有水,风景优美,但治安
82岁球王贝利病危!其子发牵手照勉励父亲,父子五官神似确系亲生贝利儿子勉励生父贝利12月份,卡塔尔世界杯完美落幕,梅西捧到了球坛的最高荣誉,而82岁的球王贝利,有幸见证了这一幕。卡塔尔世界杯结束之后,贝利的身体情况就急转几下,屡次并未。有媒体
家的絮语(散文)独身贵族的潇洒,两人世界的和谐,小三口之家的甜蜜,三代乃至四代同堂的欢乐,全家福的令人艳美,使日月趋向完满。锅碗瓢盆的交响,男欢女爱的浪漫,长幼有序的和谐,尊老爱幼的亲情,苦辣酸甜
烟台VS徐州究竟谁更胜一筹?烟台山东省地级市,2021年GDP为8711。8亿元。徐州江苏省地级市,2021年GDP为8117。4亿元。单论GDP很明显烟台更胜一筹。烟台面积大约13864。5km2人口大约7
生命,就如同天上的一颗流星就在几天前,抖音上一则不幸而惊讶的消息突然映入眼眶,经反复确认证明我没有高烧到头昏眼花,又一个人因为癌症走了作为曾经认识的人,不免有些痛惜和不解,几年不见,没想到竟然是以这种方式挥
加密货币平台FTX创办人2。5亿美元保释候审整理麦可欣(纽约综合电)加密货币交易平台FTX创办人弗里德被引渡回美国后,获准以2亿5000万美元保释在外候审,保释条件包括他得和父母同住戴上电子监控器并交出护照。他也得定期接受心
阿曼国会议员斥资100万美元买下梅西的夺冠时穿的黑袍AhmedAlBarwani提出买回在2022年世界杯加冕典礼上梅西穿的黑袍。我从阿曼苏丹国祝贺你赢得2022年世界杯。阿拉伯bisht黑袍是骑士精神和智慧的象征。我将支付给你10
胜利在望!雷军承诺的三年做到全球第一,现在已经完成一多半了是否还记得雷军曾在一次发布会上向广大网友许下承诺小米三年内要做到全球第一。当时很多人感觉雷军在痴人说梦,小米想要成为全球第一,就必须超过苹果和三星,现在过去了快两年的时间了,小米进
中超最新积分榜三镇和泰山队比着输球,争冠军?浙江队第三不稳谁是中超摆烂王者?至少在联赛第32轮,是泰山队和三镇,两支球队说句实话输的都很窝囊,硬生生让一个快没有悬念的联赛,打出了悬念。然后广州城把握机会,赢球,武汉长江也赢了大连人,看起来
老詹连续六场30难救主湖人被黄蜂蛰伤,累计更新老詹生涯数据北京时间2022年12月24日,20222023赛季NBA常规赛,湖人130134不抵黄蜂。LBJ本场比赛数据上场33分钟,砍下34分2篮板8助攻1抢断0盖帽,23投15中(三分8
三分绝杀生涯单场最高分,哈利伯顿太燃了!他兑现了最初的诺言哈利伯顿太燃了!在今天结束的NBA常规赛中,印第安纳步行者队111108战胜热火队。在比赛第四节还剩14秒结束时,热火队的泰勒希罗三分绝平。步行者暂停后,哈利伯顿轰进超远三分准绝杀