第六章 网络通信

  Laxcus大数据管理系统网络建立在TCP/IP网络之上,从2.0版本开始,同时支持IPv4和IPv6两种网络地址。网络通信是Laxcus体系里最基础和重要的一环,为了能够利用有限的网络资源,获得最大化的使用效率,我们根据大数据网络环境的特点,设计了一套专属网络通信协议,以及在此协议基础上实现的多套网络通信方案,它们共同组成了Laxcus集群的网络通信基础。本章将以TCP/IP协议为起点,介绍与网络通信有关的各个组成部分。

6.1 FIXP协议

  Laxcus采用FIXP协议通信。FIXP协议全称是“自由信息交换协议(Free Information  eXchange Protocol)”协议。这是一套建立在TCP/IP协议之上的二进制应用层通信协议,二进制字序采用小头编码(Little  Endian),协议具有平台独立、上下文无关、结构简单、数据尺寸小等特点。

6.1.1 协议结构

  如图6.1所示,协议结构布局按排列顺序由三部分组成:命令、消息、数据实体。命令分为两种:请求和应答,命令的作用是说明本次通信的基本属性。每次通信由发起方发送请求命令,受理方返回应答命令。消息在命令之后出现,消息在一次通信协议中允许出现任意多个,消息中携带本次通信需要的多类附属信息。消息之间是衔接的,彼此无分隔标记,通过消息头中的标记长度加以区别。在最后面是数据实体部分,数据实体包含本次通信所要传递的内容。这些内容可以是任意格式的,如音频、图像、数据库数据、各种元数据等。数据实体是一个可选部分,是否存在会在消息中注明。比如通信发起方通常是不需要传递数据实体的。

图6.1 FIXP协议结构

6.1.2 命令结构

  如图6.2,命令是一个56位(7字节)的数字序列。第一个8位的标识的作用是区分当前是请求命令或者应答命令。之后的协议版本号占用16位,协议版本号是可变的,不同的协议版本号代表不同的协议格式,在应用中分别有不同的解释。目前协议的最新版本号是256(0x100)。 命令的主要区别在第24至40位,请求命令需要提供两个8位的主命令和从命令,说明本次操作的作用目标,应答命令返回一个16位的应答码,确认本次请求是接受、还是因为其它原因拒绝。最后是16位的消息成员数,理论上,一次FIXP通信最多可以携带65535个消息。

图6.2 命令(请求/应答)结构

6.1.3 消息结构

  如图6.3,消息是一个不定长的数据结构,由键、类型、参数长度、参数组成。键占用16位,每个键都有一个固定的定义,键理论上有65536个,目前已经使用了大约100个。类型占用4位,说明后续的参数属性,包括布尔、短整数、整型、长整型,单浮点、双浮点、二进制数组、字符串、压缩二进制数组、压缩字符串。参数长度是一个12位的值,参数的实际尺寸由参数长度说明。需要特别指出的是,数值型参数具有字长压缩能力,例如一个整型数0x20,按照计算机字长标准需要占用4个字节,但是实际尺寸只有1个字节。这时参数长度会说明为1,忽略前面3个0。如本章开篇所述,数值型参数遵循小字头格式(Little Endian)。

图6.3 消息结构

6.2 通信方案

  我们在FIXP协议基础上提供了四种通信方案。这些通信方案将根据所在环境条件和任务的不同需求,实现有区别的通信,以达到节约网络流量,降低运行负载,提高计算效率的目的。

6.2.1 TCP通信

  TCP通信建立在TCP/IP协议的TCP堆栈之上,主要用来处理持续性高的、流量大的数据传输。如数据块的分发,以及Diffuse/Converge分布计算传递的数据等。在Laxcus集群中,它们是主要的通信流量,占用了大量的网络带宽,严重的时候会发生网络阻塞,影响到集群正常运行。为了避免这种现象,TCP通信会受到流量控制机制的限制,通过采用降低数据传输流量的办法,腾出一部分网络带宽,来保证其它通信业务的数据传输和集群的稳定运行。

6.2.2 UDP通信

  UDP通信建立在TCP/IP协议的UDP堆栈之上,主要针对于非持续、可靠性不高、流量小的数据传输。在Laxcus集群中,基于UDP传输的FIXP协议包,数据尺寸普遍介于20至300字节之间,小于一个IP包的最大传输单元(MTU),其中以网络监控包为主,测试节点状态的心跳包是最常用一种。目前UDP通信是Laxcus集群使用频率最高的通信方案。

6.2.3 KEEP UDP通信

  UDP的优点在于对计算机的资源占用率低,缺点是数据通信不稳定,存在丢包现象。TCP恰恰相反,可以提供稳定的数据通信通道,但是对TCP/IP堆栈的资源占用率高。在Laxcus集群里,存在着大量即需要保持稳定通信,又希望采用UDP的网络通信业务。如何在拥有二者优点的情况下又避免它们的缺点,答案就是“KEEP UDP(可持续的包通信)”。KEEP UDP是我们在TCP和UDP之间,为Laxcus集群网络通信设计的一种过渡方案,通过在UDP基础上模拟TCP通信过程,为UDP数据提供稳定的通信保证。这个方案的实质就是将原来在TCP/IP堆栈上进行的包的分组和重组的工作,转移到Laxcus控制的工作线程上去执行。在减轻TCP/IP堆栈压力的同时,还能够根据当时需求,自由定义一些对包的特殊规则。目前KEEP UDP主要用来执行RPC处理和传输网络日志,这些都是数据流量不大但是要求可靠传输的通信业务。

6.2.4 RPC通信

  RPC(远程进程调用)的出现由来以久,是一种非常优秀的网络通信方案,至今仍在被广泛使用。它通过隐藏网络两端通信的方式,使网络上两台计算机之间进行的网络调用类似本地API调用的过程。这样就极大地简化了程序员对网络编程的难度,提高了工作效率,减少了出错的机会。

  Laxcus包含了对RPC的实现,它的通信建立在TCP和KEEP UDP通信基础之上,通过在本地嵌入接口和对程序员屏蔽网络流程,实现RPC调用处理。目前Laxcus集群里许多复杂的、安全度高的网络通信都是采用 RPC方案执行。

6.3 通信检测

  集群运行过程中,发生的很多故障都与网络和网络设备有关。根据统计,这些故障大致包括:线路损坏、插口松动、电磁影响、网络阻塞、网络设备损坏。其中有些是硬件故障,有些是暂时性的网络故障。判断故障的有效手段是通过发送ICMP包来检测网络可达。这项测试可以由单机处理,必要时需要多个节点对一个地址共同测试,然后汇总测试结果得出答案。系统将判断故障是暂时性的网络问题或是不可恢复的物理故障。如果问题严重,将报告给系统管理员,通过人工处理来解决故障问题。通信检测在所有节点都会执行,是体现集群弱中心化和自维持能力的必要手段。

6.4 通信服务器

  如1.3节所述,通信服务器是节点管理下的一个工作模块,采用FIXP协议通信。通信服务器在启动时分别绑定TCP/UDP两个模式的监听套接字(SOCKET),套接字参数在配置文件中定义。根据系统的规定,工作节点的套接字地址在启动时由系统随机选择,管理节点的套接字必须有固定的IP地址和端口。因为只有管理节点的地址固定,工作节点才能够在网络上找到管理节点。通信服务器不主动发起通信工作,只接收外部发来的命令。在收到命令后,分派给下属的任务线程完成具体的任务处理。通信服务器还承担网络通信安全的职能,确保通信过程中,网络两端传输的数据是正确和可信任的。通信服务器的安全管理是一个可选项,是否使用由用户决定,在配置文件中设置。

6.5 全局时间

  在网络通信过程中,为了能够辨别各节点之间数据处理的先后顺序,需要一个统一的参数来标识它们当时所处的位置。这个参数被称为全局时间,也称为主时钟或者时间轴。全局时间以集群中Top Master状态节点的操作系统时间为标准,其它所有节点必须遵从这个时间定义,与Top Master节点保持一致。全局时间在节点启动时向所属上级管理节点申请和获取,在本地操作系统上设置,误差要求不超过1秒。全局时间目前已经使用在网络日志、网络计算,以及主块冲突、数据冗灾处理中。

6.6 流量控制

  在造成集群运行不稳定的因素中,有相当大一部分原因是网络传输流量过大所致,如果可以控制每项数据业务的通信流量,让它们以公平和合理的速率传输数据,对于改善集群运行的不稳定状况,将有很大促进作用。Laxcus采用“等/停传输机制”来控制每项工作的网络传输速率,这是一项TCP/IP应用层的技术,是“Invoke/Produce”任务调度模型的一部分,具有实时判断网络流量和错误重传的能力。可以根据当时的网络状况,选择合适的传输速率去传输数据,如果丢包率增加,表明当前网络负载过重,就会延迟数据发送间隔。流量控制对上层是透明的,不用对它做任何管理控制措施。目前Laxcus集群所有数据处理业务中,网络通信都默认使用“等/停传输机制”。根据我们对各种数据流量的检测显示,当网络通信启用“等/停传输机制”后,网络传输速率是未启用前的70% - 84%左右,但是网络在面对重负载的数据通信时,它的适应能力增强了。所以,总体而言,这对提高系统稳定性是有利的。

Laxcus大数据管理系统2.0(8)- 第六章 网络通信的更多相关文章

  1. Laxcus大数据管理系统2.0(5)- 第二章 数据组织

    第二章 数据组织 在数据的组织结构设计上,Laxcus严格遵循数据和数据描述分离的原则,这个理念与关系数据库完全一致.在此基础上,为了保证大规模数据存取和计算的需要,我们设计了大量新的数据处理技术.同 ...

  2. Laxcus大数据管理系统2.0(9)- 第七章 分布任务组件

    第七章 分布任务组件 Laxcus 2.0版本的分布任务组件,是在1.x版本的基础上,重新整合中间件和分布计算技术,按照新增加的功能,设计的一套新的.分布状态下运行的数据计算组件和数据构建组件,以及依 ...

  3. Laxcus大数据管理系统2.0(10)- 第八章 安全

    第八章 安全 由于安全问题对大数据系统乃至当前社会的重要性,我们在Laxcus 2.0版本实现了全体系的安全管理策略.同时我们也考虑到系统的不同环节对安全管理的需求是不一样的,所以有选择地做了不同的安 ...

  4. Laxcus大数据管理系统2.0(3)- 第一章 基础概述 1.2 产品特点

    1.2 产品特点 Laxcus大数据管理系统运行在计算机集群上,特别强调软件对分布资源可随机增减的适应性.这种运行过程中数据动态波动和需要瞬时感知的特点,完全不同与传统的集中处理模式.这个特性衍生出一 ...

  5. Laxcus大数据管理系统2.0 (1) - 摘要和目录

    Laxcus大数据管理系统 (version 2.0) Laxcus大数据实验室 摘要 Laxcus是Laxcus大数据实验室全体系全功能设计研发的多用户多集群大数据管理系统,支持一到百万台级节点,提 ...

  6. Laxcus大数据管理系统2.0(6)- 第四章 数据计算

    第四章 数据计算 Laxcus所有数据计算工作都是通过网络实施.相较于集中计算,在网络间进行的数据计算更适合处理那些数据量大.复杂的.耗时长的计算任务.能够实施网络计算的前提是数据可以被分割,就是把一 ...

  7. Laxcus大数据管理系统2.0(14)- 后记

    后记 Laxcus最早源于一个失败的搜索引擎项目,项目最后虽然终止了,但是项目中的部分技术,包括FIXP协议.Diffuse/Converge算法.以及很多新的数据处理理念却得以保留下来,这些成为后来 ...

  8. Laxcus大数据管理系统2.0(12)- 第十章 运行

    第十章 运行 本章将介绍一些Laxcus集群基本运行.使用情况,结合图片和表格表示.地点是我们的大数据实验室,使用我们的实验集群.数据来自于我们的合作伙伴,软件平台混合了Windows和Fedora  ...

  9. Laxcus大数据管理系统2.0(11)- 第九章 容错

    第九章 容错 在当前,由于集群庞大的组织体系和复杂性,以及用户普遍要求低成本硬件,使得集群在运行过程中发生的错误概率,远远高于单一且性能稳定的小型机服务器,并且集群在运行过程中几乎是不允许停止的,这就 ...

随机推荐

  1. CAD的输出成高清jpg图片

    打印名称选择JPG或者PNG 然后图纸尺寸选择大的 尺寸不够大就自己设置下 创建新图纸——设置下长宽——然后保存下名字,然后图纸尺寸选择你设置过的这个输出就好了 然后窗口下就好了

  2. Crontab定时任务配置

    CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在 ...

  3. [Spring] - 读写分离

    使用Spring可以做到在应用层中实现数据库的读写分离. 参考文档: http://blog.csdn.net/lifuxiangcaohui/article/details/7280202 思路是使 ...

  4. IOS字典NSDictionary与NSMutableDictionary知识点

    字典中的元素是以键值对的形式存储的,键值对的键和值,都是任意的对象,但是键往往使用字符串,字典存储对象的地址没有顺序,字典的遍历分为:键的遍历和值的遍历,字典与数组的区别:数组讲究顺序,而字典可以快速 ...

  5. Maven 建立web项目 The import javax.servlet cannot be resolved

    右击项目,选择Java Build Path->Libraries->Add External JARs,tomcat的路径lib文件夹下选中"servlet-api.jar&q ...

  6. jQuery选择器(子元素过滤选择器)第七节

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  7. Dynamics CRM日期字段查询使用时分秒的方法

    本人微信公众号:微软动态CRM专家罗勇 ,回复293或者20190110可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 我们 ...

  8. Python开发【内置模块篇】configparser

    生成配置文件 import configparser config = configparser.ConfigParser() config[', 'Compression': 'yes', ', ' ...

  9. 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)

    [LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...

  10. shell脚本变量$#,$*,$$,$@,$0,$1,$2,$?的含义

    本文转录:https://blog.csdn.net/kejiaming/article/details/51859503 参数说明: $# 是传给脚本的参数个数 $ 是脚本本身的名字 $ 是传递给该 ...