Keepalived是一个开源的、基于VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)的软件,它主要用于解决网络服务的单点故障问题,提供高可用性和负载均衡功能,实现高可用性和故障自动切换功能,确保服务的持续性和稳定性。其灵活的配置和易于管理的特点也使得它成为构建高可用性架构的重要组件之一。以下是Keepalived的特点:
1. 检测服务器状态
实时监控:Keepalived能够实时监控服务器集群中各个节点的状态,包括网络层(IP地址是否激活)、传输层(TCP端口状态)和应用层(服务运行状态)等多个层面。
多层次检查:通过ICMP请求、TCP端口扫描、HTTP请求等多种方式,Keepalived能够全面检测服务器的健康状态。
2. 故障隔离与恢复
故障检测:一旦检测到某个节点出现故障,Keepalived会立即报告该故障,并将其从服务器集群中剔除,防止故障扩散。
自动恢复:当故障节点恢复正常后,Keepalived能够自动将其重新加入集群,确保服务的连续性和可扩展性。
3. 高可用性保障
VRRP协议实现:Keepalived基于VRRP协议实现高可用性的核心功能。VRRP协议允许在路由器或服务器之间建立备份关系,确保在主设备故障时能够迅速切换到备份设备。
虚拟IP管理:Keepalived能够配置和管理虚拟IP地址(VIP),通过VRRP协议实现VIP在MASTER和BACKUP节点之间的共享和故障切换。这确保了用户访问的连续性,即使在主服务器故障时,用户也能通过VIP访问到服务。
4. 负载均衡支持
集成LVS:虽然Keepalived本身并不直接提供负载均衡功能,但它可以与LVS(Linux Virtual Server)等负载均衡器集成,实现四层的负载均衡。通过配置Keepalived,可以将请求分发到不同的服务器上,提高系统的整体性能和可用性。
5. 灵活配置与易于管理
配置文件:Keepalived的配置文件简单易懂,支持多种配置选项和参数设置。用户可以根据自己的需求进行灵活的配置和调整,以满足不同的应用场景和性能要求。
自动化管理:由于Keepalived能够自动完成故障检测、隔离和恢复等操作,因此大大减轻了管理员的工作负担。管理员只需关注故障节点的修复和集群的扩展等工作即可。
LVS负载均衡
高性能:LVS工作在内核空间,通过IPVS(IP Virtual Server)实现高效的报文转发,支持高并发处理能力。
低资源消耗:LVS本身不产生流量,只是转发请求,因此对系统资源的消耗较低。
配置复杂:相对于其他负载均衡软件,LVS的配置较为复杂,需要一定的网络知识和Linux系统操作经验。
多种工作模式:LVS支持NAT(网络地址转换)、TUN(IP隧道)、DR(直接路由)等多种工作模式,以适应不同的网络环境需求。
HAProxy负载均衡
高可用性:HAProxy支持多种健康检查机制,能够及时发现并隔离故障服务器,确保服务的高可用性。
丰富的功能:除了基本的负载均衡功能外,HAProxy还支持SSL终止、会话保持、URL重写等多种高级功能。
灵活的调度算法:HAProxy支持多种调度算法,如轮询(Round Robin)、最少连接(Least Connections)等,可以根据实际需求灵活配置。
易于配置和管理:HAProxy的配置文件相对简单易懂,支持热重载功能,可以在不中断服务的情况下更新配置。
LVS和HAProxy的组合使用
根据以上LVS和HAProxy的特点我们可以有以下的组合方式,这种组合方式可以充分发挥LVS和HAProxy各自的优势:LVS负责处理大量的并发请求,提供高性能的转发能力;HAProxy则负责提供灵活的负载均衡策略和丰富的功能支持。通过两者的结合使用,可以构建出既高效又灵活的负载均衡系统,满足大规模、高并发的业务需求。
前端使用LVS:由于LVS的高性能和低资源消耗特点,可以将其部署在前端作为流量入口,负责将大量的客户端请求分发到后端的HAProxy服务器。
后端使用HAProxy:HAProxy服务器作为后端处理节点,负责进一步的负载均衡和流量管理。HAProxy可以根据应用层数据(如URL、请求头等)进行复杂的负载均衡决策,并提供更丰富的功能支持。
实现高可用性
在实现高可用性的系统中,active/passive
(主/备)和active/active
(双主)是两种常见的架构模式,它们通过不同的方式来提高系统的可靠性和容错能力。同时,VRRP(虚拟路由冗余协议)和HEARTBEAT(心跳机制)是实现这些架构模式的关键技术。
1. Active/Passive(主/备)模式
在active/passive
模式中,系统由一台主服务器(active)和一台或多台备用服务器(passive)组成。主服务器负责处理所有业务和数据,而备用服务器则处于待机状态,不处理任何业务。当主服务器发生故障时,备用服务器会接管主服务器的业务和数据,确保服务的连续性。
VRRP与HEARTBEAT的应用:
VRRP协议:用于在逻辑上创建一个虚拟路由器,该虚拟路由器由主路由器和备用路由器组成。主路由器负责转发数据包,而备用路由器则处于备份状态。当主路由器故障时,VRRP会触发备用路由器接管虚拟路由器的IP地址,从而成为新的主路由器。
HEARTBEAT机制:主服务器和备用服务器之间通过发送心跳信号来监测对方的存活状态。如果主服务器停止发送心跳信号,备用服务器将认为主服务器已故障,并启动接管过程。在这个场景中,虽然提到了使用VRRP协议进行通告,但HEARTBEAT通常是一个更广泛的概念,可以包括VRRP在内的多种心跳检测机制。
工作方式:
抢占式:当备用服务器检测到主服务器故障并接管服务后,如果主服务器恢复并重新加入网络,它将尝试重新成为主服务器(如果其优先级高于当前的主服务器)。
非抢占式:备用服务器接管服务后,即使主服务器恢复,也不会立即尝试重新成为主服务器,而是保持当前状态,直到管理员手动干预或满足其他特定条件。
2. Active/Active(双主)模式
在active/active
模式中,两台服务器都同时处于活动状态,各自处理不同的业务或数据。这种模式可以更有效地利用服务器资源,并减少因单点故障而导致的服务中断。
VRRP与HEARTBEAT的应用:
在active/active
模式下,可以配置多个虚拟路由器(VRRP组),每个虚拟路由器由不同的主服务器和备用服务器组成。每个虚拟路由器处理不同的业务或数据,从而实现业务的分离和负载均衡。
HEARTBEAT机制同样用于监测服务器的存活状态,并在需要时触发故障转移。
安全认证:
无认证:在简单的网络环境中,可能不需要对VRRP消息进行认证。然而,这种做法存在安全风险,因为未经授权的设备可能能够加入VRRP组并影响网络的稳定性。
简单字符认证:使用预共享密钥进行认证,确保只有知道密钥的设备才能参与VRRP过程。这种方法简单易行,但安全性相对较低。
MD5认证:提供更高级别的安全性,通过对VRRP消息进行加密和认证来防止篡改和伪造
VRRP
VRRP(Virtual Router Redundancy Protocol),即虚拟路由器冗余协议,是一种由IETF提出的网络容错协议,旨在解决局域网中配置静态网关出现的单点失效问题。该协议于1998年推出,并制定了正式的RFC2338协议标准。
定义:VRRP是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的VRRP路由器中的一台。控制虚拟路由器IP地址的VRRP路由器称为主路由器,它负责转发数据包到这些虚拟IP地址。
应用:VRRP广泛应用在边缘网络中,设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,并在实际第一跳路由器使用失败的情形下仍能够维护路由器间的连通性
VRRP的组成与角色:
VRRP路由器:运行VRRP协议的路由器,是物理实体。
虚拟路由器:VRRP协议创建的逻辑概念,具有唯一固定的IP地址和MAC地址。
主控路由器(Master):负责ARP解析和转发IP数据包,是VRRP组中的活动路由器。 备份路由器(Backup):处于待命状态,当主控路由器故障时接替其工作。
用户空间核心组件
vrrp stack:VIP消息通告,用来管理虚拟IP。
checkers:监测后端真实服务器的服务是否存活。
system call:实现VRRP协议状态转换时调用脚本的功能。
SMTP:邮件组件,用于发送报警邮件。
IPVS wrapper:生成IPVS规则,直接生成ipvsadm。
Netlink Reflector:网络接口,将虚拟地址IP地址飘动。
WatchDog:监控进程,确保整个架构的稳定性。
控制组件:提供keepalived.conf的解析器,完成Keepalived配置。
Keepalived实验环境
环境 | 主机 | IP |
rhel7.9 | R1 | 172.25.254.110/24 |
rhel7.9 | R2 | 172.25.254.120/24 |
rhel7.9 | KA1 | 172.25.254.10/24 |
rhel7.9 | KA2 | 172.25.254.20/24 |
VIP:172.25.254.100/24
配置IP地址
[root@R1 ~]# vmset.sh eth0 172.25.254.110 R1.ma.org
[root@R2 ~]# vmset.sh eth0 172.25.254.120 R2.ma.org
[root@KA1 ~]# vmset.sh eth0 172.25.254.10 KA1.ma.org
[root@KA2 ~]# vmset.sh eth0 172.25.254.20 KA2.ma.org
在四台主机上检查SELinux状态,防火墙状态,
[root@R1 ~]# getenforce
Disabled[root@R1 ~]# systemctl status firewalld.service
● firewalld.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)[root@R2 ~]# getenforce
Disabled
[root@R2 ~]# systemctl status firewalld.service
● firewalld.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)[root@KA1 ~]# getenforce
Disabled
[root@KA1 ~]# systemctl status firewalld.service
● firewalld.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)[root@KA2 ~]# getenforce
Disabled
[root@KA2 ~]# systemctl status firewalld.service
● firewalld.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)
在R1,R2上下载httpd并测试:
[root@R1 ~]# yum install httpd -y
[root@R1 ~]# echo 172.25.254.110 > /var/www/html/index.html
[root@R1 ~]# systemctl enable --now httpd.service
[root@R2 ~]# yum install httpd -y
[root@R2 ~]# echo 172.25.254.120 > /var/www/html/index.html
[root@R2 ~]# systemctl enable --now httpd.service
测试:
Keepalived-虚拟路由的配置
在KA1、KA2上安装keepalived
[root@KA1 ~]# yum install keepalived -y
[root@KA2 ~]# yum install keepalived -y
打开配置文件:
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
#全局定义
global_defs {
notification_email {
2225187031@qq.com
}
notification_email_from keepalived@ma.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA1.ma.org
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}
配置虚拟网卡
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
启动服务:
[root@KA1 ~]# systemctl enable --now keepalived.service
[root@KA1 ~]# ifconfig
通过抓包命令查看:
[root@KA1 ~]# tcpdump -i eth0 -nn host 224.0.0.18
KA2同KA1一样
[root@KA1 ~]# scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf
KA2的小修改:
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
启动服务:
[root@KA2 ~]# systemctl enable --now keepalived.service
[root@KA2 ~]# ifconfig
在R1上登陆KA1,关闭keepalived服务
[root@R1 ~]# ssh -l root 172.25.254.10
[root@KA1 ~]# systemctl stop keepalived.service
KA2这时候就会有VIP了
[root@KA2 ~]# ifconfig
eth0:1
然后再重新启动KA1的keepalived服务
[root@KA1 ~]# systemctl start keepalived.service
KA2就无VIP了
Keepalived-非抢占模式和延迟抢占
keepalived服务器state配置为BACKUP
[root@KA1 ~]# vim /etc/keepalived/keepalived.con
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
[root@KA1 ~]# systemctl restart keepalived.service
这时候的VIP在KA2上;
[root@KA2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 80
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}[root@KA2 ~]# systemctl restart keepalived.service
等ka1启动服务后,给KA2停止服务
[root@KA2 ~]# systemctl stop keepalived.service
[root@KA2 ~]# ifconfig
无VIP
此时VIP在ka1 上, 重新启动KA2
[root@KA2 ~]# systemctl restart keepalived.service
[root@KA2 ~]# ifconfig
还是无VIP
Keepalived邮件配置
先下载mailx
root@KA1 ~]# yum install mailx -y
[root@KA1 ~]# echo hello | mail -s test 2225187031@qq.com
[root@KA1 ~]# mail
在qq邮箱的安全设置里获取授权码
进入mail.rc文件
[root@KA1 ~]# vim /etc/mail.rc
在最后写入这几行
[root@KA1 ~]# echo hello | mail -s test 2225187031@qq.com
KA2也是一样
[root@KA1 ~]# vim /etc/keepalived/mail.sh
[root@KA1 ~]# chmod +x /etc/keepalived/mail.sh
配置主配置文件
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
[root@KA1 ~]# /etc/keepalived/mail.sh fault
Keepalived双主配置
master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。
在KA1配置文件里写
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
在KA2配置文件里写
[root@KA2 ~]# vim /etc/keepalived/keepalived.conf
[root@KA1 ~]# systemctl enable --now keepalived.service
[root@KA1 ~]# ifconfig
KA1有100就是配置成功
[root@KA2 ~]# systemctl enable --now keepalived.service
[root@KA2 ~]# ifconfig
KA2有200就是配置成功