一文读懂keepalive的工作原理
keepalive是基于vrrp协议实现接入层高可用组件,避免系统的单点故障。
工作原理
1、vrrp协议的工作原理
要想理解keepalive的原理,就需要理解vrrp协议的工作原理。
概念解释:
Vrrp(Virtual Router Redundancy Protocol),虚拟路由冗余协议,一种为了避免路由器单点故障的容错协议。
网络架构如下图:
多个路由器组成一个路由器组,即虚拟路由器。如图RouterA和RouterB组成一个虚拟路由器。
虚拟路由器使用虚拟IP与外网交互(如图中VIP),虚拟MAC与内网交互(如图中VMAC)
获得VIP的路由器为主路由器(Master状态),其他路由器为备份路由器(Backup状态);
主路由器每隔 advertisement_intervl 秒(对应图中配置项 advert_int),向组内其他路由器发送通告消息(即心跳),告知本路由器的优先级等信息;
只有主路由器会响应ARP请求,组内其他路由器会丢弃ARP请求;
只有主路由器会响应对虚拟IP请求,组内其他路由器会丢弃对虚拟IP的请求;
2、主备切换
虚拟路由器中的Master可以切换(即VIP切换到备份路由器上),切换方式分为3种:
Master路由器退出该路由器组:
Master路由器在vrrp消息中将本路由器的优先级设置为0,表示原Master设备声明不参与该VRRP组了;
Backup路由器接收到这个消息后,会等待 skew_time(偏移时间,= (256-backup_priority)/256),切换为Master状态
Master路由器降低自身优先级:
Master路由器在vrrp消息中将本路由器的优先级降低,小于Backup路由器优先级(但不为0);
这时Backup路由器会丢弃该消息;如果是抢占模式,会立即切换为Master状态;如果是非抢占模式,仍保持Backup状态;
Backup超时未收到vrrp消息:
Backup路由器在超过一定时间(Master_down_interval=3*advert_int + skew_time)未收到Master的vrrp消息时,会切换为Master;
3、常见问题
当 Router A 和 Router B 无法正常通信时, 可能存在2个Master路由器,即“脑裂”。
解决方案:
核查A和B之间的网络,关闭防火墙或者配置好ip,Router之间保证网络通畅
使用2条线路连接2个路由器,一条坏了时,另一条备用
主节点编写脚本测试网络情况;如果网络不通,则关闭keepalived进程;
Master路由器宕机后,立即告警,人为介入处理。
扩展知识
1、VRRP协议栈
Name | Description |
---|---|
Version |
版本号 |
Type |
类型,默认为0 |
Virtual Rtr ID |
虚拟路由标识, 必须手动配置 |
Priority |
本路由器优先级 |
Count IP Addrs |
虚拟IP个数 |
Advert Int |
通告时间间隔, 默认1秒 |
IP Address N |
上述标红的几个字段是关键字段,都会出现在 keepalive 的配置文件中。
Version:VRRP协议版本号,RFC3768定义了版本2.
Type:该字段指明了VRRP报文的类型,RFC3768只定义了一种VRRP报文,那就是VRRP通告报文,所以该字段总是置为1,若收到的VRRP通告报文拥有非1的类型值,那么会被丢弃。
Virtual Rtr ID:也就是我们上面介绍过的VRID,一个VRID唯一地标识了一个虚拟路由器,取值范围是[1,255],所以一台路由器的接口可以同时运行最多255个VRRP实例,此字段没有缺省值,必须人为设定。
Auth Type:认证类型字段,是一个8位的无符号整数,一个虚拟路由器只能使用一种认证类型,如果Backup路由器收到的通告报文中认证类型字段是未知的或和本地配置的不匹配,那么它将丢弃该数据包。目前支持3种认证方式:无认证,简单字符,和MD5认证。
Adver Int:此字段规定了Mater路由器向外发送VRRP通告报文的时间间隔,以秒为单位,取值范围是[1,255],若没有人工配置,缺省为1秒。
Checksum:整个VRRP报文的校验和,计算过程中,将Checksum字段置为0,计算完成后将结果填入此字段。若希望进一步了解Checksum的计算,可以查看RFC1071(CKSM)。
Authentication Data:RFC3768中规定,此字段只是为了向RFC2338兼容,在实际的封装时,全置为0.,接收方也会忽略此字段。
2、虚拟MAC地址
组成方式是00-00-5E-00-01-{VRID},前三个字节00-00-5E是IANA组织分配的,接下来的两个字节00-01是为VRRP协议指定的,最后的VRID是虚拟路由器标识,取值范围[1,255]
3、VRID
虚拟路由器标识,在同一个VRRP组内的路由器必须有相同的VRID
4、其他
Keepalive内置了一个模块,可以通过配置文件操作内核,向ipvs添加规则,创建LVS。这又是另一个关键组件,就不在本节讨论了。
5、keepalived进程
keepalived启动时有3个进程:
主进程,监控其他子进程
vrrp子进程,负责vrrp通信
checker子进程,检测服务状态;如果服务不可用,则通知vrrp子进程,发降级通告
写在最后
对于常用组件,我们不但需要知道如何用,更要知道它的底层原理,在遇到问题是可以事半功倍。希望通过本文可以让大家对keepalive有更深入的了解。