Keepalived 是Linux下一个轻量级别的高可用解决方案,通过虚拟路由冗余协议来实现服务或者网络的高可用。 Keepalived 主要有两种应用场景:一是通过keepalived结合IPVS做到负载均衡(LVS+Keepalived),二是通过自身健康检查、资源接管功能做高可用(双机热备),实现故障转移。
一、组成架构
Keepalived使用了4个Linux内核组件:
1. LVS框架:使用getsockopt和setsockopt调用来获取和设置套接字上的选项
2. Netfilter框架:支持NAT和Masquerading的IPVS代码
3. Netlink接口:在网络接口上设置和删除VRRP虚拟IP
4. 组播:VRRP通告发送到保留的VRRP组播组(224.0.0.18)
为了确保健壮性和稳定性,守护进程被切分为3个不同进程:
一个极简的父进程,负责fork和监控子进程
两个子进程,一个负责VRRP框架,另一个负责健康检查
二、Keepalived 原理
1、主要作用
keepalived 采用 VRRP(virtual router redundancy protocol),虚拟路由冗余协议,以软件的形式实现服务器热备功能。通常情况下是将两台linux服务器组成一个热备组(master-backup),同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),这个VIP只存在master上并对外提供服务。如果keepalived检测到master宕机或服务故障,备服务器(backup)会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。
2、工作原理
- Layer3:工作在三层时,keepalived 会定期向热备组中的服务器发送一个ICMP数据包,来判断某台服务器是否故障,如果故障则将这台服务器从热备组移除。
- Layer4:工作在四层时,keepalived 以TCP端口的状态判断服务器是否故障,如果故障则将这台服务器从热备组移除。
- Layer7:工作在七层时,keepalived 根据用户设定的策略判断服务器上的程序是否正常运行,如果故障则将这台服务器从热备组移除。
3、VRRP 协议
在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)来完成的。而主机之间的路由器一旦出现故障,就会通信失败。因此在这种通信模式下,路由器就会有单点瓶颈问题,为了解决这个问题,引入了VRRP 协议(虚拟路由冗余协议)。
通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信
VRRP可以将两台或多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,而在虚拟路由器内部是多个物理路由器协同工作,VRRP角色如下:
- 虚拟路由器:VRRP组中所有的路由器,拥有虚拟的IP+MAC(00-00-5e-00-01-VRID)地址
- 主路由器(master):虚拟路由器内部通常只有一台物理路由器对外提供服务,主路由器是由选举算法产生,对外提供各种网络功能
- 备路由器(backup):VRRP组中除主路由器之外的所有路由器,不对外提供任何服务,只接受主路由的通告,当主路由器挂掉之后,重新进行选举算法接替master路由器
master路由器由选举算法产生,它拥有对外服务的VIP,提供各种网络服务,如ARP请求、数据转发、ICMP等等,而backup路由器不拥有VIP,也不对外提供网络服务
当master发生故障时,backup将重新进行选举,产生一个新的master继续对外提供服务
VRRP有三种工作状态,分别是:
- Initialize状
- Master状态
- Backup状态
选举机制:
- 优先级
- 抢占模式下,一旦有优先级高的路由器加入,立即成为Master
- 非抢占模式下,只要Master不挂掉,优先级高的路由器只能等待
三、配置文件
[全局定义块]
global_defs {
notification_email {
devops@gmail.com -- 指定keepalived在发生切换时需要发送email的对象,一行一个
}
notification_email_from root@localhost -- 指定发件人
smtp_server 127.0.0.1 -- 指定SMTP服务器地址
smtp_connection_timeout 5 -- 指定SMTP服务器连接超时时间
router_id lvs -- 运行keepalived机器的唯一标识
}
[监控nginx进程]
vrrp_script chk_nginx {
script "/data/scripts/nginx.sh" -- 监控服务脚本
interval 2 -- 检测时间间隔
weight 2 -- 权重
}
[VRRP实例定义块]
vrrp_sync_group VG_1 {
group { -- 监控多个网段的实例
VI_1
VI_2
}
notify_master "/data/scripts/nginx_master.sh" -- 指定当切换到master时,执行的脚本
notify_backup "/data/scripts/nginx_backup.sh" -- 指定当切换到backup时,执行的脚本
notify "/data/scripts/nginx.sh" -- 指定默认执行的脚本
smtp_alert -- 使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
vrrp_instance VI_1 {
state BACKUP -- 设置主机状态
interface eth0 -- 对外提供服务的网络接口
nopreemt -- 设置为不抢占
lvs_sync_daemon_interface eth0 -- 负载均衡器之间的监控接口
track_interface {
eth0 -- 设置额外的监控,网卡出现问题时切换
eth1
}
virtual_router_id 100 -- VRID 标记,同组的节点该id值必须相同,根据优先级选出master
priority 100 -- 优先级,高优先级竞选为master
advert_int 3 -- 检查间隔,VRRP 心跳包的发送周期
debug -- 日志级别
authentication { -- 设置认证
auth_type PASS -- 认证方式
auth_pass 1111 -- 认证密码
}
track_script {
chk_nginx -- 脚本监控
}
virtual_ipaddress {
192.168.111.222 -- 设置vip地址
}
注意:使用脚本监控进程后,不需要再设置虚拟服务器模块。上述配置文件仅供参考,实际生产实践中请根据自身需求以及keepalived版本进行设置 名词释义: 虚拟路由器:由一个Master路由器和多个Backup路由器组成。主机将虚拟路由器当作默认网关 VRID:虚拟路由器的标识。有相同VRID的一组路由器构成一个虚拟路由器 Master路由器:虚拟路由器中承担报文转发任务的路由器 Backup路由器:Master路由器出现故障时,能够代替Master路由器工作的路由器 虚拟IP地址:虚拟路由器的IP 地址。一个虚拟路由器可以拥有一个或多个IP地址 虚拟MAC地址: 一个虚拟路由器拥有一个虚拟MAC地址。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址 优先级:VRRP根据优先级来确定虚拟路由器中每台路由器的地位 非抢占模式:如果Backup路由器工作在非抢占模式下,则只要Master路由器没有出现故障,Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器 抢占模式:如果Backup路由器工作在抢占模式下,当它收到VRRP报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的Master路由器的优先级高,就会主动抢占成为Master路由器;否则,将保持Backup状态
- keepalived 中文文档
- keepalived 官网