聂 璐 郑吉洲 王丽娜刘海彬 王子豪,2
1.北京航天自动控制研究所,北京100854 2.宇航智能控制技术国家级重点实验室,北京100854
航天装备在长期加电的过程中会产生海量数据。国外航天领域对海量数据的存储和处理通常采用云平台实现[1],如NASA建立了综合云服务平台Nebula和云计算平台iRODS,在Hadoop集群中应用MapReduce弹性存储和并行处理航天大数据洪流[2]。国外软硬件产品搭建的海量数据处理平台,具有处理高效、数据共享等优点,但却存在各种安全漏洞和后门,严重影响航天装备的安全服役[3]。利用国产软硬件搭建航天海量数据处理平台可以保证系统安全、自主和可控。
目前,基于龙芯服务器集群、中标麒麟操作系统及达梦数据库的国产化平台海量数据处理系统已完成基础功能的设计与实现[3]。通过搭建服务器集群并行处理海量数据,以期满足对数据处理实时性、高效率的客观要求。实验发现,平台虽已具备数据的处理、存储功能,但服务器集群内部的处理任务分配不合理导致各服务器负载不均,部分服务器产生了任务积压,对数据处理的时效性产生了一定影响。
当集群处理海量数据时,服务器负载不均会成为集群新的瓶颈,影响集群整体的性能。因此,均衡负载是国产化平台海量数据处理系统必须解决的一个问题。由于海量数据处理系统中数据类型多、集群内部数据交互频繁,且大量处理线程并行执行,目前已有的动态负载均衡方法和静态负载均衡方法[4]均无法单独适用于本系统。针对此问题,提出一种“动”“静”结合的负载均衡方法,并在系统上对该方法的有效性进行了实验验证。结果表明,所设计的负载均衡方法实现了集群中各服务器的负载均衡。
本文首先梳理了国产化平台海量数据处理系统从数据接收分发、解析、抽样和入库的整个过程;然后提出了在数据接收分发、抽样环节采用“动”“静”结合的负载均衡方法;最后给出采用该负载均衡方法后系统工作时集群的负载监测结果。
国产化平台海量数据处理系统服务器采用基于龙芯双3A1500刀片式服务器,集成4个处理器核,构成类SMP结构,运行中标麒麟Linux5.0操作系统。
系统软件由达梦DM7数据库、服务器端数据管理软件和客户端XML配置软件、客户端数据查询软件等组成,共同实现海量数据的存储、查询等功能。各软件接口关系如图1所示。
图1 软件接口关系图
海量数据处理主要由部署在各台服务器上的数据处理软件完成。如图2所示,数据处理经过了接收、解析、抽样和入库等环节。
图2 海量数据处理流程图
1.2.1 数据接收
服务器集群对外提供一个虚拟IP,数据发送端只与虚拟IP进行通信。集群接收到数据包之后,通过负载均衡策略将数据包转发给集群中的服务器进行解析,为了充分利用芯片多核多线程的处理能力,处理服务器上用一个主线程接收数据,并根据需要建立处理线程。
1.2.2 数据解析
在服务器上使用多线程的方式进行数据包的解析。服务器根据数据类型划分出数据接收队列,每个队列创建相应的处理线程与之对应。在接收到网络数据包后,根据数据类型放入对应的接收队列。处理线程根据配置文件进行数据包的解析,将解析后的数据存到以“数据类型_时间”命名的0级文件中,并每隔T时间新建0级文件以存储下一个T时间内解析的数据。每存储T时间0级数据文件,抽样任务启动对数据进行抽样。记T时间为一个处理周期(简称“周期”)。
1.2.3 数据抽样
数据抽样是实现快速查询及结果曲线放大缩小的重要一环。结果曲线以时间轴形式呈现,故参与抽样的数据应先以时间顺序排列再进行抽样。因此,数据抽样的第一步是将相同文件名的0级文件(即属于同一时间区间内的数据)集中到同一台服务器上,按照接收的时间先后顺序对数据进行排列、抽样。
考虑到任意时间段内,到达服务器的数据流量相差较大,故若以时间为尺度进行抽样,则需对每种数据类型的流量进行分析,确定其抽样的时间间隔,导致系统适应性差。采用固定数据包数量作为抽样间隔,具有通用性强、可灵活配置等优势。假设相邻4组数据作为一个抽样区间,从数据类型A的0级文件的每个抽样区间中取出一个最大值和最小值写入A的抽样1级文件,再从1级文件的每个抽样区间中取出一个最大值和最小值写入A的抽样2级文件,以此类推,得到数据类型A的抽样n级文件。若数据类型中包含多个字段,则每个字段分别抽样再按时间顺序进行合并。
1.2.4 数据入库
DM7 数据库提供了大规模并行处理 MPP 架构,通过分布负载到多个数据库服务器主机,实现海量数据的快速入库。数据入库采用定时方式调用,有外部的定时程序定时启动数据导入模块程序,完成对各服务器中部分0级文件和抽样后1至n级文件的入库工作,保持数据处理服务器上数据文件数量的动态平衡,避免文件积压。
静态负载均衡(SLB, Static Load Balancing)是根据集群中服务器的特性,预先制定一个调度算法,在系统运行时按照这个给定的算法给各个服务器分配任务。本系统在数据接收环节采用静态负载均衡的方法,将集群收到的数据包按照预先配置的算法进行转发,保证各个服务器接收到的数据包数量基本一致。
2.1.1 技术原理
本系统利用Linux虚拟服务器技术(LVS,Linux Virtual Server)[5-6]接收来自网络的数据包,通过静态负载均衡策略,按照调度算法将数据包转发到指定服务器上进行处理。如图3所示,基于LVS技术的集群由一个主控服务器(Director) 及若干真实服务器(Real-server)组成,Director是集群唯一的入口,集群通过一个虚拟IP地址(VIP,Virtual IP Address)与外界进行数据交互,Director根据指定的调度算法对Real-server进行控制,Real-server负责实际提供服务。集群的内部结构对用户透明,用户只通过VIP和集群通信,故从用户角度看,通信的服务器集群只是单台服务器。因为所有的处理都是在操作系统内核完成,调度开销小,具有很高的吞吐率,可以满足型号实验中数据迸发时的数据包转发的可靠性要求。
图3 LVS结构图
2.1.2 实现策略及调度算法
网络数据包到达集群后,Director会根据系统预先设定的调度算法选出一台Real-server,将数据包转发到该Real-server上,由它对数据包进行处理。由于本系统中所有服务器均部署在同一子网内,故采用直接路由(DR,Direct Routing)技术实现对数据包的转发,其工作原理是将数据包的MAC地址改为某台Real-server的MAC地址,然后在局域网内转发。
负载调度算法的设计应综合考虑集群中服务器的性能、系统组织结构及系统对负载均衡程度的需求。表1中列举了目前几种常用的负载调度算法。
海量数据处理服务器集群中每台Real-server硬件配置相同,具有相同的处理性能,不考虑加权算法;所有数据包到达集群后均通过配置文件进行解析处理,无须构建散列表区分不同数据类型的处理方式;最少连接调度算法和轮叫调度算法均能满足系统的负载均衡需求,但两者相较,轮叫调度算法更简单、高效,且满足系统需求。故本系统数据接收环节的静态负载均衡算法采用轮叫调度算法,集群中的每台Real-server轮流接收Director转发的数据包,每台Real-server负责解析相同数量的数据包,实现系统在数据接收、解析阶段的负载均衡。
表1 负载调度算法
动态负载均衡(DLB, Dynamic Load Balancing)是在集群系统运行时根据负载情况动态地将任务分配给各个服务器,以达到系统运行时负载的均匀分配。数据抽样是整个数据处理过程中最耗费CPU资源的环节,运用动态负载均衡的方法,均衡服务器负载,充分利用所有服务器的资源来高效完成数据抽样任务。由于不同数据类型的数据流量相差较大,且同种数据在系统启动前期和系统稳定工作后的流量也不尽相同,故在不同时期每种数据类型的抽样任务工作量不能一概而论。针对这一特点,本文提出一种“统一调度,按需优化”的动态负载均衡方法,所有数据类型的抽样任务由一个调度进程统一调度,并在系统稳定工作后,根据流量的不同对调度队列进行按需优化。
2.2.1 统一调度
所有数据类型的抽样任务均由运行在director上的调度进程统一调度。若XML配置文件中共有n种数据类型需要进行抽样,将其记为A1,A2,……,An。调度进程每个周期起一次,首先将所有数据类型标识按预设顺序排队Queue=(A1,A2,……,An),然后根据Real-server过去一分钟的负载情况将不同数据类型的抽样任务轮流指派给当前负载最小的Real-server负责。具体过程如图4所示。
图4 统一调度流程图
抽样任务需要积累一定的数据量才能进行,在实验开始的第1个周期内,系统只进行数据解析以积累0级文件中的数据量,而不进行数据抽样;从第2个周期开始,调度进程正式开始分配抽样任务。若Real-server S接到对任务通知,则从其他所有Real-server中各取出一个该数据类型最早的0级文件,在Real-server S的内存中合并、排序,然后进行抽样。
2.2.2 按需优化
系统在长期加电的过程中会产生大量的数据,每种数据类型流量差异较大,若要尽可能在每个调度周期内完成对上一周期产生的所有0级文件的处理,不产生任务积压,则需对流量较大的数据类型进行任务细分,由多台服务器分担抽样任务。
海量数据处理系统通过优化任务队列的方式达到优化调度的目的。考虑到系统在加电前期需要进行一系列的准备工作,此时产生的数据流量不稳定,故在加电前期不进行调度优化。待系统稳定、正常工作后,再根据流量对任务队列进行优化。
具体优化步骤为:
图5 优化调度流程图
1)计算max(Ai)
max(Ai)为单台服务器在T时间内可对Ai抽样的最大数据量,利用式(1)计算其近似值。
(1)
其中,MAX(k)为系统压力测试时单台服务器T时间内可对只含一个字段的数据类型抽样k级的最大数据量;k为数据类型Ai的最高抽样级数;|Ai|为数据类型Ai的字段个数。以上参数均可从系统配置表中获取;
2)判断是否对Ai的抽样任务进行细分
若一个周期内解析出的Ai的数据量NAi超过一个周期内单台服务器能处理的最大数据量max(Ai),则细分Ai的抽样任务;
3)计算任务细分度m
m为抽样任务细分程度,即每个周期内对Ai的抽样任务分m次完成,利用式(2)计算m的值;
(2)
4)修改任务队列
将任务队列中Ai的标识增加到m个,此后每个周期内调度进程对Ai的抽样任务进行m次调度,分配给多台服务器完成;
5)修改Ai数据0级文件的更新周期
当服务器接到对Ai抽样的指令后,首先将所有服务器中上一周期解析出的Ai的0级文件集中到自身再统一进行抽样。若Ai的抽样任务需要被细分,则需将每台服务器上Ai的0级文件按时间顺序分割成相应的份数,为后续抽样任务做准备。0级文件的分割通过将0级文件的更新周期改为T/m来实现,即每T/m时间新建一个以“数据类型_时间”命名的0级文件来存储相应时间段内解析出的Ai数据。
将所设计的负载均衡方法在国产化平台海量数据处理系统中实现并进行方法有效性验证。随机选择一个时间对LVS转发数据包的情况进行抽查。图6是系统上电25h12m后,集群中4台Real-server收到Director转发的数据包数量查询结果。其中,192.168.111.15为集群虚拟IP地址,192.168.111.7/9/11/14分别是4台Real-server的IP地址。
图6 转发数据包统计结果
从统计结果可以看到,每台服务器收到的数据包包数最多相差一包,一包的差异符合所采用的负载均衡算法的分配规律。从接收数据包的数量上可以推断每台服务器处理数据解析任务的负载是大致均衡的。
用uptime命令来查看服务器在过去1分钟、5分钟和15分钟的平均负载。在上电前3天每天随机选择一个时间点查询4台服务器的负载情况,结果如图7所示。
图7 负载监测结果
从查询结果可以看到,所查询的3个时间点前1分钟、5分钟和15分钟内的平均负载差分别在±0.21、±0.14和±0.05范围内,服务器之间的负载差异随着统计时段的增长而逐渐减小。可以认为,在当前的负载均衡方法的作用下,系统中各服务器达到了负载均衡。
服务器集群负载不均可能会成为集群的性能瓶颈。本文针对国产化平台海量数据处理系统负载不 均的情况,提出了一种“动”“静”结合的负载均衡方法,给出了具体的设计和实现方案。目前该方法已成功运用在系统上,有效均衡了航天装备长期加电过程中海量数据处理系统各服务器的负载,加强了系统的适应性和稳定性,提升了系统处理性能。