keepalived 软件设计




一、关于负载均衡

在了解 keepalived 之前,首先需要了解 “ 负载均衡 ” ,负载均衡是一种在真实服务器集群中分配 IP 流量的方法,可提供一个或多个高度可用的虚拟服务。
在设计负载均衡拓扑时,重要的是要考虑负载均衡器本身的可用性以及它背后的真实服务器。


二、关于 keepalived
Keepalived 为负载均衡和高可用性提供的框架。负载均衡框架依赖于众所周知且广泛使用的 Linux 虚拟服务器(IPVS)内核模块,该模块提供第4层负载平衡。
Keepalived 实现了一套健康检查器,可根据其健康动态地自适应地维护和管理负载均衡的服务器池。
虚拟冗余路由协议(VRRP)实现高可用性。VRRP 是路由器故障转移的基础砖块。此外,keepalived 实现了一组挂钩到 VRRP有限状态机,提供低级别和高速协议的交互。
每个 Keepalived 框架可以独立使用或一起使用,以提供弹性基础系统服务。
在这种情况下,负载均衡也可以被称为 “ 导向器 ” 或 “ LVS路由器 ”。


Keepalived 提供了两个主要功能:
1)、健康检查LVS系统;
2)、实施VRRPv2堆栈以处理负载均衡器故障转移;


四、Keepalived 的设计理念
Keepalived 由纯粹的 ANSI / ISO C 写成,Keepalived 围绕一个中央 I / O 多路复用器提供,可提供实时网络设计。主要设计重点是在所有元素之间提供统一的模块化。
这就是为什么创建核心库来删除代码重复的原因。目标是生成安全可靠的代码,确保生产的健壮性和稳定性。


为了确保健壮性和稳定性,守护进程被分成3个不同的进程:
1)、一个简约的父进程负责其子过程与分叉过程的监控。
2)、其余两个子进程,一个负责 VRRP 框架,另一个负责健康检查。


每个子进程都有自己的调度 I / O 多路复用器,这样 VRRP 调度得到了优化,因为 VRRP 调度比健康检查更明智、更关键。
这种拆分设计可最小化健康检查使用情况,并将其自身的行为最小化到闲置的主循环,以避免由其本身造成的故障。


五、内核组件
Keepalived 使用四个 Linux 内核组件:
1)、LVS 框架:使用 getsockopt 和 setsockopt 调用来获取和设置 sockets 上的选项。
2)、Netfilter 框架:支持NAT和伪装的IPVS代码。
3)、Netlink 接口:设置和删除网络接口上的 VRRP 虚拟 IP。
4)、组播:将 VRRP 通告发送到保留的 VRRP MULTICAST 组。


原子元素




六、控制平面
Keepalived 配置通过文件 keepalived.conf 完成。编译器设计用于解析。解析器使用关键字 “ 树层次结构 ” 将每个配置关键字与特定处理程序进行映射。
多级递归函数读取配置文件并遍历关键字树。在分析过程中,配置文件被转换为内部内存表示。


七、调度程序 - I / O 复用器
所有的事件都安排在同一个进程中。Keepalived 是一个单一的过程。Keepalived 是一款网络路由软件,负责调度所有内部任务。不使用 POSIX 线程库。
该框架提供了针对联网而优化的自己的线程抽象。


八、内存管理
这个框架提供了一些通用的内存管理函数取到像分配、再分配,释放等。这个框架可以在两种模式下使用:normal_mode 和 debug_mode。
使用 debug_mode 时,它提供了一种强有力的方式来消除和跟踪内存泄漏。这种低级别的环境通过跟踪分配内存和释放内存来提供在运行保护下的缓冲区。
所有使用中的缓冲区的长度都是固定的,以防止最终的缓冲区溢出。


九、核心组件
该框架定义了在所有代码中使用的一些通用库和全局库。这些库是:html解析、链接列表、定时器、向量、字符串格式化、缓冲区转储、网络实用程序、守护进程管理、pid处理、低层TCP层4。
这里的目的是将代码分解为最大限度以尽可能限制代码重复以增加模块性。


十、WatchDog
该框架提供了对子进程的监控(VRRP 和 健康检查)。每个子进程接受连接到它自己的 unix 域 socket。父进程向此子 unix 域 socket 发送 “hello” 消息。
Hello 消息使用父节点上的 I / O 多路复用器发送,并在子进程一侧使用 I / O 多路复用器接收/处理。
如果父进程检测到损坏的管道,则使用 sysV 信号进行测试,如果该子进程仍然活着就重新启动它。


十一、Checkers
Checkers 是 Keepalived 主要功能之一。Checkers 负责 realserver 健康检查。检查器测试如果 realserver 处于活动状态,则此测试以一个二进制的决定结束。
从 LVS 拓扑中删除或添加 realserver。内部检查器设计是实时网络软件,它使用完全多线程的 FSM 设计(有限状态机)。
此检查器堆栈提供 LVS 拓扑操作,适用于第4层到第5或7层的测试结果。它由一个由父进程监控的独立进程运行。


十二、VRRP Stack
VRRP Stack 是 Keepalived 最重要的功能。VRRP(Virtual Router Redundancy Protocol:RFC2338)虚拟路由器冗余协议 侧重于导向器接管,为路由器备份提供底层设计。
它实现了完整的 IETF RFC2338 标准,并为 LVS 和 防火墙 设计提供了一些规定和扩展。它实现了 vrrp_sync_group 扩展,用于保证协议接管后的持久性路由路径。
它使用 MD5-96 位密码提供 IPSEC-AH 来保护协议交换。重要的事情:VRRP代码可以在没有 LVS 支持的情况下使用,它被设计为独立使用。它在由父进程监视的独立进程中运行。


十三、系统调用
系统调用框架提供了启动额外系统脚本的能力。它主要用于 MISC 检查器。在 VRRP 框架中,它提供了在协议状态转换期间启动额外脚本的功能。
系统调用时完成为一个分叉进程,不会影响全局调度计时器。


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


十五、SMTP
SMTP 协议用于管理通知。它使用多线程 FSM 设计实现 IETF RFC821。管理通知发送给健康检查活动和 VRRP 协议状态转换。SMTP是常用的,可以与任何其他通知子系统如:GSM短消息接口、传呼机、等。


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


十七、IPVS
IPVS(IP虚拟服务器)在Linux内核内实现传输层负载均衡,也称为第4层交换。


十八、Netlink
由 Alexey Kuznetov 提供的 Linux 内核代码,具有非常好的高级路由框架和子系统功能。Netlink 用于在内核和用户空间进程之间传输信息。
它由用于用户空间进程的标准基于 sockets-based interface 和用于内核模块的内部内核API组成。


十九、系统日志
所有 keepalived 守护进程通知消息都使用 syslog 服务进行记录。


二十、健康检查框架
每个运行状况检查都已注册到全局调度框架。这些运行状态检查工作线程执行以下类型的运行状况检查:
TCP_CHECK :
在第4层工作。为确保检查,我们使用非阻塞/超时 TCP 连接进行 TCP Vanilla 的检查。如果远程服务器未回复此请求(超时),则测试出错,并且服务器将从服务器池中删除。
HTTP_GET :
在第5层工作。对指定的 URL 执行 HTTP GET。然后使用 MD5 算法对 HTTP GET 结果进行求和。如果这个总数与预期值不符,那么测试是错误的,服务器将从服务器池中删除。
该模块对同一服务实施多 URL 获取检查。如果您使用托管多个应用程序服务器的服务器,则此功能很有用。此功能使您能够检查应用程序服务器是否正常工作。
MD5 加密是使用 genhash 程序(包含在keepalived软件包中)生成的。
SSL_GET :
与 HTTP_GET 相同,但使用 SSL 连接到远程 Web 服务器。
MISC_CHECK :
此检查允许用户定义的脚本作为运行状况检查程序运行。结果必须是 0 或 1,该脚本在主盒上运行,这是测试内部应用程序的理想方式。
可以使用完整路径(即/path_to_script/script.sh)调用不带参数运行的脚本。那些需要参数的脚本,则需要用双引号括起来(即“ /path_to_script/script.sh arg 1 ... arg n ”)


Keepalived 的目标是定义一个可轻松扩展的通用框架,用于添加新的检查器模块。


十一、故障转移(VRRP)框架
Keepalived 实现了导向器故障转移的 VRRP 协议。在实现了 VRRP 堆栈中,VRRP 数据包调度器负责分解具体的每个 VRRP 实例的特定I / O。


注意:此框架与LVS无关,因此可以将其用于 LVS 导向器故障转移,即使是需要热备份协议的其他 Linux 路由器也是如此。出于设计和健壮性的考虑,该框架已完全集成在 Keepalived 守护进程中。








keepalived 官网: http://www.keepalived.org/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值