MICAPS数据文件存储系统的设计与实现
2015-10-21卢绍宗鲁玲
卢绍宗 鲁玲
摘要按照气象台站存储管理MICAPS数据文件、构建本地气象数据中心、促进气象业务发展的要求,基于模块化设计原理,设计了一种MICAPS数据文件存储系统。系统应用面向对象技术、线程技术、.NET框架等编程实现MICAPS数据文件的自动化存储,对资料进行逐日压缩备份。系统包括自动压缩备份模块和手动压缩备份模块,在自定义类中调用WinRAR,然后在主程序中调用该类将MICAPS数据文件压缩为RAR文件,既节省服务器存储空间,又方便日后使用和管理。系统采用C#编程实现,在用户层面和结构层面都有良好的表现。
关键词MICAPS;数据文件;存储;压缩备份
中图分类号S126文献标识码A文章编号0517-6611(2015)31-362-03
Design and Implementation on Storage System of MICAPS Data Files
LU Shaozong, LU Ling(Beihai Meteorological Bureau, Beihai, Guangxi 536000)
AbstractBased on the requirements for storage management of MICAPS data files, construction of local meteorological data center and promoting development of meteorological business, according to the modular design principles, a storage system of MICAPS data files is designed, the system takes advantage of objectoriented programming, threading technology and .NET Framework to achieve the automatic storage of MICAPS data files. The system can compress and backup files daily, including automatic and manual compress and backup modules, the system is devised to call WinRAR in selfdefining class. The main program then call the class to compress MICAPS data files to RAR files. This can save disk space of the server. It is convenient for using and managing the files in the future. The system is implemented by C# programming language and proved to be good in the levels of user and structure.
Key wordsMICAPS; Data files; Storage; Compress and backup
隨着气象现代化事业的发展,对气象业务信息化也提出了新的要求,构建本地气象数据中心是一项重要的工作,可进一步实现气象资料自动化存储和数据共享,提高气象业务数据的利用率,促进业务发展。
MICAPS系统是气象台站中短期天气预报业务的主要工作平台[1]。目前中国气象局新一代卫星广播系统CMACast大幅增加了气象资料广播的种类和数量,地市级气象台每日接收的卫星广播数据超过200 G,生成的MICAPS产品数据文件超过20 G。由于本地MICAPS服务器存储空间有限,需要定时删除数据文件以保证系统的正常运行。在专用服务器上及时备份MICAPS产品数据文件,保证资料的完整,积累气象档案,构建本地业务数据应用环境,是提高天气预报准确率、增强气象台站业务、科技服务和科研能力的基础,对提高工作效率也有很大帮助[2]。为实现MICAPS产品数据文件自动化存储模式并保障数据安全,笔者设计了一种MICAPS数据文件存储系统,应用面向对象编程技术、线程技术、.NET框架等实现MICAPS服务器产品数据文件在另一台专用服务器上的自动化存储,逐日定时分类压缩过去24小时的MICAPS产品数据文件。该存储专用服务器上的压缩文件可以通过网络共享或FTP下载的方式实现对气象业务及科研工作的支持。
1系统设计
1.1系统功能设计对系统功能进行设计时按照“高内聚、低耦合”的原则,采用模块化设计,将系统划分为2个功能模块,即自动压缩备份MICAPS数据文件模块和手动压缩备份MICAPS数据文件模块。使用WinRAR创建RAR格式的压缩文件能提供较好的压缩率,并允许物理受损的数据的恢复。RAR格式能锁定重要的压缩文件,防止意外更改。此外,RAR格式可以管理的文件大小几乎是无限制的。因此,系统采用WinRAR软件压缩保存MICAPS产品数据文件,便于日后对文件的管理和维护。
正常情况下,系统在每天设定的时间分别对前24 h的8个MICAPS产品数据目录surface、high、physic、fy2、japan 、japan_thin、ecmwf、ecmwf_thin下的文件进行自动压缩备份,生成8个RAR文件。当自动备份失败时,可以运行手动备份程序完成相关目录文件的备份。
自动压缩备份MICAPS数据文件模块工作流程见图1。
1.2系统配置在存储专用服务器上安装运行MICAPS数据文件存储系统软件。该服务器型号为DELL PowerEdge R730,磁盘阵列级别设为RAID5,安装Windows Server 2008,存储空间约为5.4 TB,使用NTFS磁盘格式并选择压缩驱动器以节约磁盘空间。该服务器与本地MICAPS服务器位于同一个局域网内。
2系统实现
系统开发平台选择Visual Studio 2010集成开发环境,在.NET框架下,使用面向对象的程序设计语言C#进行开发。
2.1自动压缩备份MICAPS数据文件模块自动压缩备份MICAPS数据文件模块基于定时器触发运行。在存储专用服务器上将本地MICAPS服务器产品数据目录映射为“X:\”,在系统中将待备份文件目录设置为“X:\”。在该模块中设计有2个类,分别完成2个功能。Syslog类实现写日志功能,CWinRAR类实现文件压缩备份功能。在模块中声明3个全局变量format1、zippath1和myThread。将字符型变量format1初始化为“yyyyMMdd”,用于表示日期格式。zippath1是一个int类型的一维数组,该数组中包含8个元素,初始化其中的元素值分别为surface、high、physic、fy2、japan 、japan_thin、ecmwf、ecmwf_thin,代表需要压缩的文件夹名称。myThread是程序中将要创建的线程。
在模块中添加timer控件并定义为timer1,用于定期引发事件。将timer1的Interval属性设置为86 400 000 ms。定义方法SetTimer1() ,在该方法中设置每天12:00定时执行压缩备份操作。此外,模块还定义了RunFileBak()方法,该方法实例化CWinRAR类的一个对象,并使用该对象名调用RAR方法,实现文件自动压缩备份并在文本框中给出相应的运行信息,说明系统当前的运行情况。因为程序执行打包压缩操作比较费时间,会导致用户界面长时间处于停滞状态,因此在模块中创建一个线程去执行压缩操作,避免出现用户界面停滞的情况。
正常情况下,文件压缩完成后,在当天的备份目录下将生成surface_yyyyMMdd.RAR、high_yyyyMMdd.RAR、physic_yyyyMMdd.RAR等8个文件(“yyyyMMdd”表示当天的年月日格式)。
完成写日志功能的Syslog类的关键代码如下:
public static void Add_log(string LogInfo)
{
StreamWriter sw = File.AppendText(@"e:/log/SysLog_cf.log");
sw.WriteLine(DateTime.Now.ToString() + ": " + LogInfo);
sw.Close();
}
完成文件压缩备份功能的CWinRAR类需要引用Microsoft.Win32命名空间,该命名空间提供了2个用于注册表操作的类,即Registry类和RegistryKey类。在程序设计中,通过Registry类找到注册表中指定的主键,再通过RegistryKey类打开指定的子键并获取该子键的键值[3]。CWinRAR类的关键代码如下:
public bool RAR(string path, string rarPath, string rarName)
{
bool flag = false;
string rarexe;
RegistryKey regkey;
Object regvalue;
string cmd;
ProcessStartInfo startinfo;
Process process;
try
{
regkey = Registry.ClassesRoot.OpenSubKey(WinRAR_KEY);
regvalue = regkey.GetValue("");
rarexe = regvalue.ToString();
regkey.Close();
rarexe = rarexe.Substring(1, rarexe.Length - 7);
Directory.CreateDirectory(path);
cmd = string.Format("a {0} {1} –r –ibck –tn24",
rarName,
path); //在后臺压缩过去24小时的文件(含子目录下的文件)
startinfo = new ProcessStartInfo();
startinfo.FileName = rarexe;
startinfo.Arguments = cmd;
startinfo.WindowStyle = ProcessWindowStyle.Hidden;
startinfo.WorkingDirectory = rarPath;
process = new Process();
process.StartInfo = startinfo;
process.Start();
process.WaitForExit();
if (process.HasExited)
{
flag = true;
}
process.Close();
}
catch (Exception e)
{
throw e;
}
return flag;