前几年我开发过一个软件系统,为使用者提供7×24小时不间断的服务。为了确保服务质量,采用了双机热备的形式。双机系统能够正常工作的关键技术之一,就是主备机之间的数据同步。下面介绍的数据同步方法是以网络文件共享服务为基础实现的,简单易行,安全可靠,在当时时间紧、任务重、投资有限的情况下,应用效果比较理想。
Windows网络文件共享服务
在Windows系统环境中,一台计算机可以作为服务器向局域网中的其它计算机(客户机)提供“文件共享服务”。通过这项服务,客户机用户能够像访问本地文件一样通过网络对服务器上的共享文件进行一系列操作。
当用户通过客户机连接到服务器的共享位置时,他们可以:
- 打开文件
- 保存文件
- 删除文件
- 创建、修改和删除文件夹
- 执行其他任务
客户机访问服务器上共享文件位置的方法有多种,如网上邻居、映射网络驱动器等。这里我们采用适合软件编程实现的“UNC路径访问法”。
UNC (Universal Naming Convention) “通用命名约定”,用于确定保存在网络服务器上的文件位置。UNC符合“\servernamesharename”格式,其中 servername 是服务器名,sharename 是共享资源的名称。目录或文件的 UNC 名称可以包括共享资源名称下的目录路径,格式为:\servernamesharenamedirectoryfilename,其中directory是目录名,filename是共享文件名。
本数据同步方法的设计思路是:当双机间需要进行数据同步时,主机作为客户机,利用“UNC路径访问法”打开备机(服务器)的数据文件(共享文件),将最新的运行数据写入数据文件中。这样就能够确保主、备机之间数据的一致性。
由于网络文件共享服务是Windows操作系统提供的基于TCP/IP协议的标准服务,而且服务器在提供服务前需要客户机提供有效的访问凭据(如域的名称、用户名称和密码),用户能够进行的操作也取决于被授予的权限,因此利用网络文件共享服务,结合文件操作、Ping等通用技术,可以实现免数据库、安全、便捷、易维护的双机热备系统数据同步机制。
服务配置过程
由于网络文件共享服务不是Windows操作系统提供的缺省服务,因此需要通过以下步骤进行配置:
图1.服务配置步骤
第一步,在双机中安装Windows操作系统。通常,Windows 2000或更高版本的操作系统都能够提供网络文件共享服务。
第二步,在双机的操作系统中建立同样的用户,使用同样的密码,并确保该用户对各自的共享文件和目录具有创建、读、写、修改和删除权限。如此设置,能够保证客户机顺利通过服务器的安全验证,并访问服务器的共享资源。
第三步,在操作系统中安装TCP/IP协议,并确保处于同一局域网中的双机能够进行正常通信。
第四步,在操作系统中安装“Microsoft网络客户端”和“Microsoft网络的文件和打印机共享”两个网络组件。这些组件是操作系统对外提供文件共享服务的基础配置。
此时配置完成,双机已经具备了互为服务器和客户机的条件。
数据同步的实现
具体的双机间数据同步操作是由运行于操作系统中的应用软件执行的。数据同步操作通常由主机中的应用软件发起,因此它的执行流程是:
图2. 主机数据同步流程
在上述流程中,主机应用软件首先“将数据写入本地数据文件”,其目的是保证应用软件在遇到强制关闭等情况后不丢失运行数据,待重新启动后能够从本地数据文件中获得数据,继续以正常方式运行。
“向备机执行Ping操作”目的是查看当时主备机之间的网络是否通畅,为后续的数据文件操作提供保障。Ping(Packet Internet Groper,因特网包探测器)操作是通过向目标IP地址发送ICMP(Internet Control Messages Protocol,因特网控制报文协议)回声请求消息,并依据对方是否应答来判断网络的通断状况。在这里,可以将备机的IP地址写在应用软件的配置文件中,应用软件在启动阶段读取该IP地址,并作为UNC路径访问和Ping操作的参数使用。
执行“通过UNC路径访问备机的数据文件”操作的C++代码如下:
1 CFile NetLogFile; 2 CString strFileName; 3 strFileName.Format("\\%s\c$\StaTerm\LOG.tmp",m_strBackUpIP); 4 5 //打开备机数据文件LOG.tmp 6 try 7 { 8 if (!NetLogFile.Open(strFileName, CFile::modeCreate | CFile::modeWrite )) 9 { 10 TRACE0(" 无法打开备机数据文件LOG.tmp "); 11 return; 12 } 13 } 14 catch ( CException* pe1 ) 15 { 16 TRACE0(" 系统打开备机数据文件LOG.tmp时出错! "); 17 pe1->Delete(); 18 return; 19 }
上述第3行代码就是采用UNC路径访问法确定备机数据文件位置。这样就保证了可以在第8行使用本地文件打开函数(CFile::Open)打开备机上的网络共享数据文件,从而降低了软件开发的难度和复杂度。
在执行“将数据写入备机数据文件”操作时,主机应用软件可以有两种方法完成向备机的数据同步:
- 打开备机数据文件,将主机的数据直接写入,关闭文件;
- 将主机的最新数据文件直接复制到备机的数据文件目录中,覆盖备机原有数据文件。
对于备机中运行的应用软件,一般情况下不对其本机的数据文件进行读写操作,避免对主机执行同步操作的影响。只有在接到双机主备裁决模块发来的升为主机状态的命令时,该应用软件才会从本机数据文件中读取数据,并进入正常执行逻辑。由于此时的数据文件通过前一次同步过程得到了更新,已与原主机的最新数据保持一致,因此就实现了在主备切换时双机间数据同步的功能。