Linux扩展应用 ·

keepalived简介

keepalived的作用

Keepalived 是一个基于 VRRP 协议来实现的 LVS 服务高可用方案,可以利用其来避免单点故障。一个 LVS 服务会有 2 台服务器运行 Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟 IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟 IP,继续提供服务,从而保证了高可用性,Keepalived 是 VRRP 的完美实现。

Keepalived工作原理

在现实的网络环境中,两台需要通信的主机大多数情况下并没有直接的物理连接。对于这样的情况,它们之间路由怎样选择?主机如何选定到达目的主机的下一跳路由,这个问题通常的解决方法有二种:

  • 在主机上使用动态路由协议(RIP、OSPF 等)
  • 在主机上配置静态路由

很明显,在主机上配置动态路由是非常不切实际的,因为管理、维护成本以及是否支持等诸多问题。配置静态路由就变得十分流行,但路由器(或者说默认网关 default gateway)却经常成为单点故障。VRRP 的目的就是为了解决静态路由单点故障问题,VRRP 通过一竞选(election)协议来动态的将路由任务交给 LAN 中虚拟路由器中的某台 VRRP 路由器。

在一个 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 地址。所以,在一个虚拟路由器中,不管谁是 MASTER,对外都是相同的 MAC 和 IP(称之为 VIP)。客户端主机并不需要因为 MASTER 的改变而修改自己的路由配置,对客户端来说,这种主从的切换是透明的。

在一个虚拟路由器中,只有作为 MASTER 的 VRRP 路由器会一直发送 VRRP 通告信息(VRRPAdvertisement message),BACKUP 不会抢占 MASTER,除非它的优先级(priority)更高。当 MASTER 不可用时(BACKUP 收不到通告信息), 多台 BACKUP 中优先级最高的这台会被抢占为 MASTER。这种抢占是非常快速的(<1s),以保证服务的连续性。由于安全性考虑,VRRP 包使用了加密协议进行加密。

Keepalived工作流程

(1)初始化:

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

(2)Master

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

(3)Backup

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

(4)ARP 查询处理

当内部主机通过 ARP 查询虚拟路由器 IP 地址对应的 MAC 地址时,MASTER 路由器回复的 MAC 地址为虚拟的 VRRP 的 MA C地址,而不是实际网卡的 MAC 地址,这样在路由器切换时让内网机器觉察不到;而在路由器重新启动时,不能主动发送本机网卡的实际 MAC 地址。如果虚拟路由器开启的 ARP 代理 (proxy_arp)功能,代理的 ARP 回应也回应 VRRP 虚拟 MAC 地址。

Keepalived软件架构

Keepalived 整体是纯 ANSI/ISO C. 编写,该软件围绕着一个中央 I/O多路复用器,设计用来进行实时的网络功能。主要的设计重点是提供同质量的模块化管理,并且创建核心库以避免代码重复,提高代码复用率。另一方面,其提供安全可靠的代码,以保证生产环境的稳定性与性能。

为了确保性能和稳定性,守护程序分为 3 个不同的进程。全局设计基于一个简单的父进程,负责分叉子进程监控。然后 2 个子进程,一个负责 VRRP 框架,另一个负责健康检查。每个子进程都有自己的调度 I/O 多路复用器,这样 VRRP 调度抖动被优化,因为 VRRP 调度比健康检查更关键。另一方面,这种分裂设计最小化了健康检查的使用,并将其自身的行动降到最低和空闲主循环,以避免自身造成的故障。父进程监视框架被称为看门狗,设计是为每个子进程打开一个接受 unix 套接字,然后同时守护进程引导,父进程连接到那些 unix 套接字,并发送周期(5s)监测包给子进程。如果父项无法发送监测数据包到远程连接的 unix 域套接字,它只是重新启动子进程。这个看门狗设计提供了 2 个好处,首先从父进程发送到远程连接的子进程的监测包是通过 I/O 多路复用器调度器,它可以检测子进程调度框架中的死循环。第二个好处是通过使用 sysV 信号来检测死亡的进程。当运行时,您将在进程列表中看到:

PID
111 Keepalived
112 \ _ Keepalived
113 \ _ Keepalived

模块简介

控制组件

Keepalived 配置通过文件 keepalived.conf 来完成。编译器设计用于解析,解析器使用关键字树层次结构来映射每个配置关键字与细节处理程序。中央多级递归函数读取配置文件并遍历关键字树。在解析期间,配置文件被转换为内部存储器表示。

内存管理组件

这个框架提供了一些通用的内存管理功能,如分配,重新分配,释放等。这个框架可以在两种模式下使用:normal_mode&debug_mode。当使用 debug_mode 它提供了一个强大的方法来根除和跟踪内存泄漏。这个低电平 env 通过跟踪分配存储器并释放来提供缓冲器欠载保护。所有使用的缓冲区长度固定,以防止最终的缓冲区溢出。

WatchDog

这个框架提供子进程监控(VRRP 和 Healthchecking)。每个子进程接受到自己的看门狗 unix 套接字的连接。父进程发送检测“hello”消息到这个子 unix 套接字。Hello 消息使用父端的 I/O 多路复用器发送,并使用子端的 I/O多路复用器接受并处理。如果父检测到子进程私网,那么它会试着使用 sysV 信号重新启动它。

VRRP Stack

另一个最重要的 Keepalived 功能。VRRP(虚拟路由器冗余协议:RFC2338)专注于导向器接管,它为路由器备份提供低级设计,实现完整的 IETF RFC2338 标准,具有 LVS 和防火墙设计的一些规定和扩展;实现 vrrp_sync_group 扩展,保证协议接管后的持久性路由路径;实现 IPSEC-AH 使用 MD5-96bit 加密规定保护协议广告交换

有关 VRRP 的更多信息,请阅读 RFC。提醒:VRRP 代码可以在没有 LVS 支持的情况下使用,它被设计用于独立使用,在一个由父进程监视的独立进程中运行。

Netlink Reflector

与 IPVS 包装器相同。Keepalived 使用自己的网络接口。IP 地址和接口标志通过内核 Netlink 通道设置和监控。Netlink 消息子系统用于设置 VRRP VIP。另一方面,Netlink 内核消息传递广播能力用于反映我们的用户空间 Keepalived 内部数据表示任何与接口相关的事件。因此任何其他用户空间(其他程序)netlink 操作通过 Netlink 内核广播(RTMGRP_LINK&RTMGRP_IPV4_IFADDR)反映到我们的 Keepalived 数据。

调度器 - I / O多路复用器

所有事件都安排在同一进程中。Keepalived 是一个单一的进程,是一个网络路由软件,它是如此接近 I/O。这里使用的设计是一个中央选择(...),负责安排所有内部任务。不使用 POSIX 线程库。这个框架提供了为网络目的优化的自己的线程。

核心组件

这个框架定义了一些在所有代码中使用的公共和全局库。这些库是:html解析,链接列表,定时器,向量,字符串形成,缓冲转储,网络实用程序,守护进程管理,pid 处理,低级 TC P层 4。这里的目标是将代码因式分解为max 到 limite 作为可能的代码重复以增加模块性。

Checkers

这是 Keepalived 的主要功能之一。检查器负责 realserver 健康检查。检查器测试如果 realserver 存活,则此测试结束于二进制决策:从 LVS 拓扑中删除或添加 realserver。内部检查设计是实时网络软件,它使用完全多线程 FSM 设计(有限状态机)。此检查器堆叠提供 LVS 拓扑操作,根据 layer4 到 layer5/7 测试结果。它在一个独立的进程中运行,由父进程监视。

系统调用

此框架提供启动额外系统脚本的能力,主要用于 MISC 检查器。在 VRRP 框架中,它提供了在协议状态转换期间启动额外脚本的能力。系统调用进入分叉过程,以不占用全局调度定时器。

SMTP

SMTP 协议用于管理通知,它使用多线程 FSM 设计实现 IETF RFC821。发送管理通知用于 healthcheckers 活动和 VRRP 协议状态转换。SMTP 通常使用,并且可以与任何其他通知子系统接口,例如 GSM-SMS,寻呼机,...

IPVS包装器

此框架用于将规则发送到内核 IPVS 代码,它提供了 Keepalived 内部数据表示和 IPVS rule_user 表示之间的转换,使用 IPVS libipvs 保持与 IPVS 代码的通用集成。

IPVS

从 LinuxVirtualServer.org OpenSource Project 提供的 Linux 内核代码。

NETLINK

由 Alexey Kuznetov 提供的 Linux 内核代码及其非常好的高级路由框架和子系统功能。

参与评论