keepalived是一款c语言写的实现在linux系统上实现负载均衡和高可用的软件。它遵从于GNU是一款优秀的开源软件。
一:两个关键词的解释
1:负载均衡
keepalived内置了对ipvs函数的调用支持。可以直接在keepalived中按照语法配置ipvs然后keepalived就可以实现对ipvs的配置。
2:高可用
keepalived是以VRRP(Virtual Router Redundancy Protocol)协议为实现基础的即虚拟路由冗余协议。虚拟路由冗余协议可以认为是实现路由器高可用的协议即将N台提供相同功能的路由器组成一个路由器组这个组里面有一个master和多个backupmaster上面有一个对外提供服务的vip该路由器所在局域网内其他机器的默认路由为该vipmaster会发组播当backup收不到vrrp包时就认为master宕掉了这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
二:keepalived的组成
keepalived采用多进程的设计模式每个进程负责不同的功能我们在运行lvs的机器上看到的进程如下
[[email protected]_83_135 ~]# ps -ef|grep keep
root 27613 25973 0 16:56 pts/0 00:00:00 grep keep
root 30731 1 0 Mar17 ? 00:00:00 keepalived -D
root 30732 30731 0 Mar17 ? 00:00:45 keepalived -D
root 30733 30731 0 Mar17 ? 00:02:32 keepalived -D
core keepalived的核心程序控制全局配置的解析进程启动等工作。
vrrp Keepalived的vrrpd子进程以及相关代码。
check keepalived对后端的健康检查及对lvs相关配置的解析
如果keepalived 不运行在lvs的机器上只开vrrp即可。也可只运行healthchecker程序。具体使用命令
keepalived --vrrp -P Only run with VRRP subsystem.
keepalived --check -C Only run with Health-checker subsystem.
三:vrrp协议简介
1. 前言
VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议最新协议在RFC3768中定义原来的定义RFC2338被废除新协议相对还简化了一些功能。
2. 协议说明
2.1 协议
VRRP协议是为消除在静态缺省路由环境下的缺省路由器单点故障引起的网络失效而设计的主备模式的协议使得在发生故障而进行设备功能切换时可以不影响内外数据通信不需要再修改内部网络的网络参数。VRRP协议需要具有IP地址备份优先路由选择减少不必要的路由器间通信等功能。
VRRP协议将两台或多台路由器设备虚拟成一个设备对外提供虚拟路由器IP(一个或多个)而在路由器组内部如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER或者是通过算法选举产生MASTER实现针对虚拟路由器IP的各种网络功能如ARP请求ICMP以及数据的转发等其他设备不拥有该IP状态是BACKUP除了接收MASTER的VRRP状态通告信息外不执行对外的网络功能。当主机失效时BACKUP将接管原先MASTER的网络功能。
配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值使用VRID将路由器进行分组具有相同VRID值的路由器为同一个组VRID是一个0255的正整数同一组中的路由器通过使用优先权值来选举MASTER优先权大者为MASTER优先权也是一个0255的正整数。
VRRP协议使用多播数据来传输VRRP数据VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址VRRP运行时只有MASTER路由器定时发送VRRP通告信息表示MASTER工作正常以及虚拟路由器IP(组)BACKUP只接收VRRP数据不发送数据如果一定时间内没有接收到MASTER的通告信息各BACKUP将宣告自己成为MASTER发送通告信息重新进行MASTER选举状态。
2.2 MASTER选举
如果对外的虚拟路由器IP就是路由器本身配置的IP地址的话该路由器始终都是MASTER
否则如果不具备虚拟IP的话将进行MASTER选举各路由器都宣告自己是MASTER发送VRRP通告信息
如果收到其他机器的发来的通告信息的优先级比自己高将转回BACKUP状态
如果优先级相等的话将比较路由器的实际IPIP值较大的优先权高
不过如果对外的虚拟路由器IP就是路由器本身的IP的话该路由器始终将是MASTER这时的优先级值为255。
2.3 协议状态机
VRRP协议状态比较简单就三种状态初始化主机备份机。
+---------------+
+--------->| |<-------------+
| | Initialize | |
| +------| |----------+ |
| | +---------------+ | |
| | | |
| V V |
+---------------+ +---------------+
| |---------------------->| |
| Master | | Backup |
| |<----------------------| |
+---------------+ +---------------+
初始化:
路由器启动时如果路由器的优先级是255(最高优先级路由器拥有路由器地址)要发送VRRP通告信息并发送广播ARP信息通告路由器IP地址对应的MAC地址为路由虚拟MAC设置通告信息定时器准备定时发送VRRP通告信息转为MASTER状态
否则进入BACKUP状态设置定时器检查定时检查是否收到MASTER的通告信息。
主机:
主机状态下的路由器要完成如下功能
设置定时通告定时器
用VRRP虚拟MAC地址响应路由器IP地址的ARP请求
转发目的MAC是VRRP虚拟MAC的数据包
如果是虚拟路由器IP的拥有者将接受目的地址是虚拟路由器IP的数据包否则丢弃
当收到shutdown的事件时删除定时通告定时器发送优先权级为0的通告包转初始化状态
如果定时通告定时器超时时发送VRRP通告信息
收到VRRP通告信息时如果优先权为0发送VRRP通告信息否则判断数据的优先级是否高于本机或相等而且实际IP地址大于本地实际IP设置定时通告定时器复位主机超时定时器转BACKUP状态否则的话丢弃该通告包
备机:
备机状态下的路由器要实现以下功能
设置主机超时定时器
不能响应针对虚拟路由器IP的ARP请求信息
丢弃所有目的MAC地址是虚拟路由器MAC地址的数据包
不接受目的是虚拟路由器IP的所有数据包
当收到shutdown的事件时删除主机超时定时器转初始化状态
主机超时定时器超时的时候发送VRRP通告信息广播ARP地址信息转MASTER状态
收到VRRP通告信息时如果优先权为0表示进入MASTER选举否则判断数据的优先级是否高于本机如果高的话承认MASTER有效复位主机超时定时器否则的话丢弃该通告包
2.4 ARP查询处理
当内部主机通过ARP查询虚拟路由器IP地址对应的MAC地址时MASTER路由器回复的MAC地址为虚拟的VRRP的MAC地址而不是实际网卡的MAC地址这样在路由器切换时让内网机器觉察不到而在路由器重新启动时不能主动发送本机网卡的实际MAC地址。如果虚拟路由器开启的ARP代理(proxy_arp)功能代理的ARP回应也回应VRRP虚拟MAC地址
2.5 VRRP应用举例
+-----------+ +-----------+
| Rtr1 | | Rtr2 |
|(MR VRID=1)| |(BR VRID=1)|
|(BR VRID=2)| |(MR VRID=2)|
VRID=1 +-----------+ +-----------+ VRID=2
IP A ---------->* *<---------- IP B
| |
| |
------------------+------------+-----+--------+--------+--------+--
^ ^ ^ ^
| | | |
(IP A) (IP A) (IP B) (IP B)
| | | |
+--+--+ +--+--+ +--+--+ +--+--+
| H1 | | H2 | | H3 | | H4 |
+-----+ +-----+ +--+--+ +--+--+
Legend:
---+---+---+-- = Ethernet, Token Ring, or FDDI
H = Host computer
MR = Master Router
BR = Backup Router
* = IP Address
(IP) = default router for hosts
这是通常VRRP使用拓扑两台路由器运行VRRP互为备份路由器1作为VRID组1的MASTERIP地址AVRID组2的BACKUP路由器2作为VRID组2的MASTERIP地址BVRID组1的BACKUP内部网络中一部分机器的缺省网关地址是IP地址A一部分是IP地址B正常情况下以A为网关的数据将走路由器1以B为网关的数据将走路由器2如果一台路由器发生故障所有数据将走另一台路由器。
3. 协议定义
3.1 以太头
源MAC地址必须为虚拟MAC地址00-00-5E-00-01-{VRID}VRID为虚拟路由器ID值16进制格式所以同一网段中最多有255个VRRP路由器目的MAC为多播类型的MAC。
这里可以看出VRID非常重要
3.2 IP头参数
VRRP包的源地址是本机地址目的地址必须为224.0.0.18为一多播地址IP协议号为112IP包的TTL值必须为255。
3.3 VRRP协议数据格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Type | Virtual Rtr ID| Priority | Count IP Addrs|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Auth Type | Adver Int | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP Address (1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| . |
| . |
| . |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP Address (n) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication Data (1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication Data (2) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中
version版本4位在RFC3768中定义为2
Type类型4位目前只定义一种类类型通告数据取值为1
Virtual Rtr ID虚拟路由器ID8位
Priority优先级8位具备冗余IP地址的设备的优先级为255
Count IP AddrsVRRP包中的IP地址数量8位
Auth Type认证类型8位RFC3768中认证功能已经取消此字段值定义0(不认证)为12只作为对老版本的兼容
Adver Int通告包的发送间隔时间8位单位是秒缺省是1秒
Checksum校验和16位校验数据范围只是VRRP数据即从VRRP的版本字段开始的数据不包括IP头
IP Address(es)和虚拟路由器相关的IP地址数量由Count IP Addrs决定
Authentication DataRFC3768中定义该字段只是为了和老版本兼容必须置0。
3.4 接收数据时的必须检查
收到VRRP数据包时要进行以下验证不满足的数据包将被丢弃
- TTL必须为255
- VRRP版本号必须为2
- 一个包中数据字段必须完整
- 校验和必须正确
- 必须验证在接收的网卡上配置了VRID值而且本地路由器不是路由IP地址的拥有者
- 必须验证VVRP认证类型和配置的一致
4. 结论
VRRP实现了对路由器IP地址的冗余功能防止了单点故障造成的网络失效VRRP本身是热备形式的但可以通过互相热备实现路由器的均衡处理新版的VRRP较老版简化了认证处理实际不再进行数据的认证这是因为在实际应用中经常出现认证成为造成多个MASTER同时使用的异常情况。