【一文读懂keepalive的工作原理】keepalive是基于vrrp协议实现接入层高可用组件,避免系统的单点故障 。工作原理要想理解keepalive的原理,就需要理解vrrp协议的工作原理 。
概念解释:网络架构如下图:
Vrrp(Virtual Router Redundancy Protocol),虚拟路由冗余协议,一种为了避免路由器单点故障的容错协议 。
文章插图
?
工作原理
- 多个路由器组成一个路由器组,即虚拟路由器 。如图RouterA和RouterB组成一个虚拟路由器 。
- 虚拟路由器使用虚拟IP与外网交互(如图中VIP),虚拟mac与内网交互(如图中VMAC)
- 获得VIP的路由器为主路由器(Master状态),其他路由器为备份路由器(Backup状态);
- 主路由器每隔 advertisement_intervl 秒(对应图中配置项 advert_int),向组内其他路由器发送通告消息(即心跳),告知本路由器的优先级等信息;
- 组播的方式发送,组播地址224.0.0.18 。
- 只有主路由器会响应ARP请求,组内其他路由器会丢弃ARP请求;
- 只有主路由器会响应对虚拟IP请求,组内其他路由器会丢弃对虚拟IP的请求;
Master路由器退出该路由器组
- Master路由器在vrrp消息中将本路由器的优先级设置为0,表示原Master设备声明不参与该VRRP组了;
- Backup路由器接收到这个消息后,会等待 skew_time(偏移时间,= (256-backup_priority)/256),切换为Master状态
- Master路由器在vrrp消息中将本路由器的优先级降低,小于Backup路由器优先级(但不为0);
- 这时Backup路由器会丢弃该消息;如果是抢占模式,会立即切换为Master状态;如果是非抢占模式,仍保持Backup状态;
- Backup路由器在超过一定时间(Master_down_interval=3*advert_int + skew_time)未收到Master的vrrp消息时,会切换为Master;
解决方案:
- 核查A和B之间的网络,关闭防火墙或者配置好ip,Router之间保证网络通畅
- 使用2条线路连接2个路由器,一条坏了时,另一条备用
- 主节点编写脚本测试网络情况;如果网络不通,则关闭keepalived进程;
- Master路由器宕机后,立即告警,人为介入处理 。
文章插图
vrrp协议栈
文章插图
上述标红的几个字段是关键字段,都会出现在 keepalive 的配置文件中 。
- Version:VRRP协议版本号,RFC3768定义了版本2.
- Type:该字段指明了VRRP报文的类型,RFC3768只定义了一种VRRP报文,那就是
- VRRP通告报文,所以该字段总是置为1,若收到的VRRP通告报文拥有非1的类型
- 值,那么会被丢弃 。
- Virtual Rtr ID:也就是我们上面介绍过的VRID,一个VRID唯一地标识了一个虚拟
- 路由器,取值范围是[1,255],所以一台路由器的接口可以同时运行最多255个VRRP
- 实例,此字段没有缺省值,必须人为设定 。
- Priority:
- 优先级,在一个虚拟路由器中用来选取Master路由器和Backup路由器,值越大表明优先级越高,此字段共有8个bit,取值范围[1,254],若没有人为指定,缺省值是100 。
- 其中,VRRP协议会将IP地址拥有者路由器的该字段永远设置为255,若人为指定为其它值,也不会影响VRRP协议的默认行为,即IP地址拥有者路由器的该字段总是255 。
- 另外,此字段设置为0会出现在下面这种情形中,当Master路由器出现故障后,它会立刻发送一个Priority置0的VRRP通告报文,当Backup路由器收到此通告报文后,会等待Skew time时间,然后将自己切换为Master路由器,其中Skew time=(256-Backup路由器的优先级)/256,单位为秒,例如若Backup路由器的优先级为100,那么Skew time=156/256=0.609秒,对于主路由器来说,Skew time并没有实际意义,虽然cisco的路由器也会计算并显示出来 。
推荐阅读
- 古树红茶革登,普洱茶原产地革登
- 岚图|零百5.8秒MPV行业第一!一图读懂岚图“岚海动力”
- 孙一文的励志故事200字?孙一历史故事
- 一文带你了解 「图数据库」Nebula 的存储设计和思考
- iQOO|2000元价位不二之选!iQOO Neo6 SE马上发:一文了解新品亮点
- 机械硬盘|蓝盘紫盘黑盘都是啥意思?一文看懂
- 一文讲清楚SpringBoot六种读取配置方式
- 带你轻松读懂物理层与数据通信系统
- 一文读懂Linux网络命名空间
- 一文了解在 Python 中如何使用列表推导