楊士永
(濱州醫(yī)學(xué)院附屬醫(yī)院 山東省濱州市 256603)
隨著大數(shù)據(jù)、云計(jì)算、物聯(lián)網(wǎng)等高新技術(shù)在醫(yī)療行業(yè)的應(yīng)用不斷深入,我國的醫(yī)療行業(yè)網(wǎng)絡(luò)安全越來越受到國家的高度重視。2018 年9 月13 日,國家衛(wèi)生健康委發(fā)布《國家健康醫(yī)療大數(shù)據(jù)標(biāo)準(zhǔn)、安全和服務(wù)管理辦法(試行)》,明確責(zé)任單位應(yīng)當(dāng)按照國家網(wǎng)絡(luò)安全等級保護(hù)制度要求,構(gòu)建可信的網(wǎng)絡(luò)安全環(huán)境,提升關(guān)鍵信息基礎(chǔ)設(shè)施和重要信息系統(tǒng)的安全防護(hù)能力。根據(jù)《信息系統(tǒng)安全等級保護(hù)基本要求》,責(zé)任單位應(yīng)提供異地備份功能,利用通訊網(wǎng)絡(luò)將關(guān)鍵數(shù)據(jù)定時(shí)批量傳送至備用場地。對于醫(yī)院業(yè)務(wù)系統(tǒng),如HIS、LIS、PACS 等,任何系統(tǒng)故障或者人為誤操作導(dǎo)致的數(shù)據(jù)丟失或損壞,都會給醫(yī)院帶來難以估量的損失,甚至威脅到病人的生命財(cái)產(chǎn)安全。尤其是現(xiàn)在,針對醫(yī)院信息系統(tǒng)的惡意攻擊頻發(fā),勒索病毒層出不窮,這些因素給醫(yī)院網(wǎng)絡(luò)及信息安全建設(shè)帶來了極大的挑戰(zhàn)。盡管每家醫(yī)院都會或多或少置備數(shù)據(jù)的備份措施,但這些備份方案大多是本地備份。重要數(shù)據(jù)的本地備份往往會因?yàn)楦鞣N因素而遭到破壞,如地震、火災(zāi)等不可抗力因素,異地備份作為醫(yī)院容災(zāi)備份系統(tǒng)中最后防線發(fā)揮著舉足輕重的地位。
在這種背景下,筆者醫(yī)院選用對象存儲作為異地備份的存儲。對象存儲(Object-Oriented Storage,OOS)是一種海量、安全、低成本、高可用的云存儲服務(wù),針對云計(jì)算、大數(shù)據(jù)等非結(jié)構(gòu)化數(shù)據(jù)海量存儲形態(tài),通過標(biāo)準(zhǔn)服務(wù)接口,提供非結(jié)構(gòu)化數(shù)據(jù)無限存儲服務(wù)。如何充分利用對象存儲的優(yōu)勢,實(shí)現(xiàn)數(shù)據(jù)的自動上傳、自動管理是當(dāng)下的重要需求。
筆者的開發(fā)環(huán)境使用的操作系統(tǒng)是Windows 10(64 位)系統(tǒng),JDK 版本為Java SE Development Kit 8,開發(fā)用的IDE 為NetBeans IDE 8.2。
Java 是由Sun Microsystem 公司于1995 年5 月推出的。具有簡單、面向?qū)ο蟆⒎植际?、健壯、安全、可移植、多線程等特點(diǎn)。2009 年4 月,Oracle 公司收購了Java 版權(quán)。本文開發(fā)時(shí)選用Java SE Development Kit 8 的原因是,該版本是Java 被Oracle 收購后,發(fā)布的第一個(gè)長期支持(LTS)版本,可以在較長時(shí)間內(nèi)獲得安全、維護(hù)和功能的更新,而且由于長時(shí)間的迭代升級,已經(jīng)是一個(gè)比較穩(wěn)定安全的版本,而且也廣泛的被開發(fā)公司所使用。
NetBeans 是Sun 公司在2000 年創(chuàng)立的開放源代碼供開發(fā)人員和客戶社區(qū)的家園,包括了開源的開發(fā)環(huán)境和應(yīng)用平臺。NetBeans IDE 可以使開發(fā)人員利用Java 平臺能夠快速創(chuàng)建Web、企業(yè)、桌面以及移動的應(yīng)用程序。這里筆者使用它來快速構(gòu)建簡單的系統(tǒng)界面,使用戶操作更加便捷。
對象存儲與傳統(tǒng)使用的存儲有所不同,它通過類似于模擬文件夾的方式,使用戶更加方便的進(jìn)行文件的管理,以下是對象存儲基本概念的說明。
Bucket(桶,存儲空間)是用戶用來管理所存儲文件的存儲空間,每個(gè)用戶可以擁有多個(gè)Bucket,Bucket 的名稱在對象存儲中必須是全局唯一的,而且一旦創(chuàng)建就不可以再對名稱進(jìn)行修改。每個(gè)Bucket 中的文件數(shù)量是沒有限制的。
Object(對象、文件)是對象存儲中存儲數(shù)據(jù)的基本單元,被稱為對象存儲的對象,也可以叫對象存儲的文件。所有的Object 都必須隸屬于某個(gè)Bucket。對象主要包括了三部分組成:
(1)Key:鍵值,即對象的名稱,為經(jīng)過UTF-8 編碼的長度大于0 且不超過1024 的字符序列。一個(gè)Bucket 里的每個(gè)對象必須擁有唯一的對象鍵值。
(2)Metadata:元數(shù)據(jù),即對象的描述信息,包括系統(tǒng)元數(shù)據(jù)和用戶元數(shù)據(jù),這些元數(shù)據(jù)以鍵值對(Key-Value)的形式被上傳。系統(tǒng)元數(shù)據(jù)是由對象存儲自動產(chǎn)生,比如Date,Content-length,Last-modify,Content-MD5 等。用戶元數(shù)據(jù)由用戶在上傳對象時(shí)指定,是用戶自定義的對象描述信息。
(3)Data:數(shù)據(jù),即文件的數(shù)據(jù)內(nèi)容。
AccessKey/SecretKey(訪問密鑰)簡稱AK/SK,對象存儲通過使用AccessKey 和SecretKey 對稱加密的方法來驗(yàn)證某個(gè)請求的發(fā)送者身份,AccessKey 用來標(biāo)識用戶,SecretKey 是用戶用于加密簽名字符串和對象存儲用于驗(yàn)證簽名字符串的密鑰,類似于日常使用的密碼。AK/SK 又可分為永久AK/SK 和臨時(shí)AK/SK,可以滿足不同情況下的訪問需求。
上述對象存儲各個(gè)屬于之間的結(jié)構(gòu)關(guān)系如圖 1 所示。
圖1:對象存儲中的數(shù)據(jù)結(jié)構(gòu)圖
分塊上傳是本文系統(tǒng)主要使用的文件上傳方法,對象存儲中單個(gè)文件上傳大小有限,對于幾十GB 甚至幾百GB 的文件上傳,推薦使用分塊上傳。分塊上傳時(shí)系統(tǒng)會自動將整個(gè)對象切分為若干分塊,這些分塊會按照連續(xù)的序號進(jìn)行編號,編好號后的分塊可以獨(dú)立上傳,或者按照任意順序批量上傳,最終對象存儲會根據(jù)分塊的編號重新組合出該對象。該方法最大的優(yōu)點(diǎn)是支持?jǐn)帱c(diǎn)續(xù)傳,任意分塊傳輸失敗,都可以重新傳輸錯(cuò)誤分塊,不會影響其他分塊和整個(gè)文件的完整性。
在程序中,還使用了一些第三方庫:
(1)oos-sdk:該庫由對象存儲提供商提供,用于連接存儲并實(shí)現(xiàn)存儲的各項(xiàng)管理功能。
(2)quartz:這是一個(gè)完全由Java 編寫的開源作業(yè)調(diào)度框架,功能強(qiáng)大,但簡單易用,這里主要用來創(chuàng)建和管理任務(wù)作業(yè)。
(3)log4j:這是一個(gè)Apache 的開源項(xiàng)目,通過它,可以控制日志信息傳送的目的地,比如控制臺、文件、GUI 組件,甚至是套接口服務(wù)器等。
(4)fastjson:這是阿里巴巴開源的Json 解析庫,將JavaBean 序列化為Json 字符串,也可以從Json 字符串反序列化到JavaBean。
對象存儲管理系統(tǒng)主要由定時(shí)任務(wù)、文件瀏覽器、任務(wù)列表、系統(tǒng)設(shè)置、生命周期管理、本地文件管理六大模塊構(gòu)成,每個(gè)模塊下還設(shè)有子模塊。系統(tǒng)功能結(jié)構(gòu)圖如圖 2 所示。
圖2:系統(tǒng)功能結(jié)構(gòu)圖
對象存儲管理系統(tǒng)的各個(gè)模塊通過標(biāo)簽頁的方式展示在程序界面上,通過鼠標(biāo)可以輕松切換各個(gè)功能模塊,如圖 3所示。
圖3:對象存儲管理系統(tǒng)界面
定時(shí)任務(wù)模塊主要用于執(zhí)行自動任務(wù),程序啟動后,系統(tǒng)會自動運(yùn)行已經(jīng)制定好的任務(wù),并將執(zhí)行任務(wù)的日志顯示在程序界面以及日志文件中,程序界面上還有任務(wù)終止按鈕、任務(wù)啟動按鈕、查詢當(dāng)前計(jì)劃任務(wù)按鈕以及打開日志文件夾按鈕。
定時(shí)任務(wù)啟動后,系統(tǒng)會自動加載預(yù)設(shè)的任務(wù)列表,目前的預(yù)設(shè)任務(wù)主要有三個(gè):自動上傳任務(wù)、磁盤剩余空間監(jiān)控任務(wù)、文件自動清理任務(wù)。其中,自動上傳任務(wù)會定時(shí)掃描磁盤分區(qū)的目標(biāo)路徑,如果發(fā)現(xiàn)目標(biāo)文件就會啟動上傳進(jìn)程,掃描規(guī)則可以在系統(tǒng)設(shè)置中的文件篩選器中配置。啟動上傳進(jìn)程后,系統(tǒng)會載入文件上傳規(guī)則,里面包含是否需要計(jì)算文件哈希值、上傳線程數(shù)(多線程可縮短上傳時(shí)間)、上傳成功后是否需要發(fā)送微信通知等策略,本文默認(rèn)啟動全部策略。載入完配置后,程序開始計(jì)算文件的哈希值,筆者使用的哈希算法是MD5,為了方便后期校驗(yàn)文件,筆者將計(jì)算后的MD5 的值加入到了文件名中。計(jì)算完文件的哈希值后就會開始文件上傳。開始上傳后,系統(tǒng)會自動將文件切割成50MB 大小的分塊,并將劃分好的分塊按照連續(xù)的序號編碼,然后進(jìn)行多線程上傳,上傳進(jìn)度會實(shí)時(shí)顯示在模塊底部的進(jìn)度條上。每個(gè)文件分塊上傳后,對象存儲都會返回一個(gè)文件塊的哈希值,用于校驗(yàn)分塊的完整性,全部分塊上傳完畢后,對象存儲會將所有的分塊按編碼的順序進(jìn)行拼接,形成一個(gè)完整的文件。如果上傳期間網(wǎng)絡(luò)出現(xiàn)中斷,可以重新傳輸未上傳的分塊,不影響最終文件的完整性。文件上傳完畢后,系統(tǒng)會通過企業(yè)微信接口自動給指定的管理員發(fā)送微信通知,上面會顯示文件名、文件大小、上傳所用時(shí)間、上傳平均速度等,如圖 4 所示。至此該文件上傳任務(wù)的全部流程結(jié)束,進(jìn)入下一個(gè)文件的上傳流程。執(zhí)行任務(wù)的流程圖如圖 5 所示。
圖4:微信通知效果圖
圖5:定時(shí)任務(wù)執(zhí)行流程圖
文件瀏覽器模塊由左右兩個(gè)功能面板構(gòu)成,左側(cè)面板是Bucket 列表,可以查詢當(dāng)前對象存儲中已存在的Bucket,在該面板上點(diǎn)擊鼠標(biāo)右鍵會彈出菜單選項(xiàng),可以選擇創(chuàng)建新的Bucket,也可以對已有的Bucket 進(jìn)行刪除操作和設(shè)置生命周期策略。選擇設(shè)置生命周期策略,程序會自動跳轉(zhuǎn)到生命周期管理模塊。
模塊右側(cè)部分是文件的顯示面板。點(diǎn)擊對應(yīng)的Bucket可以顯示當(dāng)前Bucket 中的文件及文件夾列表。
在文件列表處點(diǎn)擊右鍵,會彈出菜單選項(xiàng),可以選擇復(fù)制路徑、上傳文件、下載文件、刪除文件、刷新列表、查詢當(dāng)前文件過期日期等功能。選擇上傳文件或者下載文件時(shí),系統(tǒng)會自動跳轉(zhuǎn)到任務(wù)列表模塊,并可以根據(jù)用戶的需求進(jìn)行相應(yīng)的配置。
任務(wù)列表模塊是用來執(zhí)行非自動執(zhí)行的上傳下載任務(wù)的。在文件瀏覽器創(chuàng)建的上傳下載任務(wù)會自動添加到該模塊的表格組件中,表格組件中會顯示任務(wù)的基本信息,比如文件名、文件大小、源路徑、目標(biāo)路徑、上傳進(jìn)度、當(dāng)前任務(wù)狀態(tài)等??梢耘繄?zhí)行,也可以單獨(dú)執(zhí)行,執(zhí)行的日志會顯示在任務(wù)列表模塊中的日志顯示框和后臺的日志文件中。全部任務(wù)的進(jìn)度會顯示在模塊底部的進(jìn)度條上。上傳下載的配置可以在系統(tǒng)設(shè)置模塊中修改。
系統(tǒng)設(shè)置模塊主要包括文件篩選器設(shè)置、上傳下載設(shè)置、對象存儲賬號設(shè)置。
文件篩選器設(shè)置主要用于制定掃描文件的規(guī)則。比如筆者需要上傳的文件名都是有統(tǒng)一的格式的,有明確的文件類型再加上每天的日期,于是,筆者就可以在文件篩選器上規(guī)定好文件前綴(如:“myfilename_”)、指定格式的日期(如:“yyyyMMdd”),文件后綴(如:“.zip”),設(shè)置好需要掃描的路徑以及上傳的路徑。制定好規(guī)則后,每次掃描器在掃描時(shí)會根據(jù)規(guī)則的設(shè)置,自動生成對應(yīng)的正則表達(dá)式,通過正則匹配,指定路徑下符合要求的文件就可以被掃描到并自動上傳到上傳路徑上,比如:myfilename_20220313.zip。當(dāng)然,也可以設(shè)置掃描時(shí)驗(yàn)證文件的哈希碼以及設(shè)置每次掃描間隔頻率??梢詫ν粋€(gè)目錄制定多條規(guī)則,也可以對多個(gè)目錄使用同一條規(guī)則。
上傳下載設(shè)置可以設(shè)定文件上傳時(shí)的線程數(shù)、文件下載時(shí)的線程數(shù)、程序界面上日志保留的行數(shù)、日志儲存路徑,可以選擇開啟或者關(guān)閉下載文件校驗(yàn)、程序啟動自動最小化、程序運(yùn)行后開啟自動任務(wù)、微信通知、自動清理臨時(shí)文件等功能。
對象存儲賬號設(shè)置用來保存服務(wù)商提供的AccessKey 和SecretKey,用來作為整個(gè)系統(tǒng)的連接存儲的賬號,賬號信息通過加密的方式保存在配置文件中。
生命周期管理模塊是不能直接使用的,需要配合文件瀏覽器模塊一起使用。
在文件瀏覽器模塊選擇需要配置的Bucket,點(diǎn)擊鼠標(biāo)右鍵選擇生命周期設(shè)置就可以跳轉(zhuǎn)到生命周期管理模塊,系統(tǒng)會自動加載當(dāng)前Bucket 已有的規(guī)則。在該模塊可以創(chuàng)建新的生命周期規(guī)則,也可以修改或刪除已有的規(guī)則。
生命周期可以設(shè)置過期天數(shù)和截止日期。過期天數(shù)是文件上傳指定天數(shù)后自動刪除,這是對象存儲自動處理的,不需要人或者程序的干預(yù);截止日期顧名思義,就是到指定日期,文件就自動刪除了,筆者很少使用。
選擇設(shè)置過生命周期的Bucket 中的文件,右鍵菜單選擇過期日期選項(xiàng)時(shí),可以查詢當(dāng)前文件的過期日期;沒有設(shè)置時(shí),系統(tǒng)也會彈窗提醒報(bào)錯(cuò)。
本地文件管理模塊可以設(shè)置對本地文件進(jìn)行復(fù)制或刪除的規(guī)則,用來實(shí)現(xiàn)更復(fù)雜的自動化任務(wù)。
在本地文件管理模塊可以制定操作類型(復(fù)制、刪除)、正則表達(dá)式、源路徑、目標(biāo)路徑等規(guī)則,并可以選擇啟用和關(guān)閉該規(guī)則。在掃描器掃描指定路徑時(shí),會同時(shí)加載該模塊的規(guī)則。
比如,筆者想要每天上傳文件的同時(shí),還需要每個(gè)月單獨(dú)保留一個(gè)副本,這個(gè)需求就可以配合本地文件管理模塊來實(shí)現(xiàn)。假定,每月1 日的文件作為要單獨(dú)保留的副本,筆者就可以制定策略,將1 日的文件在傳輸前單獨(dú)復(fù)制一份,然后上傳到單獨(dú)的Bucket 中,并單獨(dú)設(shè)置生命周期策略。
對象存儲管理系統(tǒng)的設(shè)計(jì)與開發(fā),主要目的是為了解決重要數(shù)據(jù)的自動化上傳和管理的問題。通過信息系統(tǒng),充分利用對象存儲的特點(diǎn),實(shí)現(xiàn)了對醫(yī)院重要數(shù)據(jù)安全可靠的備份,同時(shí),盡可能減少了管理人員的工作壓力。本文對對象存儲管理系統(tǒng)的各個(gè)功能模塊進(jìn)行了比較細(xì)致的說明,整個(gè)系統(tǒng)比較符合用戶的操作使用習(xí)慣,也擁有比較合理的程序界面設(shè)計(jì),這樣,既能保證軟件功能的完善,又能降低使用者的操作難度。保質(zhì)保量的完成了國家對醫(yī)院信息化安全的要求。