软件架构如下图所示:

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. keepalive学习之软件设计

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

  2. Nginx学习之keepalive

    当然,在nginx中,对于http1.0与http1.1也是支持长连接的.什么是长连接呢?我们知道,http请求是基于TCP协议之上的,那么,当客户端在发起请求前,需要先与服务端建立TCP连接,而每一 ...

  3. Openstack学习目录

    1.2016.12.27    ceph简介   crush算法    OSD(boject storage device)   Mds(cephfs) 使用cephfs时需要安装metadata s ...

  4. redis——学习之路五(简单的C#使用redis)

    redis官方推荐使用的客户端程序 打星星表示推荐使用的客户端程序,一个笑脸表示最近6个月内有过正式活动的.http://redis.io/clients/#c 从这里我们可以判断官方推荐我们使用Se ...

  5. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用:

  6. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  7. 两千行PHP学习笔记

    亲们,如约而至的PHP笔记来啦~绝对干货! 以下为我以前学PHP时做的笔记,时不时的也会添加一些基础知识点进去,有时还翻出来查查. MySQL笔记:一千行MySQL学习笔记http://www.cnb ...

  8. 大前端学习笔记整理【七】HTTP协议以及http与https的区别

    前言 还是老样子,新博客开始前总是想先啰嗦几句...HTTP协议其实在当初学习java时老师就有提过...但是...反正就那么过去了... 这段时间公司的项目正好要求做https的转换和迁移,然后自己 ...

  9. 快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础

    上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是W ...

随机推荐

  1. Linux访问Windows共享文件夹 (转)

    在开发Linux程序中,经常会使用Windows的编辑器进行编辑,这样还要拷贝到Linux服务器,如果有这种开发习惯的同学,可以使用这种方式进行开发. 当然除了这种方法之外,可以再Windows安装n ...

  2. My97DatePicker日历控件日报、每周和每月的选择

    My97DatePicker日历控件日报.每周和每月的选择 1.设计源代码 <%@ page language="java" import="java.util.* ...

  3. 为什么解析 array_column不可用,

    不久前,自己在一个小项目,我要拿出每个元素的一维数组key的值,一维阵列的形成,突然想到php 有一种功能,实现. $array = array ( array ( "id" =& ...

  4. bigdata_hadoop集群配置_内存分配

    haoop集群  做好内存管理跟重要,不然经常会给抛出个 OutMemory   ,内存溢出 以horntonworks给出推荐配置为样本,给出一种常见的Hadoop集群上各组件的内存分配方案.配置时 ...

  5. js 正则学习小记之匹配字符串优化篇

    原文:js 正则学习小记之匹配字符串优化篇 昨天在<js 正则学习小记之匹配字符串>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯 ...

  6. windows已安装solr

    下载地址:http://archive.apache.org/dist/lucene/solr/ 操作环境:  Win7,Tomcat6, Solr4.3, Jdk6 下载solr4.3的包,解压到本 ...

  7. HDU 2841 Visible Trees(数论)

    标题效果:给你个m*n方格,广场格从(1,1)开始. 在树中的每个点,然后让你(0,0)点往下看,问:你能看到几棵树. 解题思路:假设你的视线被后面的树和挡住的话以后在这条线上的树你是都看不见的啊.挡 ...

  8. c++的vector容器

    c++还有一个很常用的容器就是vector容器,他是数组实现的,是一种可变长的容器,在很多的时候可以简化我们的编程.可学习的链接:http://www.cnblogs.com/mr-wid/archi ...

  9. 经典算法题每日演练——第十四题 Prim算法

    原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...

  10. windows编ffmpeg2.2.4和插件h265

    0.前言 据说新出来了h265的视频,在迅雷看看上面看到的.网上查看了一下简单介绍,貌似h265的视频比h264的视频压缩率要高.并且能做4K的视频. 同一时候看到网上有人试过ffmpeg在编译的时候 ...