吕 敬,宋 丹,王文勇,苏静文,唐远志
(1.贵州省气象服务中心,贵州 贵阳 550002;2.贵州省安龙县气象局,贵州 安龙 552400)
为人民提供精准、及时的气象服务是气象部门的职责之一[1]。其背后离不开ISOS软件对温度、湿度、风向风力等气象要素数据的采集及存储。由于病毒攻击、市电断电、电脑故障和操作失误等时刻威胁着ISOS数据的安全性,因此,及时将测报数据进行本地、异地备份成为台站数据保护的主要措施[2]。
目前,为保护ISOS软件测报数据的安全性,台站多使用批处理或借助第三方备份软件进行数据备份。
基于DOS命令建立的批处理,其优点是程序简单易写,只需编写少量的命令行并保存为.BAT文件,通过添加到Windows任务计划的方式执行备份任务[3]。由于批处理本质是Windows下的DOS命令行,执行效率较高,备份任务较快,但由于ISOS软件存在小时、分钟、雨滴谱等不同类型的测报数据[4],备份数据时需要设置不同的定时任务,这增加了批处理的冗余度,存在备份失效的风险。在重新调整备份时间时需要重新修改DOS命令行,使用时欠缺快捷性。
第三方备份软件如FileAutoSyncBackup,由于省却了开发环节,可直接下载使用,具有一定的便利性。但由于气象观测要素跨20时为下一个日界[5-8],第三方软件无法识别并处理气象日界,导致备份内容缺测;ISOS测报数据多以.txt文档保存,由于ISOS软件内部工作机制,不会对.txt文档进行实时保存,即保存时间与写入时间不一致,而第三方软件以保存时间作为文档最后更新时间,这会导致备份文件与源文件数据不一致,使得备份失效;此外,付费的第三方备份软件也会增加部门预算,加大了使用成本。
因此,针对ISOS软件独立开发快速、高效的备份系统对台站的工作意义重大。
台站测报数据保存在本地D盘,因此,系统将本地D盘文档作为源文档。为尽可能提高数据安全性,发挥数据备份的最大作用,设置本地T盘和另一台异地物理机通过映射方式映射为Z盘作为目标文件,即将D盘数据同时备份到本地T盘和异地Z盘。
由于台站观测的气象要素多,导致ISOS软件测报数据量大,结合测报数据的重要程度和台站需要,系统对表1所示的目录及根目录进行数据备份。
表1 备份目录及描述Tab.1 Backup directory and description
(1)遍历最新文件。由于ISOS测报数据文件多以日期进行命名,因此,对于不同的ISOS测报数据文件,可以编成Python程序遍历文件名的日期进行区分,关键代码如下:
def get_date(file_name):
Title_date = ((file_name.split("")[-1]).split(".")[0]).split("_")[-1]
return Title_date
如遍历分钟数据文件:“MinuteAWS_M_Z_57908_20230110.txt”返回文件日期:20230110,利用此方法可以索引出目录下的最新文件。
(2)确定目标文件。目前的第三方备份程序多以.txt最后的保存时间来判断文件是否为最新文件,但由于ISOS软件在写入测报数据时不会对.txt文档进行实时保存,导致第三方备份程序备份失效。因此,本文设计的备份系统不以保存日期来确定目标文件,而是利用ISOS测报文件的命名规律,通过对比索引文件名中的日期与当前日期来判断文件夹下是否产生最新测报文件,以此确定需要备份的目标文件。
(3)跨日界问题。测报数据跨20时会产生后一日的测报文件,为解决气象要素跨日界的问题,本文设计的备份系统在备份时通过索引文件日期判断当日是否有跨日界文件,若存在,则该文件也是备份的目标文件。如在判断分钟数据文件夹下是否有备份目标文件的判断语句为:
if (get_date(file_D_name) == now_time_Ymd()) or (get_date(file_D_name) == now_time_Ymd_add1())
其中get_date(file_D_name)为遍历文件索引出的文件日期,now_time_Ymd()为当前年月日的日期,now_time_Ymd_add1()为后一日日期。通过对比索引出的日期与当前日期可解决测报数据跨日界的问题。
(4)补齐测报文件。首次使用本文设计的备份系统或考虑到市电断电、业务电脑故障等因素,目标盘可能缺失过去一段时间的测报文件。因此,当本文设计的备份系统检测到目标盘缺失测报文件时,可将缺失的测报文件补齐。执行程序如下:
if not os.path.exists(file_T_name):
txt_records.write(′T盘文件:%s 不存在,正在备份中... ' % file_T_name)
if os.path.isfile(file_D_name):
shutil.copy2(file_D_name, file_T_name)
txt_records.write(′T盘文件:%s 备份完成! ' % file_T_name)
if not os.path.exists(file_Z_name):
txt_records.write(′Z盘文件:%s 不存在,正在备份中... ' % file_Z_name)
if os.path.isfile(file_D_name):
shutil.copy2(file_D_name, file_Z_name)
txt_records.write(′Z盘文件:%s 备份完成! ' % file_Z_name)
针对ISOS测报数据的特点和不同的目录文件,系统设计不同的备份策略,以保证该目录下的测报数据能快速、完整地备份到目标文件。
小时数据每月产生1个新的.txt文档,分钟数据每日产生1个新的.txt文档,且生成的.txt不会自动保存为最新文档,结合气象要素跨日界的处理,设计小时数据、分钟数据的备份策略如图1所示。
图1 小时数据、分钟数据备份策略图Fig.1 Hourly data and minute data backup strategy diagram
备份小时数据的部分备份代码如下:
def backup_h_data_doing(source_path, destination_T_path, destination_Z_path):
for file in os.listdir(source_path):
file_D_name = os.path.join(source_path, file)
file_T_name = os.path.join(destination_T_path, file)
file_Z_name = os.path.join(destination_Z_path, file)
if not os.path.exists(file_T_name):
txt_records.write(′T盘文件:%s 不存在,正在备份中... ' % file_T_name)
if os.path.isfile(file_D_name):
shutil.copy2(file_D_name, file_T_name)
txt_records.write(′T盘文件:%s 备份完成! ' % file_T_name)
if not os.path.exists(file_Z_name):
txt_records.write(′Z盘文件:%s 不存在,正在备份中... ' % file_Z_name)
if os.path.isfile(file_D_name):
shutil.copy2(file_D_name, file_Z_name)
txt_records.write(′Z盘文件:%s 备份完成! ' % file_Z_name)
if (get_date(file_D_name) == now_time_Ym()) or (get_date(file_D_name)==
now_time_Ym_add1()):
txt_records.write(′T盘文件:%s 是最新文件,备份中... ' % file_T_name)
os.remove(file_T_name)
shutil.copy2(file_D_name, file_T_name)
txt_records.write(′T盘文件:%s 备份完成! ' % file_T_name)
txt_records.write(′Z盘文件:%s 是最新文件,备份中... ' % file_Z_name)
os.remove(file_Z_name)
shutil.copy2(file_D_name, file_Z_name)
txt_records.write(′Z盘文件:%s 备份完成! ' % file_Z_name)
DataBase数据每月生成1个.db文件,且最新数据保存在该.db文件和AWZ.db文件中。DataBase数据备份策略如图2所示。
图2 DataBase数据备份策略图Fig.2 DataBase data backup strategy diagram
Awsnet数据每月生成1个新的文件夹,数据在文件夹下以.txt文件和.BIN文件格式保存。为提高备份效率,在备份Awsnet数据时直接对生成的文件夹进行遍历,设计的备份策略如图3所示。
图3 Awsnet数据备份策略图Fig.3 Awsnet data backup strategy diagram
备份Send数据时,对“Send”目录下的Data数据、intelligentweather数据、JL数据、sendbak数据、Unknown数据以及YDP数据进行备份。设计的备份策略如图4所示。
Tkinter是Python图形用户界面(Graphical User Interface,GUI)开发库和工具包的接口,是一个轻量级的跨平台GUI开发工具,兼容Windows、Macintosh和Unix等多个操作系统,支持标签、按钮和画布等多个组件,以及具有位图、锚点和控件等属性。设计的GUI具有灵活性强、可移植度高和页面风格良好等特点,可快速创建功能强大的应用程序[9]。
因此,为了方便操作和查看,利用Tkinter对系统进行可视化设计,用于人机交互。设计的GUI页面如图5所示。
图5 GUI页面图Fig.5 GUI page diagram
如图5所示,根据不同的备份策略,系统可接受用户对不同类型的测报数据进行定时备份。当用户输入时间后,点击“配置”按钮,系统记录配置时间;点击“开始”按钮,系统开始执行定时备份任务,并将当前备份进度显示在“backup_records.txt”文本文档中;点击“备份路径”按钮,可查看表1中具体的备份路径;“帮助”按钮对系统的操作进行了详细介绍。
最后,利用打包工具pyinstaller将程序打包成“气象台数据备份系统.exe”可执行程序,提升了备份系统的实用性。
实验环境由硬件环境和软件环境组成。系统测试采用的硬件环境和软件环境分别如表2、表3所示。
表2 硬件环境Tab.2 Hardware environment
表3 软件环境Tab.3 Software environment
根据备份策略,在GUI页面设置如下定时备份任务:
(1)“小时数据备份时间”设置为“1 h 2 min”,即每间隔1 h后的2 min执行1次小时数据备份;
(2)“分钟数据备份时间”设置为“6 min 20 s”,即每间隔6 min后的20 s执行1次分钟数据备份;
(3)“DataBase数据备份时间”设置为“1 h 20 min”,即每间隔1 h后的20 min执行1次DataBase数据备份;
(4)“Awsnet数据备份时间”设置为“1 d 20时20分”,即每天20时20分执行1次Awsnet数据备份;
(5)“Send数据备份时间”设置为“10 min 50 s”,即每间隔10 min后的50 s执行1次Send数据备份。
设置好备份时间后,分别点击“配置”按钮和“开始”按钮,系统执行备份任务。备份进度如图6所示。
图6 备份进度图Fig.6 Backup progress diagram
经台站多次实验,系统可按照设置的备份时间将表1目录下的文件夹及.txt、.db、.BIN等文件自动化备份到本地T盘和异地Z盘对应目录下。考虑台站业务机系统为Windows7,将系统在Windows7环境下进行测试,系统运行稳定,数据备份完整,目录齐全。
加强数据安全保护是台站确保业务正常运行的重要保障。本文设计的备份系统根据不同的ISOS测报数据类型,提出了不同的备份策略,有效解决了在备份中ISOS软件不会对.txt文档进行实时保存以及气象要素跨日界的问题。经多次实验,系统能及时有效地将测报数据自动化备份到目标文件夹下。目前,系统已在贵州省安龙县气象台投入业务运行,成为该台站ISOS测报数据的有效备份系统。