软件架构如下图所示:

Keepalived 完全使用标准的ANSI/ISO C写出. 该软件主要围绕一个中央I/O复用分发器而设计,这个I/O复用分发器提供网络实时功能. 主要设计目标着重于从所有的模块抽取一个公共模块,所有模块衍生于公共模块, 这是核心库产生的意义所在———降低代码的重复. 另一方面,设计目标是使用安全和有保障的的代码来保证生产的稳定性和健壮性。

为了保证的稳定性和健壮性, 后台程序被分解为3个不同的进程. 全局设计思想是一个简约的父进程来负责监控它创建的子进程。父进程创建了2个子进程,一个负责VRRP框架,一个负责健康检查。每个子进程都有自己调度的I/O复用分发器,注意VRRP调用器Jitter的优先级高,因为VRRP调度比健康检查更重要和敏感。 On the other hand this split design minimalize for healthchecking the usage of foreign librairies and minimalize its own action down to and idle mainloop in order to avoid malfunctions caused by itself. 父进程监控框架被称为看门狗, 设计思路如下 : 每个子进程打开一个unix监听套接字,当后台程序启动后,父进程连接到字进程的监听套接字,然后周期的(5s)发送hello报文包给子进程。如果父进程不能发送hello报文包到已经建立连接的字进程监听套接字,就直接重启子进程。这种看门狗设计方式主要有两个好处: 第一,所有从父进程发送到远程连接到子进程的hello报文包都是通过I/O复用分发调度器来完成,这样做的好处是它可以检测到子进程调度框架的死循环。第二个好处是由使用sysV信号检测子进程存活状态带来的。 keepalived运行时,可以查看到如下进程 :

  PID    
  111 Keepalived <-- Parent process monitoring children
  112 \_ Keepalived <-- VRRP child
  113 \_ Keepalived <-- Healthchecking child

所有的原子模块如下面介绍所示:

控制面板 :
Keepalived的配置通过keepalived.conf文件来完成. 一个编译器用来解析这个文件.编译器读取关键字层次树,关键字层次树将配置文件中的关键字和响应的处理方法映射到一起。 一个中央、多级、递归函数读取配置文件,转换为关键字树。在解析过程中,读取配置文件到内存中。

内存管理 :

这个框架提供了一些通用的存储器存取管理功能如分配,再分配,释放,…等等。可以工作在两种模式:normal_mode和debug_mode。当使用debug_mode提供强有力的办法消除和跟踪内存泄漏。这种底层环境级别通过追踪内存的分派和释放来提供低运行缓存保护。这些使用的缓存的长度是固定,原因是为了防止事件性的缓存泄露。

WatchDog :

这个框架提供了子进程的监控(VRRP和健康检查)。每一个子进程打开自己的看门狗unix域套接字连接,父进程发送hello消息到子进程unix域套接字,hello消息经由父进程的I/O复用分发器发送到子进程的I/O复用分发器接受处理。如果子进程仍然存活,但父进程使用sysV系统监测到管道破坏时,就重启子进程。

VRRP 栈:

keepalived另一个最重要功能。VRRP(虚拟路由冗余协议: RFC2338)是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 vrrp 路由器中的一台。它为路由备份提供了底层设计。它不但完整实现了RFC2338得标准,还为lvs及防火墙提供了一些准备和扩展设计。它实现了vrrp_sync_group扩展来保证协议接管后的路由保持。它使用MD5-96位密码设置实现了IPSEC-AH来保证广告交换的安全性。VRRP更多消息请阅读RFC.提醒:VRRP代码可以单独使用而不需要LVS支持,这个特性为独立用户设计。它运行在一个父进程监控的独立子进程中。

Netlink 反射器:

类似于IPVS包装器。keepalived有自己的网络接口结构,核心netlink通道设置ip地址和接口标志和监控。netlink消息子系统用来设置VRRP的vip。netlink 核心消息广播用来映射成事件相关接口的keepalived自定义用户空间的数据结构。因此通过netlink核心广播(RTMGRP_LINK & RTMGRP_IPV4_IFADDR),可以将任意的用户空间(别的程序)的netlink操作映射到keeaplived 数据结构。

IPVS :
linux核心代码,贡献者 Wensong,LinuxVirtualServer.org 开源工程

NETLINK :

linux核心代码,贡献者Alexey Kuznetov,它拥有优美、先进的路由框架和子系统能力。

调度器 - I/O 复用器 :

所有的事件被调度到同一个进程进行处理。keepalive是单进程的。它是一个网络路由软件,和I/O密切相关。这里的设计方式是中央select(...),它负责调度所有内部task。没有使用POSIX线程库。因网络原因,这个框架提供了自己的线程抽象优化。

核心组件 :

这个框架定义了可以在所有代码中用到的一些通用的及一些全局库,这些库有:html解析,link-list,定时器,向量,字符串格式,buffer dump,网络工具类,后台程序管理,pid处理,底层4层tcp层。这里的全局库通过工厂化方式尽量减少代码的重复来提高系统的模块性。

Checkers :

这是keepalived最重要的功能点之一。检查器对真实服务器进行健康检测。只要真实服务器存活着,一个检测器就一直进行检测,当从LVS拓扑结构中移除或者加入一个真实服务器时该检测器停止工作。内部检测器设计成一个网络实时软件,它完全使用多线程FSM(有限状态机)设计。这个检测器栈根据四层或者5/7层测试结果对LVS拓扑进行操作。 它运行在一个独立的进程中,该进程被父进程所监控。

系统调用:

该框架提供启动额外的系统脚本的能力。主要是用在MISC 检查器。在VRRP框架协议状态转换中,提供执行额外的脚本的能力。系统调用通过生成一个子进程完成的,不干扰全局调度计时器。

SMTP :
SMTP协议用来管理通知,使用多线程有限状态机设计,满足IETF RFC821 标准. 管理通知用来发送健康检测活动和VRRP协议状态转换信息。SMTP非常通用,它也可以和其他通知子系统进行交互,如GSM短消息接口,寻呼机,…等等

IPVS 包装器 :
该框架用来发送规则到IPVS核心代码. 它作为keepalived内部数据结构和IPVS 规则_用户结构的转换桥梁。使用IPVS libipvs和IPVS代码保持通用的集成。

官方文档地址:http://www.keepalived.org/documentation.html

以上翻译以官方为准,如翻译不当,请轻拍。

keepalive学习之软件设计的更多相关文章

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

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

  2. keepalive学习

    keepalive学习之软件设计 软件架构如下图所示: Keepalived 完全使用标准的ANSI/ISO C写出. 该软件主要围绕一个中央I/O复用分发器而设计,这个I/O复用分发器提供网络实时功 ...

  3. 软件设计之基于Java的连连看小游戏(一)——开题及游戏首页的制作

    原本计划紧张忙碌的考试月在图书馆和实验室度过,结果突如其来为期两周的软件设计把课余时间几乎捆绑在了机房.软设没有太多知识上的要求,只要成品简洁美观.实用准确即可.考虑了很久决定要用Java swing ...

  4. 软件设计之基于Java的连连看小游戏(二)——游戏基础界面的制作及事件的添加

    上次完成到游戏首页的制作,今天完成了游戏基础界面的制作以及事件的简单添加.由于功能尚未完全实现,因此游戏界面的菜单列表只是简单地添加了一下,其余菜单列表以及倒计时等在后续的制作中逐一完善. 1.首先在 ...

  5. 软件设计之基于Java的连连看小游戏(三)——所有功能的实现

    新年快乐!期末接二连三的考试实在太忙了忘记连连看没有更新完,今天想要学习生信时才发现.所以这次直接把连连看所有功能全部放上. 在传统的连连看的基础上,我增加了上传头像的功能,即可以自行上传图片作为游戏 ...

  6. 13 JSP、MVC开发模式、EL表达式和JSPL标签+软件设计架构---学习笔记

    1.JSP (1)JSP概念:Java Server Pages 即java服务器端页面可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码用于简化书写!!! (2)原理 ...

  7. 我的敏捷、需求分析、UML、软件设计电子书 - 下载(持续更新中)

    我将所有我的电子书汇总在一起,方便大家下载!(持续更新) 文档保存在我的网站——软件知识原创基地上(www.umlonline.org),请放心下载. 1)软件设计是怎样炼成的?(2014-4-1 发 ...

  8. 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)

      邀请函: 尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实 ...

  9. 基于Qt的遥感图像处理软件设计总结

     开发工具 VS2008+Qt4.8.0+GDAL1.9  要点 接口要独立,软件平台与算法模块独立,平台中各接口设计灵活,修改时容易. 设计软件时一步步来,每个功能逐一实现,某个功能当比较独立时可以 ...

随机推荐

  1. CentOS 系统管理与yum软件仓库搭建

    重启 reboot shutdown -r now init 6 关闭 init 0 shutdown -h now shutdown -h 20:25 #8点25关机查看内存 free CPU利用率 ...

  2. angular 守卫路由

    import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; im ...

  3. Setting property 'source' to 'org.eclipse.jst.jee.server:web' did not find a matching property原因

    这个问题困扰了好久,虽然只是tomcat的一个警告,但强迫症让我总觉得不舒服,搜索了好多文章才找到知乎上一篇处理的最好的.另外:能找谷哥,尽量不要度娘,太浪费时间. 具体操作如下: 默认情况下,ser ...

  4. 基于matlab的FIR加窗滤波器设计

    1.确定参数: Wp 通带截止频率 Ws  阻带截止频率 As  衰减dB Rp   纹波dB 2.根据参数确定理想 频率响应 (M     (Wp + Ws )/2  ) 双边响应 3.选窗 过滤带 ...

  5. hadoop中常用的hdfs代码操作

    一:向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件: package hadoopTest; import org.apache.h ...

  6. [Swift]八大排序算法(七):归并排序

    排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...

  7. C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法

    本文实例讲述了C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法.分享给大家供大家参考.具体如下: 这个类不是我实现的,英文原文地址为http://www.egg ...

  8. SQLServer如何清除缓存?

    --1. 将当前数据库的全部脏页写入磁盘.“脏页”是已输入缓存区高速缓存且已修改但尚未写入磁盘的数据页. -- CHECKPOINT 可创建一个检查点,在该点保证全部脏页都已写入磁盘,从而在以后的恢复 ...

  9. mysql的时区错误问题,The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one

    在使用springboot整合ssm和druid的时候出现数据库一个问题 org.springframework.web.util.NestedServletException: Request pr ...

  10. Qt 学习之路 2(51):布尔表达式树模型

    Qt 学习之路 2(51):布尔表达式树模型 豆子 2013年5月15日 Qt 学习之路 2 17条评论 本章将会是自定义模型的最后一部分.原本打算结束这部分内容,不过实在不忍心放弃这个示例.来自于 ...