1. 系统概述
1.1. 系统研制背景
“导调”通常理解为“导演调理”。根据《中国人民解放军军语》 [1],导演作为动词表示对军事演习进行指导与调控的活动。调理表示军事演习中,由导演部指派人员对参演部队或分队进行情况诱导、检查、裁决、评定和数据采集等工作。导调主要分为计划导调和随机导调两类,计划导调指按演习计划对应的进程及设置的情况,对军事演习进行的导演和调理;随机导调指根据演习进程和演练情况,临机设置情况对军事演习进行的导演和调理 [2]。导调文书是在军事训练过程中,导演与调理人员根据企图立案的基本设计编写的用于创设演练环境和战场情况以诱导首长机关和部队演习动作的信息载体 [3]。当前的军事训练已经由单一军兵种训练演变为军兵种联合训练,训练导调也由导调单一军兵种演习向导调多军兵种联合作战演习转变 [4],一场联合训练中涉及的导调文书多达成百上千份。为获得更好的训练效果,应当加快推进训练导调的信息化建设,坚持“实战牵引、信息主导、开放共享”原则,建立资源共享数据池,着眼联合作战样式,整合各种训练信息资源,共享导调方案、导调文书等信息资源 [5]。传统的基于操作系统自带的文件管理存在分散存储、容易丢失、不易查找、不易共享等诸多问题。本文设计并实现了一套基于MinIO和Elasticsearch等技术的导调文书素材管理系统,在基于指挥信息系统的联合作战训练中,可以为导调人员提供海量文书素材的在线存储、集中管理、分类整编、成果共享能力,可显著提升文书拟制效率,提高训练活动的质量。
1.2. 需求分析
1) 导调文书素材管理系统的用户通常为导调人员,主要用于管理导调文书的主件和附件,涉及的文件类型有.doc、.pdf、.xls、.png、.jpg等。系统需要对上述文件类型提供支持。
2) 用户需将历次训练活动的文书素材通过压缩包的形式上传至导调文书素材管理系统,通过系统对文书素材进行分类管理。
3) 用户在拟制导调文书的过程中需运用导调文书素材管理系统中的素材,系统提供素材文件检索功能,包括根据文件名和文件内容进行检索。
4) 文书拟制是一项多人协同配合的工作,系统需提供共享功能,方便用户将文档共享给他人以便进一步加工或使用。
2. 系统总体设计
2.1. 系统架构
导调文书素材管理系统采用B/S架构 [6],运用了当前成熟的Vue + SpringMVC框架,该框架将Web层进行职责解耦层次划分清晰,项目成员约定好接口即可并行开发,具有开发速度快、扩展性好、维护成本低等优点。本系统主要分为用户层、视图层、业务逻辑层、数据持久层、基础支撑层,如图1所示。
1) 视图层:采用Vue2.0 + ElementUI的技术框架 [7],快速构建前端页面。Vue是当前较为流行的前端开发框架,具有轻量化和高效等特点。ElementUI是一套基于Vue的桌面端组件库,提供了简洁丰富的组件。视图层将REST (Representational State Transfer,具象状态传输)请求发送至控制层。
2) 控制层:采用SpringMVC技术拦截视图层传输过来的REST请求,交给自动注入的Service服务处理。
3) 业务逻辑层:使用Spring处理业务逻辑,完成各模块的信息交互,调用基本MyBatis的mapper接口对数据库进行操作。
4) 数据持久层:主要基于MyBatis对数据库进行访问。
基础支撑层:包括三部分,一是Oracle数据库,用于保存用户、文件基本信息,二是MinIO存储集群,用于提供稳定可靠的文件存储服务,是整个系统的基石,三是Elasticsearch服务器,用于为用户文件建立索引及提供检索功能。
2.2. 系统功能设计
根据功能需求,将导调文书素材管理系统划分为用户管理、目录管理、文件管理和文件检索等功能,如图2所示。
其中,用户管理模块为用户提供注册、登录认证、权限控制等功能。目录管理模块和文件管理模块为用户提供目录和文件的创建、修改、删除、上传、下载、压缩和解压等。文件检索功能为用户提供目录和文件的索引功能。系统内不同模块之间数据流向如图3所示。
3. 关键模块设计与实现
3.1. 基于MinIO的文件存储管理
3.1.1. 技术描述
素材文件存储是导调文书素材管理系统的核心功能。素材文件的存储实质是大量小文件的存储。本地存储比较便利,仅需在项目后台服务目录下建立静态文件夹,用于存放文件,保存和访问方便。缺点是文件与代码耦合度较高,且静态文件的访问会占据服务资源,影响正常业务进行,不适用于本系统。因此,为提高素材文件存储效率,本系统引入MinIO存储技术 [8]。
1) MinIO简介
MinIO是一个基于Apache License V2.0开源协议的高性能、分布式的对象存储系统。支持x86架构的商用平台和arm架构的自主化平台。非常适合存储大容量非结构化的数据,如文件、图片、视频等。在标准硬件上,对象存储的读/写速度最高可以达到183 GB/s和171 GB/s [9]。同时MinIO本身自带web管理页面,安装运维和使用都很方便。MinIO的对象存储在Set上,一个Set是由一组Drive (磁盘)组成的集合。
2) MinIO的编码方式
MinIO的编码方式是通过算法还原数据的方法,使用Reed-Solomon算法将对象划分成n/2个数据和n/2个奇偶校验块,可以配置所需的冗余级别。通过编码块的一部分就能还原出整个对象。
如图4所示,一个对象存储在一个Set上,这个Set包括16个Drive,其中浅灰色的是数据块,深灰色的是校验块,这种方式最多能忍受一半的编码丢失或损坏。所有编码块的大小是原对象的2倍,与传统多副本的存储方案相比,该方案仅冗余了一份,但可靠性更高。
3) MinIO的编码方式
MinIO存储方式如图5所示,所有对象的编码块和meta信息最终都以目录和文件的形式存储在文件系统中。如创建一个名为MyBucket的bucket (存储桶),就是在所有节点的顶级目录创建对应的目录MyBucket。当我们上传对象MyObject至MyBucket中时,就会在这个对象对应的Set上面创建一个目录叫MyObject,然后将所有的编码块和meta信息都保存在该目录下。
为了节省存储资源,在进行文件上传时会计算其MD5 (Message-Digest Algorithm 5,信息–摘要算法5)码,后续若上传相同的文件则不会进行实际的文件流上传,而是将用户文件关联到之前已上传的文件。文件存储在专用的MinIO服务器上。
3.1.2. 实现步骤
1) MinIO服务安装
对于Windows操作系统的服务器,从MinIO官网下载MinIO.exe文件然后执行“MinIO.exe server D:\”,即可运行MinIO服务,其中“D:\”也可换成其他路径用于存储数据。在服务器本地输入http://127.0.0.1:9000可以登录MinIO服务进而创建存储桶或者上传文件。
2) 在Java后台中使用MinIO上传下载文件
MinIO提供了Java SDK。使用时需要引入MinIO相关的jar包。通过maven引入或者下载MinIO-7.1.4.jar引入都可。
Figure 5. MinIO storage mode diagram
图5. MinIO存储方式示意图
3) 调用MinIO
引入MinIO之后,即可创建MinIOClient,调用它提供的各种方法。也可将MinIOClient的创建及调用封装在一个工具类中,方便使用。
3.1.3. 应用效果
系统前期使用HDFS (Hadoop Distributed File System,Hadoop分布式文件系统)存储文件。HDFS是一个高容错性的系统,能够提供高吞吐量的数据访问,非常适合大规模数据集上的应用。系统对比了HDFS和MinIO的存储效率,如表1所示,由表中数据可以看出,MinIO更符合本系统文书素材数量多、小文件多的特征。
Table 1. Comparison between upload times of HDFS and MinIO (100 times)
表1. HDFS与MinIO存储文件耗时对比(100次)
3.2. 基于ES的文件检索
3.2.1. 技术描述
文件搜索模块基于Elasticsearch (简称ES)技术,Elasticsearch是当前主流的基于Lucene内核的企业级搜索引擎数据库,具有分布式、高扩展、高实时等特点,支持全文搜索,并且提供了丰富友好的API [10]。Elasticsearch使用Json格式存储数据,与著名的非关系型数据库MongoDB相似。不同的是,Elasticsearch更侧重数据的查询,倾向于OLAP,而MongoDB则侧重于事务型应用层面,倾向于OLTP [11]。
ES默认自带的分词器是标准分词器,适用于英文场景,无法有效适应中文的使用需求。在标准分词器中,“我们正在学习elastic search”会被处理成“我”、“们”、“正”、“在”、“学”、“习”、“elastic”、“search”,可见标准分词器对中文的处理结果不理想。因此引入IKAnalyzer (简称IK)分词器。IKAnalyzer是一个开源的、基于java语言的轻量级中文分词工具包,需要在ES工具之外额外进行下载。
IK分词器,支持两种算法。分别是:
ik_smart:最少切分。
ik_max_word:最细粒度切分。
在ik_smart算法下,“我们正在学习Elastic search”会被处理成“我们”、“正在”、“学习”、“elastic”、“search”,在ik_maxt_word算法下,“我们正在学习Elastic search”会被处理成“我们”、“正在”、“在学”、“学习”、“elastic”、“search”。
3.2.2. 实现步骤
1) 服务部署和参数设置。根据服务器型号下载相应的安装包进行解压。按照需要配置elasticsearch.yml,修改node.name、network.host、http.port等值。配置jvm.options需要注意将最小堆大小(Xms)和最大堆带下(Xmx)设置成相等的值,且不应超过物理内存的50%,确保有足够的内存用于内核文件系统缓存。
2) 安装IK插件。下载插件放在ES安装目录下;
3) 启动ES服务。双击elasticsearch.bat,如果启动正常,默认会在9200端口打印ES的说明信息;
4) 建立索引。将需要检索的数据提交到ES中,ES通过分词器将对应的语句分词,将其权重和分词结果一并保存;
5) 用户检索。搜索时,将用户搜索的限制条件构建在一个NativeSearchQueryBuilder类中,并调用elasticsearchTemplate的search方法,ES根据权重将结果排名、打分,再将返回结果呈现给用户。
3.2.3. 运用效果
在百万数据记录的情况下,与前期使用的基于关系型数据库的搜索功能相比,基于ES的文件检索能够将检索时间从1 s以上缩减至100 ms以内,大大提升了文件检索的效率,改善了用户体验。
4. 结束语
本系统根据联合训练中导调人员的文书素材管理需求,设计并实现了一套高效的具备目录和文件管理、文件上传下载及内容查询等功能的文书素材管理系统,能够帮助训练人员整合现有的文书素材、提高导调人员的文书拟制效率。