一、关于负载均衡

在了解 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/

keepalived 软件设计相关推荐

  1. 多核片上系统(SoC)架构的嵌入式DSP软件设计

    多核片上系统(SoC)架构的嵌入式DSP软件设计 Multicore a System-on-a-Chip (SoC) Architecture SoCs的软件开发涉及到基于最强大的计算模型在各种处理 ...

  2. 软件设计之 数据库设计

    [按语:在软件设计或是动态网站开发中,数据库设计时很重要,我觉得可以说是开发工作的核心部分,所以学好数据库设计,是很重要的,也是大有前途的...]  ◆.概念 首先要搞清楚容易混淆的两个概念:&quo ...

  3. 概要设计实例_多核片上系统(SoC)架构的嵌入式DSP软件设计

    多核片上系统(SoC)架构的嵌入式DSP软件设计 Multicore a System-on-a-Chip (SoC) Architecture SoCs的软件开发涉及到基于最强大的计算模型在各种处理 ...

  4. 由学习《软件设计重构》所想到的代码review(二)

    前言 对于一个程序员来讲如何来最直接的来衡量他的技术能力和产出呢?我想最直观的作法是看他的代码编写能力,就拿我经常接触的一些程序员来看,他们买了很多技术重构类书籍,但是看完后代码编写能力并没有显著提高 ...

  5. 面向过程的软件设计方法

    面向过程的软件设计方法 前面主要是对系统的分析,从而明确我们系统的逻辑模型.也就是说,通过前面几章我们清楚了"系统需要做什么?".而软件设计阶段主要任务则是要实现系统逻辑模型向物流 ...

  6. 自己拿项目,软件设计开发,释放你的力量

    自己拿项目,软件设计开发,释放你的力量,链接地址 http://un.zhubajie.com/r/?u=4674706&l=http://u.zhubajie.com/user/buyer ...

  7. 面向对象软件设计的“开—闭”原则

    1.什么是开闭原则         "开-闭"原则是指软件实体应当对扩展性开放,对修改关闭.即软件实体应该在不修改的前提下扩展,这个原则实际上为软件设计指明了目标.我们知道软件设计 ...

  8. 《软件设计精要与模式》第二版源代码

    <软件设计精要与模式>第二版的代码相较于第一版而言,做了一定的修改.代码采用C#语言编写,并在Windows XP, Visual Studio 2008, SQL Server 2005 ...

  9. [原]软件设计的一些感悟

    作为一些感悟就留着自己珍藏吧,不发到首页了. 个人觉得软件设计就应该像搭积木,或者说是俄罗斯方块 俄罗斯方块的每一个块都可以看做软件设计中的模块,但是方块的形状是不同的.需要将整个软件设计的良好,我们 ...

最新文章

  1. 数据结构与算法--绪论
  2. 记一次坑爹的 “跨域” 问题
  3. 复制本张表数据并插入本张表中
  4. Android的Toast介绍-android学习之旅(三十六)
  5. Java 8:长期支持的堡垒
  6. Java 结构体之 JavaStruct 使用教程一 初识 JavaStruct
  7. Fragment懒加载(三)
  8. SHELL 003 -- ss命令常用方法
  9. 设计学习---《大象》之系统分析
  10. 五分钟搭建 Flash 视频直播站
  11. 【汇编程序】实现1-100求和(使用LOOP循环)
  12. 敌兵布阵(CDQ分治模板题)
  13. 股指期货真是个好东西
  14. 设计高效的交叉功率因数校正方案
  15. 西边人西说测试,测试蓝本 | 一篇文章看懂什么是测试,测试是干什么的
  16. python招聘杭州拉勾网_Python爬虫:爬取拉勾网招聘信息
  17. Python3之基础语法
  18. 调研字节码插桩技术,用于互联网分布式系统监控设计和实现!
  19. 调用腾讯地图 输入地址获取经纬度
  20. pycharm 字体颜色更改

热门文章

  1. 销售宝:如何才能做好一个软件销售?
  2. openwrt安装drcom
  3. 租房指南:网上租房与中介租房利弊大PK!
  4. 2020 智慧消防解决方案最新版本
  5. Cannot resolve the collation conflict between “SQL_Latin1_General_CP1_CI_AS“ and “Latin1_General_CI_
  6. 关于PLC与编码器的接线问题
  7. Markdown在线预览
  8. 优化360小鸟壁纸,让它不再流氓!
  9. rmd文件怎么转换html文件,RMD文件扩展名 - 什么是.rmd以及如何打开? - ReviverSoft...
  10. 论文笔记(十一):Learning to Track with Object Permanence