前言
环境:centos 7.9
keepalived-2.2.7
什么是keepalived
市面上一般有两款高可用开源方案:Keepalived
和Heartbeat
,
keepalived
的官网:https://www.keepalived.org/
Keepalived:Keepalived
的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived
将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived
自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
heartbeat:Heartbeat
是一个基于Linux开源的高可用集群系统。主要包括心跳服务和资源接管两个高可用集群组件。心跳监测服务可以通过网络链路和串口进行,而且支持冗余链路, 它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。
keepalived高可用故障切换转移原理
Keepalived
高可用服务对之间的故障切换转移,是通过 VRRP
(Virtual Router Redundancy Protocol
, 虚拟路由器冗余协议)来切换的;
在 Keepalived
服务正常工作时,主 Master 节点会不断地向备节点发送(默认多播的方式)心跳消息,用以告诉备 Backup 节点自己还活着,当主 Master 节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master 节点的心跳了,于是调用自身的接管程序,接管主 Master 节点的 IP 资源及服务,而当主 Master 节点恢复时,备 Backup 节点又会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的备用角色。
VRRP(Virtual Router Redundancy Protocol , 虚拟路由器冗余协议)协议
VRRP
,全称 Virtual Router Redundancy Protocol
,中文名为虚拟路由器冗余协议
,VRRP
的出现就是为了解决静态路由的单点故障问题,VRRP
是通过一种竞选机制来将路由的任务交给某台 VRRP 路由器的。
VRRP
早期是用来解决交换机、路由器等设备单点故障的,下面是交换机、路由的 Master
和 Backup
切换原理描述,同样适用于 Keepalived
的工作原理。
在一组 VRRP
路由器集群中,有多台路由 VRRP
路由器,但是这么多台物理的机器并不是同时工作的,而是由一台称为 Master
机器负责路由工作,其他的机器都是 Backup
。 Master
角色并非一成不变的,VRRP
会让每个 VRRP
路由参与竞选,最终获胜的就是 Master
。获胜的 Master
有一些特权,比如拥有虚拟路由器的 IP 地址等,拥有系统资源的 Master
负责转发给网关地址的包和响应 ARP
请求。
VRRP
通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过 IP 多播(Multicast
)包(默认的多播地址 224.0.0.18
)形式发送的。虚拟路由器由 VRID
(范围 0-255
)和一组 IP 地址组成,对外表现为一个周知的 MAC 地址:00-00-5E-00-10-{VRID}
。所以,在一个虚拟路由器中,不管谁是 Master
,对外都是相同的 MAC
和 IP
(称之为 VIP
)。客户端主机并不需要因 Master
的改变而修改自己的路由设置。对它们来说,这种切换是透明的。
在一组虚拟路由器中,只有作为 Master
的 VRRP
路由器会一直发送 VRRP
广播包(VRRP Advertisement messages
),此时 Backup
不会抢占 Master
。当 Master
不可用时,Backup
就收不到来自 Master
的广播包了,此时多台 Backup
中优先级别最高的路由器会抢占为 Master
。这种抢占是非常快速的(可能只有1秒甚至更少),以保证服务的连续性。出于安全性考虑,VRRP
数据包使用了加密协议进行了加密。
keepalive原理 面试技巧
如果你在面试的时候,面试官问你keepalive
原理,建议如下这样回答:
keepalive
是通过VRRP
协议进行通信的,所以我从vrrp
开始给您讲起:
1)VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2)VRRP 是通过一种竞选协议机制来将路由任务交给某台 VRRP 路由器的。
3)VRRP 用 IP 多播的方式(默认多播地址(224.0.0.18 ))实现高可用对之间通信。
4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般 Keepalived 系统运维工作中都是一对。
5)VRRP 使用了加密协议加密数据,但 Keepalived 官方目前还是推荐用明文的方式配置认证类型和密码。
介绍完了 VRRP
,接下来我再介绍一下 Keepalived
服务的工作原理:
Keepalived
高可用对之间是通过 VRRP
进行通信的,VRRP
是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点由于接收不到vrrp
心跳包了,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在keepalive
服务对之间,只有作为主的服务器会一直发送VRRP
广播包,告诉备它还活着,此时备就不会抢占主,当主不可用时,备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性,接管的速度最快可以小于1秒。
脑裂现象及原因
何为脑裂,指的是主备节点都活着但因为某些原因导致主节点和备节点无法检测到对方的心跳包,导致各自都争抢资源的所有权,这样严重的就会导致VIP或服务出现在主备两端中,当前端用户写入数据时就可能造成数据混乱或损坏;导致脑裂的原因可能有以下这些:
1、高可用服务器之间的心跳线路出现问题,导致无法正常通信,比如,心跳线坏了断了老化,网卡驱动坏了,ip配置冲突,心跳线连接的设备网卡或交换机坏了等;
2、高可用的服务器上开启了防火墙阻挡了心跳消息传输;
3、心跳网卡地址配置不当,导致心跳信息发送失败等;
4、其他服务配置不当,如心跳方式不同,心跳广播冲突,软件bug等;
常见解决脑裂方案
1、同时使用串行电缆和以太网电缆连接,同时用两条心跳线,这样一条坏了,另外一条还能传输心跳信息;
2、当检测到脑裂时强行关闭一个节点,这需要特殊设备的支持,如stonith
、fence
,即通关单独的电缆发送关机命令关闭其中一个节点服务器;
3、做好对脑裂的监控报警,在问题发生时第一时间介入,降低损失;
4、开发监控脑裂的脚本;
5、如果防火墙开启,一定要允许心跳消息通过,一般通过允许IP段的形式解决;
双实例双主keepalived配置
以上讲的单实例主备的实现,下面讲一下双实例双主的配置实现,其实就是A业务在LB01是主模式,在LB02上是备模式,B业务在LB01是备模式,在LB02上是主模式,下面就以双实例为例讲解不同业务实现双主的配置。
配置的大概如下图所示:
下面我们在LB01和LB02上重启keepalived
服务
systemctl start keepalived.service #LB01 LB02都重启keepalived
ip addr| grep 192.168.43.16
ip addr| grep 192.168.43.17
关闭LB01的keepalived
服务,LB02的keepalived
服务正常开着,结果如下:
开启LB01的keepalived
服务,关闭LB02的keepalived
服务,结果如下:
以上已经能实现地址漂移了,VIP可以实现相互切换接管,在实际工作中可以把网站A域名解析到192.168.43.16
提供服务,把B域名析到192.168.43.17
提供服务,当然LB01 LB02
也要配置响应的服务,如Nginx
反向代理。
解决多组keepalive服务器在一个局域网的冲突问题
我们前面讲到了keepalive
都是使用224.0.0.18
来作为多播地址发送信息的,那么当在同一个局域网内存在多组keepalive
服务器时就会存在多播地址冲突,同时又未使用专门的心跳线通信时,就可能会出现严重的接管问题,解决这个问题的办法就是在同组的keepalive
服务器所有的配置文件中指定唯一的多播地址,如下:
global_defs {
.........................
vrrp_mcast_group4 224.0.0.19 #这就是指定多播地址的配置
}
说明:最好不同的keepalive
实例其通信认证密码也不一样。