1. 引言
特种设备的能源消耗巨大,近年来国际上对于特种设备的能效监管与检测极为重视。作为特种设备重要的组成部分,起重机械关于能效测试、能效分级等仍没有确立非试行的统一规范或标准 [1] 。电动葫芦的能效研究也将为后续展开的其他起重机械能效评价研究提供非常有益的借鉴 [2] 。
应江苏省特种设备检查监督研究院无锡分院的要求,进行电动葫芦的能效测试及能耗分级,能效影响因素涵盖多类:电动葫芦型号(电机、电气、机械传动部分)、电机运行状态(运行速度、电机功率)、测试环境(不同工作级别、起重量、起升高度)等 [3] [4] 。但国内外对于起重机类特种设备基本是关于数据检测终端、远程监控系统的研发,电动葫芦能效因素统计模型、能效分级等数据分析理论都基于少量数据集的仿真基础建立,使得最终结果缺乏说服力。在此背景下,为了适用于多维因素大数据集进行数据分析、建立统计模型,本文提出了基于HBase的能效检测数据存储系统设计方案,根据配置注册电动葫芦型号以及其历史多维因素数据、常规数据,通过RPC获取深度学习模块的最优选择后推送合适的检测任务,任务调度模块适时采集热点数据并存储。
2. 后台设计
本文设计系统基于Maven构建、Jenkins作为持续集成,项目后端使用Spring Boot (Spring + Spring MVC) + MyBatis框架搭建,去除XML配置;项目前端基于Angular JS + Bootstrap + jQuery框架,使用Thymeleaf模板引擎生成复用静态页面。后端系统采用微服务化的特点 [5] ,分为业务与公共模块子系统,各子系统均按功能模块化设计,系统组件图如图1。

Figure 1. Energy efficiency detection data management system component diagram
图1. 能测数据管理系统组件图
2.1. 业务子系统
业务子系统包括SSM架构、任务调度模块、RPC调用模块、部署模块以及数据解析模块。各模块对应技术组件以及功能实现见表1。

Table 1. Business subsystem function realization table
表1. 业务子系统各模块功能实现表
2.1.1. SSM架构
SSM框架是Spring MVC,Spring以及MyBatis的整合,属于MVC设计模式,系统架构按层次、模块划分,其中,Spring MVC主要转发请求、分派视图,Spring处理请求,MyBatis持久化数据对象。能测数据管理系统基于此架构设计,架构层面较为突出的特点如下:
1) 使用Model、Mapper、MapperXML、Service、ServiceImpl、Controller等后缀名命名模型层、持久层、控制层基础代码,使得代码结构清晰、层次分明;
2) 基于Spring注解,统一管理各Exception类型、创建Rest风格Controller、AOP切面处理事务等,去XML配置,配合注解模块化统一管理异常、Controller业务方法Bean、事务管理器等;
3) 持久化集成MyBatis、通用Mapper组件、Page Helper物理分页组件,减少单表业务SQL开发量。
2.1.2. 部署模块
负载均衡使用nginx分发数据包与请求,同时实现主从热备;通过使用keepalived检测nginx状态从而达到高可用(HA, High Availability)的目的,nginx与keepalived之间的关系如图2。

Figure 2. Nginx/Keepalived Component relation diagram
图2. Nginx + keepalived组件关系图
本文应用部署时使用虚拟IP (VIP)作为用户访问、内部访问的统一入口,nginx配置具体路由,外界通过虚拟IP访问具体Nginx服务器,keepalived配置后,nginx-master会向nginx-slave持续发送心跳,此心跳信息表征nginx-master的状态,从而保证Nginx的高可用。
2.2. 公共模块子系统
公共模块子系统包括权限模块、配置中心模块、图表显示模块、消息模块、推送模块、日志模块、文档模块以及存储模块。各模块对应技术组件以及功能实现见表2。

Table 2. Common module subsystem function realization table
表2. 公共模块子系统各模块功能实现表
2.2.1. 权限模块
Apache Shiro支持认证、授权、加密和会话管理,能测数据管理系统通过实现Realm定义系统内部的权限规则,Security Manager通过从Realm获取用户的信息与权限认证验证Subject。下述是权限模块的核心功能以及实现:
1) 使用配置文件定义Realm进行用户登录、URL权限管理;
2) 常规方案仅使用Redis存取会话信息,本文使用Shiro session配合Redis实现“安全型”会话管理。引入spring-session-data-redis,@Enable Redis Http Session配置session过期时间,redis缓存会话数据实现分布式session同步,重启服务会话不丢失。
2.2.2. 消息模块
消息中间件采用RabbitMQ [7] ,使发消息者(多终端、各类型数据)与收消息者(各持久化服务)完全解耦,同时在发消息者与队列之间加了一层抽象——交换机,发消息者传输数据给交换机,交换机以“Direct”匹配key再转发的方式将数据投送至绑定的队列。
3. 存储设计
存储模块主要包括多维因素数据(机械传动部分、电机运行特性、测试环境等因素) HBase存储、常规数据(电动葫芦基本信息注册数据、多种检测任务周期信息等) MySQL存储以及热点数据(检测任务周期的实时数据) Redis存储,实际部署环境拓扑图如图3。

Figure 3. Topology diagram of the database deployment
图3. 部署数据库拓扑图
3.1. 多维因素HBase数据库
HBase是一个列存储、多维度 [8] 、可伸缩、结构稀疏的分布式nosql数据库,数学模型可以看成以行键(Row Key)、单元(Cell)、时间戳(timestamp)标识的Map数据结构的数据库 [9] ,其中,单元包括列族(Column Family)、列标识(Column Qualifier),每个列族包括多个列标识,创建表时,仅需定义表名与列族,列标识也无需预定义,因此不同行键对应的同一列族的列标识可以不一致。定位数据也必须指定行健、列族名、列标识名、版本号(时间戳)。
列存储中查询中的索引规则是通过列来定义,因此HBase中数据本身即索引,每次查询只会访问涉及的列,极大的降低了IO操作频率,同时,每一列的字段数据类型一致,列聚集存储可以进行高效压缩,节省物理空间。能效数据统计模型、能效分级等数据分析需求的数据量较为庞大,出于存储、索引性能、多维因素存储的考虑,HBase成为最佳选择。能测信息管理系统整合HBase存储多维因素数据步骤如下:
1) 在Spring Boot中引入hbase-client以及spring-data-hadoop依赖;
2) 设置好quorum与port后,配置Hbase Properties与HBase Configuration获取Hbase Template与Connection实例;应用Connection实例,获取表名称(Table Name)、行键(Row Key)、列族(Column Family)、列标识(Column Qualifier)等信息实现create、put、scan、get、count等操作,并封装成Service类;
3) 调用HBase Service类创建表,列族(含有多个列标识)对应机械传动部分因素(电动葫芦型号、电机、传动摩擦)、电机运行状态(运行速度、电机功率)、测试环境(不同工作级别、起重量、起升高度)。
为了便于展示列族与列标识,针对Row Key为id1时,展开列族的数据结构见表3。

Table 3. Attributes of column family in multidimensional factor data table
表3. 多维因素数据表的列族属性
多维因素数据表multid_factor数据模型见表4。

Table 4. HBase multidimensional factor data table multid_factor
表4. HBase多维因素数据表multid_factor
优化配置措施:
1) 由于过多的Column Family之间会互相影响,本系统限制每张表列族不超过4个;列族名、列标识名的长度影响I/O读写的性能以及发送的数据量,设置简洁。
2) Row Key是HBase的key-value存储中的key,HBase通过对Row Key按字典序(存储排序)来建立索引,本系统考虑存储数据scan范围较大的特点采取散列字段(高2个字节,0~65,535程序循环产生)+时间字段(低4个字节,保留小时分钟毫秒)的组成方式优化Row Key的Hash以获得固定长度的Row Key,使数据分布均匀,均衡负载。
3.2. 常规MySQL数据库
MySQL是一个关系型数据库管理系统,表结构涉及字段名称、字段类型、字段长度、是否为空、主键;表操作支持insert、delete、update、select (条件、排序、分组、多表等);支持事务以及配置事务粒度;表间关系支持多种关联映射;表数据有多种约束类型,如primary key(PK)、unique等。
能测信息管理系统使用MyBatis及相关组件整合MySQL步骤如下:
1) 在Spring Boot中引入mybatis-spring-boot-starter,添加mysql、jdbc相关依赖spring-boot-starter-jdbc、mysql-connector-java;
2) 配置MySQL远程地址、登录信息、驱动名称、线程池信息等;
3) 创建常规数据(检测执行人、检测时间、工作周期等基本信息)、实时热点数据(时间、高度等)的实体类,创建数据操作相关方法的接口Interface,使用通用Mapper组件配置生成对应的MapperXML进行数据库CRUD操作,使用PageHelper组件实现物理分页;同时,可以创建Service进一步封装上述的数据操作相关方法,对外仅暴露Service,降低系统模块耦合度;
4) 开启事务,方法级别指定事务管理器,配置事务传播行为、隔离级别、读写类型等;
检测任务相关信息表detect_info数据模型见表5。

Table 5. Table data model of information related to detection task
表5. 检测任务相关信息表数据模型
优化配置措施:
1、使用Druid Spring Boot Starter集成Alibaba Druid数据库连接池与监控,Druid数据库连接池,监控数据库访问性能,统计SQL的执行性能。
2、AOP切换多数据源数据库,实现读写分离。
3、@Transational注解事务,实现非侵入式的方法级别的事务回滚。
3.3. 热点Redis数据
Redis是一款支持String、List、Hash、Set、Sorted Set数据类型的内存高速缓存数据库,key-value存储类型使得数据查询性能极高,支持主从模式,支持持久化,支持事务,set/get、add/remove等都是原子操作。
管理系统使用Redis存储检测任务周期的实时数据,用以图表显示、即时分析、能效计算等,并设置key的过期时间为检测周期的2倍,过期之前不采用redis持久化,而是转存于MySQL成为常规历史检测数据;系统以主备方式保证Redis的High Availability,redis-master以异步rehash的方式保证redis-slave数据同步,实现数据最终一致性。
能测信息管理系统整合Redis步骤如下:
1) 基于Spring Boot架构,使用spring-boot-starter-data-redis引入redis;
2) 添加配置文件,设置spring.redis.host、spring.redis.port等Redis服务器与连接池信息;
3) 使用RedisTemplate进行set、get、add、remove、hasKey等操作。
数据模型见表6。

Table 6. Data type stored by Redis
表6. Redis存储的数据类型
优化配置措施:
1、redis-master不做任何持久化工作,转存至MySQL代替RDB内存快照、AOF日志文件。
2、主备方式代替主从方式,对外提供一个虚拟IP(VIP),keepalived保证Redis HA,WEB app通过VIP进行存储操作,正常时主机redis-master提供服务,宕机时VIP自动漂移到备机redis-slave上;另外,主备数据同步使用异步同步,在性能得到保证的同时,最终一致性已足够需求。
4. 测试
4.1. 后台压力测试
后台完整测试一般需涵盖工具类等方法测试、Controller类等RESTful API请求测试以及并发访问压力性能测试。其中基本方法测试基于Junit4,RESTful API测试基于Mock技术,性能、效率测试基于ContiPerf。
能测信息管理系统基于ContiPerf进行性能测试步骤如下:
1) 在dev环境下引入org.databene.contiperf组件进行性能测试;
2) 使用注解@PerfTest (invocations = 100, threads = 10)设置启动10个线程执行任务100次;
3) 运行测试,访问:target/contiperf-report/index.html。
得到ContiPerf报表如图4。

Figure 4. ContiPerf report of performance testing
图4. ContiPerf性能测试报告
图4中throughput显示每秒执行任务次数162次,平均响应时间为0.041 s,性能满足需求。后端系统使用内嵌的Tomcat作为Servlet容器,启动ContiPerf测试后用VisualVM查看应用所占的资源情况如图5。

Figure 5. Monitoring information by VisualVM
图5. VisualVM监控信息
如上图所示,ContiPerf开启测试后,Daemon threads后台线程10个,使用的堆内存为约90MB,对于资源使用情况符合预期。
4.2. 数据库性能测试
Apache JMeter是一款开源的压力测试工具,支持数据库、http请求等的压力测试,同时也支持混合应用场景多线程组并发测试,本文使用JMeter进行数据库压力测试,步骤如下:
1) 新建测试计划,添加线程组,设置线程数100;
2) 添加JDBC Connection Configuration,设置待测远程数据库服务器地址以及登录信息;
3) 添加JDBC Request,设置待测select语句,本次测试以单表条件查询为例,select id, workLevel from detect_info where DATE(updateTime) >= DATE('2018-10-15') limit 15;
4) 添加监听器,依次添加察看结果树与聚合报告;
配置完成,执行测试后,聚合报告结果如图6。

Figure 6. JMeter aggregation report of stress test results
图6. JMeter聚合报告压力测试结果
如图6所示,总的select语句请求数Samples为34158条,Average平均响应时间为0.079s,Error%测试出现的错误请求数百分比为0.06%,Throughput(TPS,吞吐量)每秒处理的请求数243.2条,能承受较大的并发请求量。
4.3. HBase性能对比测试
针对既有的检测数据ER模型管理系统解决方案 [10] ,本文参考该方案搭建MySQL数据库、表(建mechanical、electrical、environmental三类能效因素表,并将HBase已load数据完全写入,保证两者的测试数据量一样),并使用Druid连接池、查询索引优化,使用Apache JMeter压测三表联合查询语句“select type, motor, friction, speed, power, level, weight, height from (mechanical left join electrical on mechanical.id=electrical.id) left join environmental on mechanical.id=environmental.id”进行对比测试,设置线程数100。
对于本文设计的HBase多维因素数据表multid_factor,使用“Yahoo!CloudServing Benchmark(YCSB)”进行其数据服务性能基础测试,步骤如下:
1) 配置workload类型为workloadb,即Read mostly workload;
2) 设置load初始化Hbase表数据“./ycsb load hbase10-P../workloads/workloadb-p threads = 100-cp /etc/hbase/conf-p table = multid_factor-p columnfamily = mechanical-p columnfamily = electrical-p columnfamily = environmental-p recordcount = 10000-s > ./load.report”;
3) 运行负载测试“./ycsb run hbase10 …(如步骤2)中所示) -s > ./run.report”。
归纳JMeter聚合报告结果与YCSB命令行返回测试结果报告run.report,得出MySQL常规方案与本文设计HBase多维数据存储方案性能核心指标对比见表7。

Table 7. Comparison table of the core indexes of MySQL and HBase performance
表7. MySQL与HBase性能核心指标对比表
如表7所示,关于多维的较大数据查询,在相同数据量、请求数、线程数的压测情况下,即使常规方案数据库针对多表的查询数据建立索引,吞吐量以及平均响应时间仍然逊于“数据本身即索引”的HBase多维数据表。另外,在多维因素增加维度的情况下,常规库数据库多表查询的响应时间也会有所增长,而HBase因为本身列存储的性质则不会因为增加列族而变化。
5. 结束语
本文基于HBase、MySQL以及Redis分别存储能效检测多维因素数据、常规数据以及热点数据,以SSM架构,结合配置中心、任务调度、日志文档、权限、消息、图表显示、推送等模块,根据配置注册电动葫芦型号以及其历史多维因素数据、常规数据,智能推送合适的检测任务,任务调度适时采集热点数据并实时图表显示,使用的消息队列支持多终端设备同时采集,同时可生成日志报表。该系统设计探讨了多维度数据的存储、索引等优化方案,具有较好的高可用性、可扩展性、高效率等特点,可满足不同型号电动葫芦多种测试条件的能效检测的信息管理需求,为相关人员提供便捷检测与技术支持。
基金项目
KJ(Y)2015018,江苏省特检院资助项目。