软件架构如下图所示:

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. LoadRunner监控Linux条件和解决方法

    注:内容来自网络 需要下载3个包: (1)rsh-0.17-14.i386.rpm (2)rsh-server-0.17-14.i386.rpm (3)rpc.rstatd-4.0.1.tar.gz ...

  2. Mysql初识数据库《三》数据库概述

    1 什么是数据(Data) 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机 在计算机中描述一个事物 ...

  3. Windows系统如何安装Redis?

    转自 http://blog.csdn.net/lamp_yang_3533/article/details/52024744   一.Redis的下载地址 Redis官方并没有提供Redis的win ...

  4. WKWebView 的使用和封装

    WKWebView 的使用和封装 前言 项目中有个新闻资讯模块展示公司和相关行业的最新动态. 这个部分基本是以展示网页为主,内部可能会有一些 native 和 JS 代码的交互. 因为是新项目,所以决 ...

  5. 用shell脚本安装apache

    我们首先创建一个文件为test.sh,执行此文件的方法有以下四种方式: 1../test.sh(必须chmod赋予执行权限) 2.. test.sh 3.sourse test.sh 4.[shell ...

  6. CentOS71611部署Django

    web.conf <VirtualHost *:> WSGIScriptAlias / /var/www/datacn/datacn/wsgi.py Alias /static/ /var ...

  7. ajax(Asynchronous JavaScript and XML) 异步js或者xml

    1.XMLHttpRequest 对象:向服务器发送局部的请求,异步获取执行 a.浏览器支持 b.语法: xmlhttp==new XMLHttpRequest(); xmlhttp.open(&qu ...

  8. C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析

    看到这篇文章的题目,估计很多人都会问,这个组件是不是有些显的无聊了,说到web通信,很多人都会想到ASP.NET SignalR,或者Nodejs等等,实现web的网络实时通讯.有关于web实时通信的 ...

  9. jeesite 的提示消息图标

    jeesite  的提示消息图标 jeesite 框架的提示信息 保存数据时 总是显示一个叉子图标 不符合要求 原因: 不加成功两字:如下 后来大神说 保存数据提示语句必须加“”“成功” 才会出现正确 ...

  10. prcharm 注册码

    JetBrains全系列在线激活中心 使用方法: 1. 点击Help,选择Register.打开注册页面. 2. 选择License server, 在License server address 中 ...