心跳检测(应用Boost库)_第1页
心跳检测(应用Boost库)_第2页
心跳检测(应用Boost库)_第3页
心跳检测(应用Boost库)_第4页
心跳检测(应用Boost库)_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业设计毕业设计 论文论文 题题 目目 学院名称学院名称 计算机科学与技术学院计算机科学与技术学院 指导教师指导教师 职职 称称 班班 级级 本本 0707 计算机计算机 0101 班班 学学 号号 学生姓名学生姓名 目目 录录 摘摘 要要 随着 Internet 快速发展 大量的 P2P 出现给人们的生活交流带来许多便 利 然而由于人们需求的不断提高 对于 P2P 系统的可靠安全行性 同时也提 出了新的要求 对于覆盖世界的网络中 随时都有可能出现故障 对于研究者 希望 P2P 系统有自动检测到故障的原因自动修复的功能 在这方面许多人都在 不断的进行研究实验 本文研究的主要方面是 P2P 存储系统与故障维护中的心跳检测技术 心跳 检测技术是一种检测网络连接故障的技术 根据服务端和客户端各自的心跳检 测软件 相互之间发送消息即心跳报文来检测故障 判断网络连接是否正常 系统是否工作 这篇论文设计了一个能管理几百个外围节点的心跳检测系统 该系统是在 Linux 操作系统下 采用的 TCP UDP 协议 以 C S 模式 应用 Boost 库 以 C 语言进行开发的 服务端为主控节点 客户端为外围节点 通 过客户端发送心跳报文的方法来实现心跳检测 关键词 P2P 心跳检测 Boost Linux ABSTRACT Along with the Internet fast development massive P2P appears for people s life exchange brings many conveniences However as a result of the people demand s unceasing enhancement regarding the P2P system s reliable security line simultaneously also set the new request Regarding in the cover world s network It has the possibility to present the breakdown Regarding the researcher hoped that the P2P system has the automatic detection breakdown reason and the automatic repair function In this aspect many people are researching This paper mainly researches the heart beat technology of P2P memory system and failure detection Heat beat technology is the technology that it detects network fault as sending messages between server and client And it can estimate whether the network and P2P system are working naturally The paper introduces the P2P system can manage hundreds of the client nodes The system designs in the Linux platform using TCP UDP protocol Boost libraries C language and on the basis of C S model Server acts as the master node the client acts as the external nodes through the heart beat messages sent by the client to achieve the heart beat detection methods 引引 言言 随着网络技术的快速发展 网络拉近人们之间的距离 于此同时大量的基 于网络的系统也不断的出现 在网络这个庞大的系统中 有成千上万的节点接 入到网络中共享资源信息 对于这些成千上万节点靠我们人力管理是很难的 并且会经常的出现故障 这时我们需要系统自动的检测出网络中的故障所在 所以负责检测故障的心态检测技术就应运而生 在 P2P 存储系统与故障修复中的心跳检测技术是基于 C S 架构开发的网络 检测系统 对于各类应用 P2P 软件 心跳检测技术是必不可少的一部分 P2P 存储系统与故障修复是一个很庞大的部分 里面涉及到许多的算法 本论文对 于故障修复进行详细的研究 仅仅是检测到那个节点发生了故障 没有正常连 接到 P2P 系统中 以后随着这方面研究的深入 也许 P2P 系统检测与故障修复 也会趋近于完善 本人通过查找大量的资料对于心跳检测原理有一些了解 结合一些 Linux 网络编程的知识 为了能跨平台移植应用了 Boost 库开发 文章中对于设计的 思想 和技术原理都进行了详细的描述 第一章第一章 绪论绪论 1 11 1 心跳检测机制心跳检测机制 在 P2P 系统中有成千上万个节点接入到系统中 这些节点随时都有可以发 生故障 有可能是硬件故障 也可能是软件故障 导致客户节点无法正常接入 到系统中 系统将无法得到本地系统的资源 甚至导致部分系统瘫痪 为了确保 整个系统正常的工作 主控节点应该可以随时的知道其他节点当前是否正常工 作 如果靠人力来监督这件事件是很难办到的 并且会造成很大的经济开销 而且响应时间较慢 心跳检测系统可以节省人力和经济 它根据外围节点定期 发送的报文来判断和网络连接是否出现故障 心跳检测技术是 P2P 系统中常见的故障检测方法 在心跳检测技术的原理 是外围节点定期的向主控节点发送心跳报文 主控节点定期的检测是否接收到 外围节点发送的报文 主控节点定期时间段大于外围节点时间段 主控节点没 有接收到响应节点的心跳报文 则认为此节点或者相关的网络出现故障 并向 管理者报告 特点 1 基于 C S 模式 半结构化的 P2P 存储系统中 服务端判断客 户端是否正常运行 一般采用定时发送简单的心跳检测报文 如果在定期内没 有收到节点的相应报文 则判断网络出现故障 同时也可以用 ping 方法来检测 网络是否连接正常 但是此方法不能够判断出系统崩溃等其他情况 2 发送报文方可以是客户端 外围节点 也可以是服务端 主控节点 这方面设计是很宽松的 看你实际的需要 本人采用的是客户端发送报文 服务端不给予回复 服务端只是定期的检查是否接收到报文 3 检测方法是客户端 外围节点 每隔几秒发送心跳报文给服务端 主控节点 服务端仅仅是检测报文是否存在 不回复给客户端 外围节点 如果服务端在规定时间内没有收到客户端信息视为连接中断 4 心跳检测模块 可以是挂接在系统中 当需要修改时 可以将其修 改在挂接到系统中 1 21 2 本文设计的本文设计的 P2PP2P 存储系统与故障检测模块存储系统与故障检测模块 前面也介绍了心跳检测系统的概念 特点 原理 作用 下面我来介绍我 所设计的系统 该系统主要是管理几百个外围节点 主要相关的网络编程的知 识 没有数据库存储的相关知识 因此该系统所占用的内存空间较少 还有本 系统主要是应用在局域网中 实现起来的网络连接是比较简单的 测试起来相 对容易一些 本系统实现了比较基础的功能 对于 P2P 存储系统与故障检测来 说 还有许多功能没有完善的实现 例如 当主控节点发现外围节点出现故障 现在假如主控节点为 P2P 半结构系统中的顶层节点 外围节点为超级管理节点 下面还有客户节点 当顶层节点检测到超级管理节点发生故障时 怎样才能其 他节点中选择出 网络连接很好 节点不容易出现故障的节点 作为超级管理 节点 这里就不但要检测故障 还要对故障进行修复 这需要很多的评估算法 和策略 这也是一些研究者的研究方向 还有物理空间和虚拟空间之间的差距 网络延迟等问题 对于这些方面我进行深入的研究和涉及 这些还需要更多的 时间去研究 实验 实现 本人的设计在 Linux 平台下 采用 C S 模式 应用 Boost 库 用 C 语言实 现 服务端充当主控节点 客户端充当外围节点 外围节点先发送 TCP 报文和 主控节点建立连接 连接成功后 将外围节点的信息保存在主控节点中 外围 节点向主控节点发送报文采用 UDP 协议 每隔 1 秒外围节点向主控节点发送一 次心跳报文 主控节点每隔 8 秒检测一下是否有相应节点的心跳报文 根据节 点心跳报文的有无来确定网络连接是否正常 1 31 3 本章小结本章小结 本章介绍了 P2P 存储系统中的心跳检测技术 介绍了心跳检测的概念 心 跳检测的原理 优点 使人们有了一个大致的了解 最后介绍了我自己设计的 故障检测系统的概况 包括其优缺点和实现情况 第二章第二章 开发环境 工具和技术开发环境 工具和技术 2 12 1 LinuxLinux 的介绍的介绍 Linux 是一套免费使用和自由传播的类 Unix 操作系统 它主要用于基于 Intel x86 系列 CPU 的计算机上 这个系统是由全世界各地的成千上万的程序员 设计和实现的 其目的是建立不受任何商品化软件的版权制约的 全世界都能 自由使用的 Unix 兼容产品 Linux 的出现 最早开始于一位名叫 Linus Torvalds 的计算机业余爱好者 当时他是芬兰赫尔辛基大学的学生 他的目的是想设计一个代替 Minix 是由一 位名叫 Andrew Tannebaum 的计算机教授编写的一个操作系统示教程序 的操 作系统 这个操作系统可用于 386 486 或奔腾处理器的个人计算机上 并且具 有 Unix 操作系统的全部功能 因而开始了 Linux 雏形的设计 Linux 以它的高效性和灵活性著称 它能够在 PC 计算机上实现全部的 Unix 特性 具有多任务 多用户的能力 Linux 是在 GNU 公共许可权限下免费获得 的 是一个符合 POSIX 标准的操作系统 Linux 操作系统软件包不仅包括完整的 Linux 操作系统 而且还包括了文本编辑器 高级语言编译器等应用软件 它还 包括带有多个窗口管理器的 X Windows 图形用户界面 如同我们使用 Windows NT 一样 允许我们使用窗口 图标和菜单对系统进行操作 Linux 之所以受到广大计算机爱好者的喜爱 主要原因有两个 一是它属于 自由软件 用户不用支付任何费用就可以获得它和它的源代码 并且可以根据 自己的需要对它进行必要的修改 无偿对它使用 无约束地继续传播 另一个 原因是 它具有 Unix 的全部功能 任何使用 Unix 操作系统或想要学习 Unix 操 作系统的人都可以从 Linux 中获益 Linux 的优点 1 低廉性 基于其低廉成本与高度可设定性 Linux 常常被应用于嵌入 式系统中 例如 机顶盒 移动电话 及行动装置等等 在移动电话上 Linux 已经成为与 SymbianOS Windows Mobile 系统并列的三大智能手机操作系统之 一 例如 谷歌开发的 Android 手机操作系统 2 广泛性 基于 Linux 的开源性给人们带来了巨大的诱惑 Linux 的应 用越来越广 学习 Linux 系统的人也越来越多 在学习的同时也可以参与到 Linux 系统的开发中去 3 安全性 不过 Linux 由于支持者众多 有相当多的热心团体 个人参 与开发 因此可以随时获得最新的安全信息 并随时更新 相对较安全 4 稳定性 Linux 是基于 UNIX 概念而开发出来的操作系统 具有与 UNIX 系统相似的程序接口和操作方式 继承了 UNIX 稳定且有效率的特点 安 装 Linux 操作系统的主机连续运行 1 年以上不曾死机 不必关机是很平常的事 本人所用的 Linux 操作系统是 Ubuntu 11 4 版本 这个系统界面设计也是比 较新颖 功能比较强大 对于软件开发人员来说初步了解 Linux 这个系统很有 效果 如下图 图 2 1 2 22 2 GCCGCC 的简介的简介 2 2 12 2 1 GCCGCC 的介绍的介绍 GCC GNU Compiler Collection GNU 编译器套装 是一套由 GNU 开发的 编程语言编译器 以 GPL 及 LGPL 许可证所发行的自由软件 也是 GNU 计划的关键部分 亦是自由的类 Unix 及苹果电脑 Mac OS X 操作系统的标准编译器 GCC 原名为 GNU C 语言编译器 因为它原本只能处理 C 语言 GCC 很快 地扩展 变得可处理 C 之后也变得可处理 Fortran Pascal Objective C Java 以及 Ada 与其他语言 使用 GCC 编译程序时 编译过程可以被细分为 四个阶段 预处理 Pre Processing 编译 Compiling 汇编 Assembling 链接 Linking 如今的 GCC 借助于它的特性 可以交叉编译 即在一个平台下编程 另一个平台的代码 GCC 是完全免费的自由软件 加之其强大的功能所以深受 广大用户的喜爱 2 2 22 2 2 GCCGCC 的基本规则的基本规则 GCC 编译器能将 C C 语言源程序 汇程式化序和目标程序编译 连接成 可执行文件 如果没有给出可执行文件的名字 GCC 将生成一个名为 a out 的文 件 在 Linux 系统中 可执行文件没有统一的后缀 系统从文件的属性来区分 可执行文件和不可执行文件 而 GCC 则通过后缀来区别输入文件的类别 下面 我们来介绍 GCC 所遵循的部分约定规则 c 为后缀的文件 C 语言源代码文件 a 为后缀的文件 是由目标文件构成的档案库文件 C cc 或 cpp 为后缀的文件 是 C 源代码文件 h 为后缀的文件 是程序所包含的头文件 i 为后缀的文件 是已经预处理过的 C 源代码文件 ii 为后缀的文件 是已经预处理过的 C 源代码文件 m 为后缀的文件 是 Objective C 源代码文件 o 为后缀的文件 是编译后的目标文件 s 为后缀的文件 是汇编语言源代码文件 S 为后缀的文件 是经过预编译的汇编语言源代码文件 2 2 32 2 3 GCCGCC 的执行过程的执行过程 虽然我们称 GCC 是 C 语言的编译器 但使用 gcc 由 C 语言源代码文件生成 可执行文件的过程不仅仅是编译的过程 而是要经历四个相互关联的步骤 预 处理 也称 预编译 Preprocessing 编译 Compilation 汇编 Assembly 和连接 Linking 命令 GCC 首先调用 cpp 进行预处理 在预处理过程中 对源代码文件中的 文件包含 include 预编译语句 如宏定义 define 等 进行分析 接着调 用 cc1 进 行编译 这个阶段根据输入文件生成以 o 为后缀的目标文件 汇编过程是针对 汇编语言的步骤 调用 as 进行工作 一般来讲 S 为后缀的汇编语言 源代码 文件和汇编 s 为后缀的汇编语言文件经过预编译和汇编之后都生成以 o 为后 缀的目标文件 当所有的目标文件都生成之后 GCC 就调用 ld 来完成最 后的 关键性工作 这个阶段就是连接 在连接阶段 所有的目标文件被安排在可执 行程序中的恰当的位置 同时 该程序所调用到的库函数也从各自所在的档案 库中 连到合适的地方 2 2 42 2 4 GCCGCC 的基本用法和选项的基本用法和选项 在使用 GCC 编译器的时候 我们必须给出一系列必要的调用参数和文件名 称 gcc 编译器的调用参数大约有 100 多个 其中多数参数我们可能根本就用不 到 这里只介绍其中最基本 最常用的参数 GCC 最基本的用法是 gcc options filenames 其中 options 就是编译器所需要的参数 filenames 给出相关的文件名称 其中 options 的值可以为下列值 c 只编译 不连接成为可执行文件 编译器只是由输入的 c 等源代码文 件生成 o 为后缀的目标文件 通常用于编译不包含主程序的子程序文件 o output filename 确定输出文件的名称为 output filename 同时这个名 称不能和源文件同名 如果不给出这个选项 gcc 就给出预设的可执行文件 a out g 产生符号调试工具 GNU 的 gdb 所必要的符号资讯 要想对源代码进行 调试 我们就必须加入这个选项 O 对程序进行优化编译 连接 采用这个选项 整个源代码会在编译 连接过程中进行优化处理 这样产生的可执行文件的执行效率可以提高 但是 编译 连接的速度就相应地要慢一些 O2 比 O 更好的优化编译 连接 当然整个编译 连接过程会更慢 Idirname 将 dirname 所指出的目录加入到程序头文件目录列表中 是在 预编译过程中使用的参数 C 程序中的头文件包含两种情况 A include B include myinc h 其 中 A 类使用尖括号 B 类使用双引号 对于 A 类 预处理 程序 cpp 在系统预设包含文件目录 如 usr include 中搜寻相应的文件 而对于 B 类 cpp 在当前目录中搜寻头文件 这个选项的作用是告诉 cpp 如果在当 前目录中没有找到需要的文件 就到指定的 dirname 目录中去寻找 在程序设 计中 如果我们需要的这种包含文件分 别分布在不同的目录中 就需要逐个使 用 I 选项给出搜索路径 Ldirname 将 dirname 所指出的目录加入到程序函数档案 库文件的目录 列表中 是在连接过程中使用的参数 在预设状态下 连接程序 ld 在系统的预 设路径中 如 usr lib 寻找所需要的档案库文件 这个选项 告诉连接程序 首先 到 L 指定的目录中去寻找 然后到系统预设路径中寻找 如果函数库存放在多 个目录下 就需要依次使用这个选项 给出相应的存放目录 lname 在连接时 装载名字为 libname a 的函数库 该函数库位于系 统预设的目录或者由 L 选项确定的目录下 例如 lm 表示连接名为 libm a 的数学函数库 2 32 3 BoostBoost 库的简介库的简介 2 3 12 3 1 BoostBoost 的介绍的介绍 Boost 库是为 C 语言标准库提供扩展的一些 C 程序库的总称 Boost 库由 Boost 社区组织开发 维护 其目的是为 C 程序员提供免费 同行审查的 可移植的程序库 Boost 库可以与 C 标准库完美共同工作 并且 为其提供扩展功能 Boost 库使用 Boost License 来授权使用 根据该协议 商 业的非商业的使用都是允许并鼓励的 Boost 社区建立的初衷之一就是为 C 的标准化工作提供可供参考的实现 Boost 社区的发起人 Dawes 本人就是 C 标准委员会的成员之一 在 Boost 库的 开发中 Boost 社区也在这个方向上取得了丰硕的成果 在送审的 C 标准库 TR1 中 有十个 Boost 库成为标准库的候选方案 在更新的 TR2 中 有更多的 Boost 库被加入到其中 从某种意义上来讲 Boost 库成为具有实践意义的准标 准库 大部分 boost 库功能的使用只需包括相应头文件即可 少数 如正则表达 式库 文件系统库等 需要链接库 里面有许多具有工业强度的库 如 graph 库 很多 Boost 中的库功能堪称对语言功能的扩展 其构造用尽精巧的手法 不要贸然的花费时间研读 Boost 另外一面 比如 Graph 这样的库则是具有工业 强度 结构良好 非常值得研读的精品代码 并且也可以放心的在产品代码中 多多利用 2 3 22 3 2 BoostBoost 库的编译方法库的编译方法 从 Boost 网站 www boost org 上下载 Boos 库文件 要编译 Boost 库 首 先要获得 bjam 文件 这个文件也可以从网站上直接下载编译好的 但是还是不 如自己编译的好 Boost 库具有可移植性 所以在不同的操作系统里编译方法略 有区别 在 Windows 下 运行 bootstrap bat 得到 bjam 文件 然后运行 bjam 文 件 在 Linux 下 运行 bootstrap sh 得到 bjam 文件 然后运行 bjam 文件 有的 书上介绍说 完全编译 Boost 很费时间 本人编译没有花费太多的时间 也可 以应用到哪个库编译那个库 2 3 32 3 3 本人所用到的本人所用到的 BoostBoost 库库 主要应用并发编程库 a Asio 库 基于操作系统提供的异步机制 采用前摄设计模式实现了可移 植的异步 IO 操作 b Interprocess 库 实现了可移植的进程间通信功能 包括共享内存 内存 映射文件 信号量 文件锁 消息队列等 c MPI 库 用于高性能的分布式并行开发 d Thread 库 为 C 增加线程处理能力 支持 Windows 和 POSIX 线程 涉及到 Boost 库 Bind 库 绑定器的泛化 已被收入 TR1 Date Time 库 一个非常全面灵活的日期时间库 Filesystem 库 可移植的文件系统操作库 可以跨平台操作目录 文件 已被 TR2 接受 System 库 使用轻量级的对象封装操作系统底层的错误代码和错误信息 已被 TR2 接受 2 42 4 运用到的网络编程技术运用到的网络编程技术 2 4 12 4 1 socketsocket 与与 asioasio 库介绍库介绍 在 Linux 系统中 最常用的网络应用编程结构是 UNIX BSD 的套接字接口 Socket 编程有字节流和数据报两种主要类型 分别对应 TCP 协议和 UDP 协议 其中字节流 socket 定义了一种可靠的面向连接的服务 实现了无差错无重复的 顺序数据传输 数据报 socket 定义了一种无连接的服务 数据通过相互独立的 报文进行传输 是无序的 并且无法保证可靠无差错 无连接服务器一般都是 面向事务处理的 一个请求一个应答即为客户和服务器之间的交互 asio 库它 使用了大量的类和函数封装了 socket API 提供了一个现代 C 风格的网络编程 接口 支持 TCP TCMP UDP 等网络通信协议 但 asio 的异步操作并不局限于 网络编程 它还支持串口读写 定时器 SSL 等功能 而且 asio 是一个很好的 富有弹性的框架 可以扩展到其他有异步操作的需要的领域 asio 中关于 TCP 协议的编程 1 io service ios asio 程序必须声明一个 io service 对象 2 ip tcp socket sock ios 创建一个 TCP 的 socket 对象 3 ip tcp endpoint ep ip address from string 127 0 0 1 6688 创建 连接端点 4 sock connect ep socket 连接到端点 asio 中关于 UDP 协议的编程 asio 中的 UDP 协议通信与 TCP 处理流程类似 但是因为 UDP 协议是无连 接的 所以不要建立连接 使用 send to 和 receive from 就可以直接通过端点 发送数据 服务端 1 ip udp socket sock ios ip udp endpoint ip udp v4 6699 创建一 个 UDP 的 socket 对象 2 char buf 1 一个临时用的缓冲区 3 ip udp endpoint ep 要接受连接的远程端点 4 system error code ec sock receive from buffer buf ep 0 ec 阻塞等待远程连接 连接的 端点 信息保存在 ep 对象中 客户端 1 ip udp endpoint send ep ip address from string 127 0 0 1 6699 连接端点 2 ip udp socket sock ios 创建 udp socket 对象 3 sock open ip udp v4 使用 ipv4 打开 socket 4 char buf 1 sock send to buffer buf send ep 向连接端点发送连接数据 IP 地址的获取与转换 1 ep address 获取端点 ep 的 IP 地址 2 ip address addr 声明一个 ip 地址对象 3 addr addr from string 127 0 0 1 从字符串产生 IP 地址 4 addr to string 将地址转为字符串 5 addr to v4 将 IP 转化 ipv4 的地址 6 addr to v6 将 IP 转化 ipv6 的地址 附加 线程创建函数 thread m th bind 运用 send to 函数去发送这个缓冲区内容 就是像神经冲动一样 定 时的给主控节点一个脉冲 相关编码如下 ip udp endpoint send ep char buf 1 sock send to buffer buf send ep 注 登录报文属于超级节点登录模块范围 所以这里没有介绍 3 3 23 3 2 心跳注册表的设计心跳注册表的设计 心跳注册表被设置成一个动态的全局的向里 vector 当主控节点接收到外 围节点登录报文 超级节点登录模块 将节点信息添加到登录注册表中 注 这部分不包括在心跳检测模块范围内 然后再将节点信息发送给心跳检测模块 这时心跳检测模块是以一个观察者是身份来监督这些外围节点是否正常运行 当心跳检测模块收到超级节点登录模块发送来的外围节点的信息 将节点信息 打包 结构体中 struct SuperNodeInf int notify type 标识符 1 代表在线 0 代表断线 1 代表已经退出登录 string s node ID ID 号时主键值是不可以改变的 unsigned long uip notify type值 1 代表节点正常工作 0 代表节点故障断线 1 代表节点正常退出 s node ID每一个节点都给非配一个 ID 号 它作为主键值是不可以改变的 uipuip 为节点的 ip 地址 表 3 1 然后再将节点信息加入向量中 vector v 中 主控节点对心跳注册表的具体操作如下 主控节点 图 3 5 3 3 33 3 3 主控节点和外围节点功能设计主控节点和外围节点功能设计 主控节点和外面节点的总结构如图 赋值 notify type 1 s node ID uip 都是由超 级节点管理模块给定 如 果这节点曾经在注册列表 中存在过就只改变 notify type 和 uip 地址 接收心跳报文并且获得发 送报文节点的 IP 地址 如 果节点的 notify type 为 1 则不改变 如果为 0 则将 值改变为 1 定期扫描心跳检测注册表 将节点 notify type 为 0 的 节点 ID 报告给超级节点管 理模块 心跳检测注册表 图 3 6 1 外围节点功能设计 外围节点的功能很简单是向主控节点发送心跳数据报 注 登录报文不在 这个模块内 它在整个客户端是是一个小的模块 所以它被设计成一个独立的 线程 算法也很简单 将缓冲区随机的内容每隔 1 秒发送给服务端就可以了 包含发送登录报文的外围节点流程图 图 3 7 创建心跳检测线程 其他处理 建立与主空节 点 TCP 连接 休眠 10 秒 向主控节点发送登录信 息 通过 UDP 协议发送心跳 报文 接收分配的 ID 号 休眠 1 秒 连接成功 下面画出的是包含登录报文的外围节点的时序图 图 3 8 2 主控节点功能设计 主控节点完成的功能比较复杂 包括接收外围节点的心跳报文 定期进行 性检查心跳注册表 通过两个线程实现这些功能 当注册的时候 与超级节点 登录模块 当检测出故障时候 与超级管理模块关系 有关节点信息和心跳检 测注册表数据结构设计如下 enum NotifyType 通知的类型 NOTIFY ADD 添加 NOTIFY REMOVE 移除 注 NotifyType 当超级节点登录模块传递登录节点信息时调用 struct SuperNodeInf int notify type 标识符 1 代表在线 0 代表断线 1 代表已经退出 登录 string s node ID ID 号时主键值是不可以改变的 unsigned long uip vector v 注 心跳检测注册表数据结构 主控节点程序启动后 首先初始化向量 vector v 因为节 点信息是通过超级节点管理模块传递给故障检测模块的 所以只是简单的将节 点的信息打包加入到注册链表中 并把节点状态的标识符 notify type 设置为 1 代表节点 节点在线 SuperNodeInf s s notify type 1 s s node ID nodes s uip uip 节点信息打包过程 v push back s 将节点信息加入心跳注册表 将建立 vector向量 将节点中的信息放在向量中 将服务端分 为两个线程 m th 用于定期检查 vector 中节点 Notify type 的值 为 1 将其改变为 0 为 0 则不改变 将其报告超级节点管理模块 休眠 1 秒在继续检测 O th 用于接收客户端发来的消息 如果有节点发来消息 将该在 vector 中 的 Notify type 的值改为 1 主线程的流程图 服务端流程图 主线程 N Y N Y 图 3 9 下面是 m th 线程中用于定期检测的函数实现代码 函数 MainThread 初始化 将节点信息添加到向量 vector v 将节点信息标识位 Notify type 1 主线程 m th 休眠 1 秒 Notify type 0 报告给超级节点管理模块 锁定互斥量 mu 将 Notify type 0 所有节点检测 完毕 作用 主线程用于检测 备注 每隔一段时间秒检测一下向量中到元素的 notify 是否有为 0 点 如果有报告超级节点管理模块 并且将 notify type 0 void HeatBeat MainThread try while true for int i 0 i v size i mutex scoped lock lock mu 互斥锁 if v i notify type 1 v i notify type 0 else cout 不存在 v i s node ID 此次为 报告给超级节点管理模块的一个接口 this thread sleep posix time seconds 8 catch std exception 注 这只是在应该给超级节点管理模块留接口的地方 只是输出处理一段 节点不存在的信息 还有一个关键的细节是互斥锁的问题 如果不加互斥锁的情况会出现下列 的问题 当主线程修改向量中某一元素的 notify type 值时候 也有可能接收心 跳检测线程也在修改这个元素的 notify type 值 这样会产生错误 所以这个地 方必须要加互斥锁 在操作系统中这是一个简单的写者写者问题 接收报文的流程图 接收报文线程 o th N Y N Y N Y 图 3 10 Socket 创建套接字 Recvfrom 接受客户端 数据包 应用 UDP 协议 提取客户端的 IP 地址 锁定互斥量 mu 将 Notify type 1 ip uip Notify type 0 完毕 Close 关闭套接字 下面是在接收心跳报文处理的函数 函数 OtherThread 作用 检测节点是否存在线程 备注 检测线程 当有节点发来消息到话将得到他们到 IP 地址将地址 检测向量中相应 IP 地址 Notify type 的值如果为 1 将不做改变 为 0 将变 为 1 void HeatBeat OtherThread io service ios ip udp socket sock ios ip udp endpoint ip udp v4 6890 while true char buf 1 unsigned long addr ip udp endpoint ep error code ec sock receive from buffer buf ep 0 ec if ec addr ep address to v4 to ulong for int i 0 i v size i if v i uip addr v i notify type 1 cout 存在 v i s node ID endl 结点存在就不无需想超 级节点管理模块报告 else continue 注 这里最主要的功能是当接收到某一个节点的心跳报文 要得到它的 IP 地址 将他的 IP 地址与心跳注册表中的 IP 地址进行比较将如果相同 则将这节 点中的状态设置为 1 主线程和定期检测心跳注册表线程关系图 图 3 11 主线程和定期检测心跳注册表线程之间的关系 只有对中间这个心跳检测 表的操作 它们的操作都是改写注册表中的 notify type 节点的状态位 Vector Notify type 检测线程 o th主线程 m th 3 43 4 本章小结本章小结 本章主要介绍了需求分析 概要设计 详细设计 本章的主要重点是在主 控节点和外围节点的功能实现实现上 又描述了本系统的用例图 在详细设计 里则是主控节点和外围节点的设计思路和执行算法上 需要注意一点是心跳报 文中没有实质的内容 而且通过获取 IP 地址来说确定谁发的心跳报文 但是在 这种情况下 会出现问题 咱们举例一下 当你的电脑上登录两个 QQ 时 它 们的 IP 地址是相同的 这样通过 IP 地址是无法将他们区分开来的 但是这里我 为什么这样做呢 是因为我们这里所做的超级节点心跳检测 对超级节点来说 是无法将两个客户端同时登录的 第四章第四章 心跳检测系统的实现心跳检测系统的实现 4 14 1 LinuxLinux 下的开发环境下的开发环境 前面的章节已经介绍了 GCC 的相关内容 该设计中有两个 cpp 文件 client cpp 和 s heat beat cpp 文件 分别是外围节点和主控节点的编码文件 然 后我们将这两个文件进行编译就生成了可执行文件 client 和 s heat beat 如下 图 图 4 1 在这个图片中我们可以看见一个 makefile 文件 这个文件是用来编译 client cpp 和 s heat beat cpp 时调用的 下面我们看一下 makefile 里的内容 如 下图 图 4 2 我们所用的是 GCC 中的 g 和 Boost 库 图中 BOOST LIB PATH usr local lib boost 因为要用到 Boost 库 所以这个地方给了 Boost 库的路径 图中下面的语句给出了文件所需用到的 Boost 库中的 libboost thread a 和 libboost system so 1 46 0 g s heat beat cpp o s heat beat 是编译 s heat beat cpp 文件 g client cpp o client 是编译 client cpp 文件 这样正确编译就可以生成可执行文件 s heat beat 和 client 注 这里需要特别的介绍一下我用的不是集成环境 而是把 Linux 下文本 文档 gredit 打造成集成环境 这个很简单就是把 gredit 按一些插件 就可以把 终端快速浏览等加入懂 gredit 中使它成为一个简单的集成环境 4 24 2 程序的实现程序的实现 4 2 14 2 1 外围节点的实现外围节点的实现 该设计中没有登录报文 登录报文这一块归超级节点登录模块 在超级节 点中登录报文和响应报文构成了握手过程 或者叫面向连接过程 主控节点会 分配给外围节点一个 ID 这个 ID 号用于心跳检测的时候 出现故障报告给超级 节点管理模块 外围节点的功能很少就只有发送心跳检测报文 每隔 1 秒它发 送一次心跳检测报文 1 时间问题的讨论 考虑心跳检测模块接收到超级节点管理模块传递的节点信息和第一个心跳 报文之间的时间间隔 如果超级节点管理模块在 t 时刻接收到登陆报文 将分 配外围节点相应的 ID 号 并设置 notify type 1 表示节点状态为在线 如果在 此过程结束后就执行定期检查线程 则将此 notify type 值设置为 0 如果在下 一次定期检查线程未执行之前还未收到心跳报文 则会导致心跳检测模块认为 节点故障处在断线状态 n 秒 t 第一个心跳报文必须在此区域内到达 a 得到节点信息和第一个心跳检测报文的时间间隔 图 4 3 考虑两个心跳报文之间的时间间隔 如果在 t 时刻主控节点接收到前一个 心跳报文 而随后执行定期检查线程 则后续心跳报文必须在下一次定期检查 线程之前到达 否则将导致定期检查线程判断连接中断 n 秒 t 后续心跳报文应该在此区间内到达 b 两个心跳报文的时间间隔 图 4 4 考虑发生故障时的最长发现时间 如果 t 时刻主控节点接收到最后一个心 跳报文 而定期检查线程刚刚在接收心跳报文之前执行 则需要执行两次定期 检查线程才能发现外围节点的故障 因此 最长发现时间为 2n 秒 接收节点 信息 定期检测 线程 定期检测 线程 前一个心 跳报文 定期检测 线程 定期检测 线程 n 秒 n 秒 notify type 1 notify type 0 发现故障 c 发现故障的最长时间 图 4 5 对于外围节点来说登录报文和心跳报文之间的时间间隔需要多少秒 n 秒 实际应用中设定 n 1 这对于广域网环境下的应用是不够的 解决办法 增加一个状态 设置 notify type 初始值为 10 在定期检查中 发现表项 notify type 0 则将 notify type 减 1 如果 notify type 为 0 认为外围节点故障 2 外围节点实现代码段 Client io service while true thread c th bind this thread sleep posix time seconds 5 cout 第 i 次 endl Client void start 定期检测 线程 最后一个 心跳报文 定期检测 线程 定期检测 线程 ip udp socket sock ios sock open ip udp v4 sock send to buffer buf send ep 最主要的是线程的休眠 this thread sleep posix time seconds 5 和发 送心跳报文 sock send to buffer buf send ep 4 2 24 2 2 主控节点设计主控节点设计 该设计中的主要功能都是有主控节点来完成的 因此 主控节点的设计显 得的尤为重要 主控节点完成的操作有两个线程完成 前面我已经详细的介绍 了 所以在这里不就不实现详细介绍了 主控节点有限状态机 接收到节点信息 定期检测线程发现错误 定期检测发现正常 接收到心跳报文 图 4 6 由于主控节点和外围节点之间的抖动和网络延迟难以确定 因此当心跳报 文之间的延迟超过 n 1 秒时主控节点就认为外围节点出现故障 而此时外围节 点并不了解控制主机已经将其设置为故障节点 还会继续向其发送心跳报文 解决方法 新加入一个报文 unconnect 该报文由主控节点通过 tcp 协议发送到 外围节点 通知外围节点重新登录 主控节点接收到心跳报文所对应的状态不 是 1 时 主控节点向对应 IP 地址的外围节点发送 unconnect 报文 外围节点在 接收到 unconnect 报文后 重新向主机发送登陆报文 并等待相应的响应报文 notify type 1 notify type 1 notify type 0 重新开始心跳检测过程 注 这就需要超级节点管理模块和超级节点故障修复 模块协调工作 主控节点函数实现与功能 void AcceptNotifycation int notify type const string 函数 AccpetNotiycation int notify type const string nodes unsigned long uip notiy type 操作标识符 NOTIFY ADD 代表添加 NOTIFY REMOVE 代表 删除 nodes 表示节点的 ID 号 uip 表示节点的 IP 地址 作用 往向量 v 里 添加 删除要检测的节点信息 备注 超级节点管理模块用来调用心跳检测到模块到接口 超级节点管理模块必须反复到调用才能节点信息打包存储在向量 v 中 void HeatBeat MainThread 函数 MainThread 作用 主线程用于检测 备注 每隔一段时间秒检测一下向量中到元素的 notify 是否有为 0 点 如果有报告超级节点管理模块 并且将 notify type 0 void HeatBeat OtherThread 函数 OtherThread 作用 检测节点是否存在线程 备注 检测线程 当有节点发来消息到话将得到他们到 IP 地址将地址 检测向量中相应 IP 地址 Notify type 的值如果为 1 将不做改变 为 0 将变 为 1 void HeatBeat SuperHeatBeat 函数 SuperHeatBeat 作用 创建主线程 MainThread 和检测线程 OtherThread 4 34 3 本章小结本章小结 本章主要是将心跳检测模块的设计和实现 这里最重要是主控节点的设计 还有就是关于报文之间时间的讨论 还有一些问题的解决方法 这些解决方法 我没有实现 是因为我们整个 scool 系统的整体的设计原因 把心跳检测模块隔 离出来了 作为一个观察者的身份 如果要像解决方法里实现 这需要超级节 点管理模块和超级节点心跳检测模块的配合 第五章第五章 模块测试模块测试 模块经过以上几个阶段的设计之后 进入模块设计的最后阶段 即模块测 试阶段 系统测试的任务是是发现并排除在分析 设计 编程各个阶段中产生 的各种类型的错误 以得到可运行的挂接模块 5 15 1 测试环境测试环境 本模块应该有两台以上的电脑 其中的一台电脑当主控节点 其他的分别 当外围节点 当主控节点启动时 将外围节点的 ID 号 IP 地址等信息加入到向 量里 然后打开外围节点程序进行运行 由于 Boost 库具有可移植性 为了方 便本人模块移植到 Windows 下来运行 首先进行的本机测试 然后进行的是局 域网内的测试 1 本机测试计算机环境 如图 CPUIntel 酷睿 i5 480 内存2G DDR3 硬盘500 操作系统Windows 7 表 5 1 2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论