软件架构如下图所示:

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. Ext.Net安装和应用

    1.最新版本 2.打开文件,将包含以下文件:   Ext.Net.dll  Ext.Net.Utilities.dll  Ext.Net.xml  Newtonsoft.Json.dll  Newto ...

  2. iOS开发系统类功能划分

    0.OC语法基础 CHOCBase Object C语法学习笔记(一) Object C语法学习笔记(二) 1.UI类 自定义控件程序运行流程 setNeedsLayOut和setNeedsDispl ...

  3. 3月份GitHub上最热门的Java开源项目

    今天,我们来盘点3月份GitHub上最热门的Java项目的时候了,如果你每月都有关注猿妹发布的排行榜,那么本月的Java项目对你来说一定不陌生,这些都是曾经多次出现在榜单中的项目: 1 advance ...

  4. 在libuv中使用openssl建立ssl连接

    在libuv中使用openssl建立ssl连接 @(blogs) 使用openssl进行加密通信时,通常是先建立socket连接,然后使用SSL_XXX系列函数在普通socket之上建立安全连接,然后 ...

  5. CoreML的学习

    在苹果官网下载模型model 链接: https://developer.apple.com/machine-learning/

  6. SpringBoot 入门 Demo

    SpringBoot   入门 Demo Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从 ...

  7. linux下的小命令

    (1) 查看服务器的IP信息 ip add show ifconfig (2) 操作网卡命令(重启网络和启用网卡) cleasystemctl restart network systemctl st ...

  8. tornado 11 异步编程

    tornado 11 异步编程 一.同步与异步 同步 #含义:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系 #现象:有一个共同的时钟,按来的顺序一个一个处理 #直观感受:需要等待,效率 ...

  9. 蓝桥-青蛙跳杯子(bfs)

    问题描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...

  10. Python-list()之remove()/pop() I /del()

    代码块 remove #remove删除首个符合条件的元素,并不删除特定的索引. n =[1,2,2,3,4,5] n.remove(3) print (n) #输出 [1, 2, 2, 4, 5] ...