基于Java 的对象存储管理系统的设计与实现
2022-07-11杨士永
杨士永
(滨州医学院附属医院 山东省滨州市 256603)
1 开发背景
随着大数据、云计算、物联网等高新技术在医疗行业的应用不断深入,我国的医疗行业网络安全越来越受到国家的高度重视。2018 年9 月13 日,国家卫生健康委发布《国家健康医疗大数据标准、安全和服务管理办法(试行)》,明确责任单位应当按照国家网络安全等级保护制度要求,构建可信的网络安全环境,提升关键信息基础设施和重要信息系统的安全防护能力。根据《信息系统安全等级保护基本要求》,责任单位应提供异地备份功能,利用通讯网络将关键数据定时批量传送至备用场地。对于医院业务系统,如HIS、LIS、PACS 等,任何系统故障或者人为误操作导致的数据丢失或损坏,都会给医院带来难以估量的损失,甚至威胁到病人的生命财产安全。尤其是现在,针对医院信息系统的恶意攻击频发,勒索病毒层出不穷,这些因素给医院网络及信息安全建设带来了极大的挑战。尽管每家医院都会或多或少置备数据的备份措施,但这些备份方案大多是本地备份。重要数据的本地备份往往会因为各种因素而遭到破坏,如地震、火灾等不可抗力因素,异地备份作为医院容灾备份系统中最后防线发挥着举足轻重的地位。
在这种背景下,笔者医院选用对象存储作为异地备份的存储。对象存储(Object-Oriented Storage,OOS)是一种海量、安全、低成本、高可用的云存储服务,针对云计算、大数据等非结构化数据海量存储形态,通过标准服务接口,提供非结构化数据无限存储服务。如何充分利用对象存储的优势,实现数据的自动上传、自动管理是当下的重要需求。
2 系统开发环境及相关技术
2.1 系统开发环境
笔者的开发环境使用的操作系统是Windows 10(64 位)系统,JDK 版本为Java SE Development Kit 8,开发用的IDE 为NetBeans IDE 8.2。
Java 是由Sun Microsystem 公司于1995 年5 月推出的。具有简单、面向对象、分布式、健壮、安全、可移植、多线程等特点。2009 年4 月,Oracle 公司收购了Java 版权。本文开发时选用Java SE Development Kit 8 的原因是,该版本是Java 被Oracle 收购后,发布的第一个长期支持(LTS)版本,可以在较长时间内获得安全、维护和功能的更新,而且由于长时间的迭代升级,已经是一个比较稳定安全的版本,而且也广泛的被开发公司所使用。
NetBeans 是Sun 公司在2000 年创立的开放源代码供开发人员和客户社区的家园,包括了开源的开发环境和应用平台。NetBeans IDE 可以使开发人员利用Java 平台能够快速创建Web、企业、桌面以及移动的应用程序。这里笔者使用它来快速构建简单的系统界面,使用户操作更加便捷。
2.2 对象存储的基本概念
对象存储与传统使用的存储有所不同,它通过类似于模拟文件夹的方式,使用户更加方便的进行文件的管理,以下是对象存储基本概念的说明。
Bucket(桶,存储空间)是用户用来管理所存储文件的存储空间,每个用户可以拥有多个Bucket,Bucket 的名称在对象存储中必须是全局唯一的,而且一旦创建就不可以再对名称进行修改。每个Bucket 中的文件数量是没有限制的。
Object(对象、文件)是对象存储中存储数据的基本单元,被称为对象存储的对象,也可以叫对象存储的文件。所有的Object 都必须隶属于某个Bucket。对象主要包括了三部分组成:
(1)Key:键值,即对象的名称,为经过UTF-8 编码的长度大于0 且不超过1024 的字符序列。一个Bucket 里的每个对象必须拥有唯一的对象键值。
(2)Metadata:元数据,即对象的描述信息,包括系统元数据和用户元数据,这些元数据以键值对(Key-Value)的形式被上传。系统元数据是由对象存储自动产生,比如Date,Content-length,Last-modify,Content-MD5 等。用户元数据由用户在上传对象时指定,是用户自定义的对象描述信息。
(3)Data:数据,即文件的数据内容。
AccessKey/SecretKey(访问密钥)简称AK/SK,对象存储通过使用AccessKey 和SecretKey 对称加密的方法来验证某个请求的发送者身份,AccessKey 用来标识用户,SecretKey 是用户用于加密签名字符串和对象存储用于验证签名字符串的密钥,类似于日常使用的密码。AK/SK 又可分为永久AK/SK 和临时AK/SK,可以满足不同情况下的访问需求。
上述对象存储各个属于之间的结构关系如图 1 所示。
图1:对象存储中的数据结构图
分块上传是本文系统主要使用的文件上传方法,对象存储中单个文件上传大小有限,对于几十GB 甚至几百GB 的文件上传,推荐使用分块上传。分块上传时系统会自动将整个对象切分为若干分块,这些分块会按照连续的序号进行编号,编好号后的分块可以独立上传,或者按照任意顺序批量上传,最终对象存储会根据分块的编号重新组合出该对象。该方法最大的优点是支持断点续传,任意分块传输失败,都可以重新传输错误分块,不会影响其他分块和整个文件的完整性。
2.3 第三方库介绍
在程序中,还使用了一些第三方库:
(1)oos-sdk:该库由对象存储提供商提供,用于连接存储并实现存储的各项管理功能。
(2)quartz:这是一个完全由Java 编写的开源作业调度框架,功能强大,但简单易用,这里主要用来创建和管理任务作业。
(3)log4j:这是一个Apache 的开源项目,通过它,可以控制日志信息传送的目的地,比如控制台、文件、GUI 组件,甚至是套接口服务器等。
(4)fastjson:这是阿里巴巴开源的Json 解析库,将JavaBean 序列化为Json 字符串,也可以从Json 字符串反序列化到JavaBean。
3 系统总体功能结构
对象存储管理系统主要由定时任务、文件浏览器、任务列表、系统设置、生命周期管理、本地文件管理六大模块构成,每个模块下还设有子模块。系统功能结构图如图 2 所示。
图2:系统功能结构图
对象存储管理系统的各个模块通过标签页的方式展示在程序界面上,通过鼠标可以轻松切换各个功能模块,如图 3所示。
图3:对象存储管理系统界面
4 功能模块设计及实现
4.1 定时任务模块
定时任务模块主要用于执行自动任务,程序启动后,系统会自动运行已经制定好的任务,并将执行任务的日志显示在程序界面以及日志文件中,程序界面上还有任务终止按钮、任务启动按钮、查询当前计划任务按钮以及打开日志文件夹按钮。
定时任务启动后,系统会自动加载预设的任务列表,目前的预设任务主要有三个:自动上传任务、磁盘剩余空间监控任务、文件自动清理任务。其中,自动上传任务会定时扫描磁盘分区的目标路径,如果发现目标文件就会启动上传进程,扫描规则可以在系统设置中的文件筛选器中配置。启动上传进程后,系统会载入文件上传规则,里面包含是否需要计算文件哈希值、上传线程数(多线程可缩短上传时间)、上传成功后是否需要发送微信通知等策略,本文默认启动全部策略。载入完配置后,程序开始计算文件的哈希值,笔者使用的哈希算法是MD5,为了方便后期校验文件,笔者将计算后的MD5 的值加入到了文件名中。计算完文件的哈希值后就会开始文件上传。开始上传后,系统会自动将文件切割成50MB 大小的分块,并将划分好的分块按照连续的序号编码,然后进行多线程上传,上传进度会实时显示在模块底部的进度条上。每个文件分块上传后,对象存储都会返回一个文件块的哈希值,用于校验分块的完整性,全部分块上传完毕后,对象存储会将所有的分块按编码的顺序进行拼接,形成一个完整的文件。如果上传期间网络出现中断,可以重新传输未上传的分块,不影响最终文件的完整性。文件上传完毕后,系统会通过企业微信接口自动给指定的管理员发送微信通知,上面会显示文件名、文件大小、上传所用时间、上传平均速度等,如图 4 所示。至此该文件上传任务的全部流程结束,进入下一个文件的上传流程。执行任务的流程图如图 5 所示。
图4:微信通知效果图
图5:定时任务执行流程图
4.2 文件浏览器模块
文件浏览器模块由左右两个功能面板构成,左侧面板是Bucket 列表,可以查询当前对象存储中已存在的Bucket,在该面板上点击鼠标右键会弹出菜单选项,可以选择创建新的Bucket,也可以对已有的Bucket 进行删除操作和设置生命周期策略。选择设置生命周期策略,程序会自动跳转到生命周期管理模块。
模块右侧部分是文件的显示面板。点击对应的Bucket可以显示当前Bucket 中的文件及文件夹列表。
在文件列表处点击右键,会弹出菜单选项,可以选择复制路径、上传文件、下载文件、删除文件、刷新列表、查询当前文件过期日期等功能。选择上传文件或者下载文件时,系统会自动跳转到任务列表模块,并可以根据用户的需求进行相应的配置。
4.3 任务列表模块
任务列表模块是用来执行非自动执行的上传下载任务的。在文件浏览器创建的上传下载任务会自动添加到该模块的表格组件中,表格组件中会显示任务的基本信息,比如文件名、文件大小、源路径、目标路径、上传进度、当前任务状态等。可以批量执行,也可以单独执行,执行的日志会显示在任务列表模块中的日志显示框和后台的日志文件中。全部任务的进度会显示在模块底部的进度条上。上传下载的配置可以在系统设置模块中修改。
4.4 系统设置模块
系统设置模块主要包括文件筛选器设置、上传下载设置、对象存储账号设置。
文件筛选器设置主要用于制定扫描文件的规则。比如笔者需要上传的文件名都是有统一的格式的,有明确的文件类型再加上每天的日期,于是,笔者就可以在文件筛选器上规定好文件前缀(如:“myfilename_”)、指定格式的日期(如:“yyyyMMdd”),文件后缀(如:“.zip”),设置好需要扫描的路径以及上传的路径。制定好规则后,每次扫描器在扫描时会根据规则的设置,自动生成对应的正则表达式,通过正则匹配,指定路径下符合要求的文件就可以被扫描到并自动上传到上传路径上,比如:myfilename_20220313.zip。当然,也可以设置扫描时验证文件的哈希码以及设置每次扫描间隔频率。可以对同一个目录制定多条规则,也可以对多个目录使用同一条规则。
上传下载设置可以设定文件上传时的线程数、文件下载时的线程数、程序界面上日志保留的行数、日志储存路径,可以选择开启或者关闭下载文件校验、程序启动自动最小化、程序运行后开启自动任务、微信通知、自动清理临时文件等功能。
对象存储账号设置用来保存服务商提供的AccessKey 和SecretKey,用来作为整个系统的连接存储的账号,账号信息通过加密的方式保存在配置文件中。
4.5 生命周期管理模块
生命周期管理模块是不能直接使用的,需要配合文件浏览器模块一起使用。
在文件浏览器模块选择需要配置的Bucket,点击鼠标右键选择生命周期设置就可以跳转到生命周期管理模块,系统会自动加载当前Bucket 已有的规则。在该模块可以创建新的生命周期规则,也可以修改或删除已有的规则。
生命周期可以设置过期天数和截止日期。过期天数是文件上传指定天数后自动删除,这是对象存储自动处理的,不需要人或者程序的干预;截止日期顾名思义,就是到指定日期,文件就自动删除了,笔者很少使用。
选择设置过生命周期的Bucket 中的文件,右键菜单选择过期日期选项时,可以查询当前文件的过期日期;没有设置时,系统也会弹窗提醒报错。
4.6 本地文件管理模块
本地文件管理模块可以设置对本地文件进行复制或删除的规则,用来实现更复杂的自动化任务。
在本地文件管理模块可以制定操作类型(复制、删除)、正则表达式、源路径、目标路径等规则,并可以选择启用和关闭该规则。在扫描器扫描指定路径时,会同时加载该模块的规则。
比如,笔者想要每天上传文件的同时,还需要每个月单独保留一个副本,这个需求就可以配合本地文件管理模块来实现。假定,每月1 日的文件作为要单独保留的副本,笔者就可以制定策略,将1 日的文件在传输前单独复制一份,然后上传到单独的Bucket 中,并单独设置生命周期策略。
5 结束语
对象存储管理系统的设计与开发,主要目的是为了解决重要数据的自动化上传和管理的问题。通过信息系统,充分利用对象存储的特点,实现了对医院重要数据安全可靠的备份,同时,尽可能减少了管理人员的工作压力。本文对对象存储管理系统的各个功能模块进行了比较细致的说明,整个系统比较符合用户的操作使用习惯,也拥有比较合理的程序界面设计,这样,既能保证软件功能的完善,又能降低使用者的操作难度。保质保量的完成了国家对医院信息化安全的要求。