目录
1 高可用集群简介
1.1 高可用的概念
1.2 常见的 HA 集群
1.3 高可用集群软件
2 keepalived的功能与用途
2.1 LVS directors failover功能
2.2 LVS cluster nodes healthchecks功能
3 VRRP协议介绍
4 Keepalived 架构
5 原理总结
1 高可用集群简介
1.1 高可用的概念
高可用集群( High Availability Cluster, HA 集群),其中高可用的含义是最大限度地可以使用。从集群的名字上可以看出,此类集群实现的功能是保障用户的应用程序持久、不间断地提供服务。 当应用程序出现故障或者系统硬件、网络出现故障时,应用可以自动、快速从一个节点切换到另一个节点,从而保证应用持续、不间断地对外提供服务,这就是高可用集群实现的功能 .
1.2 常见的 HA 集群
我们常说的双机热备、双机互备、多机互备等都属于高可用集群的范畴,这类集群一般都由两个或两个以上节点组成。典型的双机热备结构如下图所示 :
1.3 高可用集群软件
高可用集群一般是通过高可用软件来实现的。在 Linux 下常用的高可用软件有开源HeartBeatHA、 Red Hat 提供的 RHCS、商业软件 ROSE、Keepalived、pacemaker 等。
心跳检测:
为了实现负载平衡、高可用性和错误恢复,集群系统采用心跳检测技术。心跳检测通过心跳线完成,可以使用 RS232 串口线、专用网卡或共享磁盘阵列等设备。心跳线数量应等于集群节点数减去 1。若使用网卡进行心跳检测,每个节点需配备两块网卡,一块用于私人网络直接连接到另一节点对应网卡进行心跳检测,另一块则连接至公共网络提供服务。此外,心跳网卡和服务网卡的 IP 地址应避免在同一子网内。心跳检测的效率直接影响故障切换的时间,集群系统依赖心跳技术维持节点间的有效通信。
漂移 IP 地址:
在集群系统中,除了每个节点自身的静态 IP 地址外,还有一个浮动 IP 地址。该地址并非固定不变,例如,在双机热备中,正常状态下浮动 IP 地址位于主节点,一旦主节点发生故障,浮动 IP 地址将自动切换至备用节点。因此,为了确保服务的持续性,在集群系统中必须使用浮动 IP 地址作为对外提供的服务 IP 地址。尽管节点自身的 IP 地址也可提供服务,但当节点失效时,服务将转移到另一个节点,而连接服务的 IP 地址仍为故障节点的 IP 地址,导致服务中断。
Keepalived是一个开源软件,主要用于构建高可用性(High Availability, HA)的服务器环境。它的主要作用是在主服务器发生故障时,自动将请求转移到备份服务器上,从而避免了服务中断的情况。
Keepalived有两个核心组件:检测器和通知器。检测器负责定期对服务器进行健康检查,如果发现服务器出现问题,就会通知通知器。通知器则会根据配置文件中的规则,决定如何处理这个问题,比如切换到备用服务器等。
Keepalived还支持VRRP协议,这是一种用于解决单一路由器故障的方法。通过VRRP,可以创建一个虚拟路由器,由多个物理路由器共享这个虚拟路由器的身份。当主路由器发生故障时,其他路由器就可以接管虚拟路由器的角色,继续提供服务。
2 keepalived的功能与用途
Keepalived服务两大用途healthcheck & failover
2.1 LVS directors failover功能
Ha failover功能:实现LB Master主机和Backup主机之间故障转移和自动切换。
这是针对有两个负载均衡器Director同时工作而采取的故障转移措施。当主负载均衡器(MASTER)失效或出现故障时,备份负载均衡器(BACKUP)将自动接管主负载均衡器的所有工作;一旦主负载均衡器(MASTER)故障修复,MASTER又会接管回它原来处理的工作,而备份负载均衡管理器(BACKUP)会释放master失效时它接管的工作,此时两者将恢复到最初各自的角色状态。
LVS directors failover功能原理图
图一:keepalived集群正常工作双主架构简图
图二:keepalived集群LVS director2宕机状态
图三:keepalived集群DIP2 takeover图
图四:keepalived集群takeover后正常架构简图
2.2 LVS cluster nodes healthchecks功能
rs healthcheck功能:负载均衡定期检查RS的可用性决定是否非其分发请求。 当虚拟服务器中的某一个甚至是几个真实服务器同时发生故障无法提供服务时,负载均衡器会自动将失效的服务器从转发队列中清除出去,从而保证用户的访问不受影响;当故障的服务器被修复以后,系统又会自动地把他们加入转发队列,分发请求提供正常服务。
LVS cluster nodes healthchecks功能原理图
图一:keepalived集群双主LVS cluser nodes意外宕机示意图
图二:keepalived集群双主LVS cluster nodes意外宕机RS自动清理示意图
3 VRRP协议介绍
vrrp协议,英文名称:Virtual Router Redundancy Protocol,中文名称:虚拟路由器冗余协议。vrrp出现就是为了解决静态路由的单点故障,vrrp是通过一种竞选协议机制来将路由任务交给某台vrrp路由器。
MASTER和BACKUP
在一个VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台物理的机器并不同时工作,而是由一台称为MASTER的负责路由工作,其他的都是BACKUP,MASTER并非一成不变,VRRP协议让每个VRRP路由器参与竞选,最终获胜的就是MASTER。MASTER有一些特权,比如拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求。
VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包(多播地址224.0.0.18)形式发送的。虚拟路由器有VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址:00-00-5E-00-01{VRID}。所有,在一个虚拟路由器中,不管谁是MASTER,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因为MASTER的改变而修改自己的路由配置,对他们来说,这周主从的切换时透明的。
在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement message),BACKUP不会抢占MASTER,除非它的优先级(priority)更高。当MASTER不可用时(BACKUP收不到广告包),多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占式非常快速的(<1s),以保证服务的连续性。
出于安全性考虑,VRRP包使用了加密协议进行加密。
keepalived主要特点如下所示。
1)Keepalived是LVS的扩展项目,因此它们之间具备良好的兼容性。 这点应该是 Keepalived部署比其他类似工具更简洁的原因,尤其是相对于Heartbeat而言,Heartbeat作为HA软件,其复杂的配置流程让许多人望而生畏。
2)通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离。
3)负载均衡器之间的失败切换,是通过VRRPv2(Virtual Router Redundancy Protocol)stack实现的,VRRP当初被设计出来就是为了解决静态路由器的单点故障问题。
4)通过实际的线上项目,我们可以得知,iptables的启用是不会影响Keepalived的运行的。 但为了更好的性能,我们通常会将整套系统内所有主机的iptables都停用。
5)Keepalived产生的VIP就是整个系统对外的IP,如果最外端的防火墙采用的是路由模式,那就映射此内网IP为公网IP。
4 Keepalived 架构
https://keepalived.org/doc/http://keepalived.org/documentation.html
vrrp stack:VIP消息通告
checkers:监测real server
system call:实现 vrrp 协议状态转换时调用脚本的功能
SMTP:邮件组件
IPVS wrapper:生成IPVS规则
Netlink Reflector:网络接口
WatchDog:监控进程
- 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
- IO复用器:针对网络目的而优化的自己的线程抽象
- 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
5 原理总结
- 虚拟路由器:Virtual Router
- 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
- VIP:Virtual IP
- VMAC:Virutal MAC (00-00-5e-00-01-VRID)
- 物理路由器:
- master:主设备
- backup:备用设备
- priority:优先级
VRRP 相关技术
通告:心跳,优先级等;周期性
工作方式:抢占式,非抢占式
安全认证:
无认证
简单字符认证:预共享密钥
MD5
工作模式:
- 主/备:单虚拟路由器
- 主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务