高可用性软件概述

在高可用性软件领域,我们经常会听到Heartbeat、Corosync、Pacemaker、keepalived等软件。经常有人问,我们到底应该选择哪一个:Heartbeat、Corosync还是Keepalived?

首先要说明的是,Heartbeat和Corosync属于同类软件,而Keepalived与Heartbeat和Corosync根本不是同类软件。Keepalived使用的是vrrp协议方式,即虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)。而Heartbeat和Corosync是基于主机或网络服务的高可用性方式。

简而言之,Keepalived的目标是模拟路由器的高可用性,而Heartbeat或Corosync的目标是实现服务的高可用性。通常Keepalived用于实现前端的高可用性,常见的前端高可用性组合有LVS+Keepalived、Nginx+Keepalived和HAproxy+Keepalived。而Heartbeat或Corosync通常用于实现服务的高可用性,常见的组合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd实现Web服务器的高可用性和Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL实现MySQL服务器的高可用性。

Keepalived实现了轻量级的高可用性,通常用于前端的高可用性,不需要共享存储,通常用于具有两个节点的高可用性。而Heartbeat(或Corosync)通常用于服务的高可用性,需要共享存储,通常用于具有多个节点的高可用性。

下面主要介绍一下Keepalived。

详解Keepalived

Keepalived是什么?

Keepalived是用于保证集群系统的高可用性的服务软件,用于防止单点故障。Keepalived最初是为了LVS调度节点的高可用性而设计的,专门用于监控集群系统中各个服务节点的状态。如果某个服务节点出现异常或故障,Keepalived将检测到并将该服务节点从集群系统中剔除,对于LVS而言,也就是替后端realserver进行健康状态监测。当故障节点恢复正常后,Keepalived会自动将该服务节点重新加入服务器集群中。这些操作全部自动完成,无需人工干预,而仅需人工干预的是修复出现故障的服务节点。

后来,Keepalived还实现了VRRP协议的功能,用于实现基于VRRP协议的LVS服务的高可用性方案,以避免单点故障。例如,一个LVS服务会有两台运行Keepalived的服务器,一台为主服务器(MASTER)一台为备份服务器(BACKUP),但对外显现为一个虚拟IP。主服务器会向备份服务器发送特定的消息,当备份服务器收不到这个消息时(也就是主服务器宕机时)备份服务器就会接管虚拟IP,从而继续提供服务,以确保高可用性。Keepalived是VRRP协议的完美实现,在介绍Keepalived之前,先介绍一下VRRP的原理。

VRRP工作机制

首先我们来看两个概念:VRRP路由器和VRRP虚拟路由器。

1. VRRP路由器:

指的是运行了VRRP协议实现程序的物理路由器,一台VRRP物理路由器可以位于多个虚拟路由器。

2. VRRP虚拟路由器:

所谓虚拟是指并不存在的,通常由多台物理的VRRP路由器组成,就好比这些物理路由器丢到一个池里,对外看起来就像是一台路由器,但实际上内部有多台虚拟路由器。

接下来再来看一下VRRP的工作机制:

VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,可以视为实现路由器高可用性的协议,旨在解决静态路由的单点故障。VRRP通过一种竞选协议动态将LAN中的路由任务交给某台VRRP路由器来实现。将N台提供相同功能的路由器组成一个路由器组,这个组里有一个主机和多个备份。主机上有一个对外服务的vip(该路由器所在局域网内其他机器的默认路由为该vip)。主机会发送组播信息,当备份收不到这个信息时就认为主机故障了,这时根据VRRP的优先级选举一个胜出的备份变成主机。这样就实现了路由器的高可用性。Keepalived巧妙地利用VRRP协议实现高可用性(HA)。VRRP的所有协议报文都是通过IP多播(multicast)包发送。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个已知的MAC地址。在虚拟路由器中,不管是谁是主机,对外都表现出相同的MAC和IP(称为VIP)。客户端主机不需要更改自身的路由配置因为主机的改变,对客户端来说,这种主从切换是透明的。只有作为主机的VRRP路由器会一直发送VRRP通告信息,备份不会抢占主机,除非有更高优先级的备份才能抢占主机。这种切换非常迅速(小于1秒),以确保服务的连续性。由于安全考虑,VRRP包使用了加密协议进行加密。

VRRP工作流程:

1) 初始化

路由器启动时,如果路由器的优先级是255(最高优先级,路由器拥有路由器地址),则会发送VRRP通告信息和广播ARP信息,将路由器IP地址对应的MAC地址设为虚拟MAC,设置定时器以准备定时发送VRRP通告信息,并转换成主机状态;否则,进入备份状态,设置定时器以检查是否收到主机的通告信息。

2) 主机

  • 设置定时通告定时器;
  • 用虚拟MAC地址响应路由器IP地址的ARP请求;
  • 转发目的MAC地址是虚拟MAC的数据包;
  • 如果拥有虚拟路由器IP,则接收目的地址为虚拟路由器IP的数据包,否则丢弃;
  • 收到shutdown事件时,删除定时通告定时器,发送优先权为0的通告包,并转换为初始化状态;
  • 在定时通告定时器超时时,发送VRRP通告信息;
  • 收到VRRP通告信息后,如果优先级为0,则发送VRRP通告信息;否则,判断数据的优先级是否高于本机,或者优先级相等但实际IP地址大于本地实际IP,设置定时通告定时器,复位主机超时定时器,转换为备份状态;否则,丢弃该通告包;

3)备份

  • 设置主机超时定时器;
  • 无法响应针对虚拟路由器IP的ARP请求信息;
  • 丢弃所有目的MAC地址是虚拟路由器MAC地址的数据包;
  • 不接受目的MAC地址是虚拟路由器IP的所有数据包;
  • 收到shutdown事件时,删除主机超时定时器,并转换为初始化状态;
  • 当主机超时定时器到期时,发送VRRP通告信息和广播ARP地址信息,并转换为主机状态;
  • 收到VRRP通告信息后,如果优先级为0,表示进行主机选举;否则,判断数据的优先级是否高于本机,如果是,则承认主机有效,复位主机超时定时器;否则,丢弃该通告包;

VRRP ARP查询处理:

当内部主机通过ARP查询虚拟路由器IP地址对应的MAC地址时,主机的响应MAC地址为VRRP的虚拟MAC地址,而不是实际网卡的MAC地址,这样在路由器切换时内网机器感知不到。当路由器重新启动时,也不会主动发送本地网卡的实际MAC地址。如果虚拟路由器开启了ARP代理(proxy_arp)功能,则代理的ARP响应也会响应VRRP虚拟MAC地址。

Keepalived架构

Keepalived也是经过模块化设计的,不同的模块负责不同的功能。下面是Keepalived的相关模块:core、check、vrrp、libipfwc、libipvs-2.4、libipvs-2.6。

core:负责Keepalived的核心功能,包括主进程的启动和维护以及全局配置文件的加载和解析等。

check:负责healthchecker(健康检查),包括各种健康检查方式以及对应的配置解析(包括LVS的配置解析)。

vrrp:VRRPD子进程用于实现VRRP协议。

libipfwc:用于配置LVS时会用到的库。

libipvs:配置LVS时会用到的库。

注意:请注意,Keepalived和LVS完全是两码事,只是它们各自负责不同的功能并相互协作。

接下来,我们将分享更多关于DEVOPS和DBA方面的内容,有兴趣的朋友可以关注一下!