半开源项目一之双机热备软件设计框架以及技术选型



双机热备需求及方案



n  名词解释:



双机热备:双机热备特指基于高可用系统中的两台服务器的热备(或高可用),因两机高可用在国内使用较多,故得名双机热备,双机高可用按工作中的切换方式分为:主-备方式(Active-Standby方式)和双主机方式(Active-Active方式),主-备方式即指的是一台服务器处于某种业务的激活状态(即Active状态),另一台服务器处于该业务的备用状态(即Standby状态)。而双主机方式即指两种不同业务分别在两台服务器上互为主备状态(即Active-StandbyStandby-Active状态)。具体可google



 



n  需求:



1、
业务切换:一台机器发生故障时另一台机器自动接手业务并负责运行,业务交换时间不得长于五分钟。



2、
数据同步:两台机器所拥有的以支持业务正常运行的数据保持一致,其中异步误差不得超过五分钟。



3、
对外提供统一访问接口:外部访问主备机时,标识符一致。



 



n  框架方案:



1、
双机热备软件内嵌:



双机热备软件作为需要双机热备功能的软件系统的一个功能组件。



2、
双机热备软件外部独立



双机热备软件作为一个单独的工具软件,以托管方式管理需要双机热备功能的软件,独立于被托管软件,且支持托管多个。



 



u  比较:



1、
双机热备软件内置于需要双机热备功能的软件之中则双机热备软件为定制功能,需求固定变化点少,开发相对容易简单,缺点是每一款需要双机热备功能的软件都需要编写独自的双机热备模块。双机热备模块的开发受需要双机热备功能软件所采用语言及框架设计的局限。维护成本高,在新的软件中需要双机热备功能时,开发人员需要重新编写代码进行定制并要负责大量白盒测试,后期开发成本高。



2、
双机热备软件作为工具软件独立,非定制。设计阶段需求相对不固定,变化点多,初期开发难度大,成本高。优点:开发灵活,通用,不局限于具体软件。仅需开发一套双机热备软件,可满足基本所有产品的双机热备功能需求,并可作为单独商品销售。对于产品维护较简单,在新的软件中应用双机热备软件时,仅需功能测试。



 



u  结论:针对当前电力、电信、楼宇、煤矿等监控行业背景结合各家产品对于平台软件的需求、产品的特性,本文使用第二种。



 



n  详细方案:业务切换、数据同步、统一访问接口。



 



u  业务切换:一台机器发生故障时另一台机器自动接手服务并负责运行,服务交换时间不得长于五分钟。此处具有争议的主要为:主备机关系、服务进程侦听。



  主备机关系:



1、
绝对概念:主机为绝对主机,备机为绝对备机。主机瘫痪之后备机启动,当主机恢复正常时则自动从备机手中接手业务进入活动状态,而备机进入侦听状态,不支持手动切换。



2、
相对概念:当前运行的系统为主机,处于侦听状态的为备机。当备机接手主机业务后将取代主机地位作为主机运行,而主机则进入备机角色。支持手动切换功能。如北京煤科院人员定位KJ236系统。



 



²  比较:



1、
主备机切换必然导致部分数据的丢失降低系统可靠性,而双机热备的初衷为降低数据丢失增加系统可靠性。而第一种会额外增加1倍的数据丢失,即主机瘫痪时丢失一次,主机恢复正常时丢失一次。第二种仅在主机瘫痪时丢失一次。



²  结论:本文采取第二种,主备机相对的概念。



 



  进程侦听的方案:



²  Windows下:



ü  文件映射:进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容WIN32API中允许多个进程访问同一文件映射对象,各进程在自己的空间内接受内存的指针,通过使用这些指针实现数据的共享,以实现进程之间信息交互。



实现方法:



1.  
继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄



2.  
命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程



3.  
句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限



ü  共享内存:文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE)表示对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。



ü  邮件槽:提供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消 息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个邮件槽实现进程间的双向通信



ü  匿名管道:父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写 端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程



ü  命名管道:服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器 建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信



ü  剪贴板:Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个中介,Windows已建立的剪切(复制)-粘贴的机制为不 同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何 其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式



ü  动态数据交换:使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据DDE 和剪贴板一样既支持标准数据格式(如文本、位图等),又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板操作几乎总是用作 对用户指定操作的一次性应答-如从菜单中选择Paste命令。尽管DDE也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。DDE有三种数据交 换方式



1.  
冷链:数据交换是一次性数据传输,与剪贴板相同。



2.  
温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。



3.  
热链:当数据交换时服务器自动给客户发送数据。



ü  对象链接和嵌入: 用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档)OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服务。 例如,OLE支持的字处理器可以嵌套电子表格,当用户要编辑电子表格时OLE库可自动启动电子表格编辑器。当用户退出电子表格编辑器时,该表格已在原始字 处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展,而如果使用DDE,用户要显式地启动电子表格编辑器。



ü  远程过程调用:Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,这使在网络上用RPC进行进程通信就像函数调用那样简单。RPC既可以在单机不同进程间使用也可以在网络中使用



ü  动态链接库:Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题



ü  SOCKETWindows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网络编程接口。除了Berkeley Socket原有的库函数以外,还扩展了一组针对Windows的函数,使程序员可以充分利用Windows的消息机制进行编程



ü  WM_DATACOPY当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的 起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息



²  LINUX:暂不作考虑



备注:管道(Pipe)是一种具有两个端点的通信通道有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写



²  比较:



l  文件映射:文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步



l  共享内存:由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间



l  匿名管道:单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间



l  命名管道:提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,但当面对多个客户端时将显得力不从心



l  邮件槽:通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。邮件槽与命名管道相似,不过它传输数据是通过不可靠的数据报(TCP/IP协议中的UDP)完成的,一旦网络发生错误则无法保证消息正确地接收,而命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力



l  剪贴板:一个非常松散的交换媒介,可以支持任何数据格式,每一 格式由一无符号整数标识,对标准(预定义)剪贴板格式,该值是Win32 API定义的常量;对非标准格式可以使用Register Clipboard
Format
函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以转化为某种格式就行。但剪贴板只能在基于Windows 程序中使用,不能在网络上使用



l  动态数据交互:DDE交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE数据格式进行应用程序之间特别目的IPC,它们有更紧密耦合的通信要求。大多数基于Windows的应用程序都支持DDE



l  对象链接和嵌入:DDE技术相同



l  动态连接库从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存的方法更好一些



l  远程过程调用: Win32 API提供的RPC服从OSF-DCE(Open Software Foundation
Distributed Computing Environment)
标准。所以通过Win32 API编写的RPC应用程序能与其它操作系统上支持DECRPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程序



l  SOCKET通信:Sockets的跨平台性要比其它IPC机制好得多,另外WinSock 2.0不仅支持TCP/IP协议,而且还支持其它协议(IPX)Sockets的唯一缺点是它支持的是底层通信操作,这使得在单机的进程间进行简单数 据传递不太方便



l  VM_DATACOMPYWM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下



²  结论:鉴于SOCKET套接字的网络功能,本文采用其中的SOCKET通信。



 



u  数据同步:两台机器所拥有的以支持业务正常运行的数据保持一致,其中异步误差不得超过五分钟。市场上数据同步主流模式为:



  硬同步:由共享存储介质实现数据同步,其中常用磁盘柜型号为DS3400,支持两台机器同时共享其磁盘。



  软同步:由软件实现,常用磁盘柜型号为DS3000。主备机各自使用自身所拥有的磁盘,由软件实现两个磁盘之上的数据一致。其中软同步,软件在数据同步方面主要分以下模式:



1、
同步:主机将需要同步的数据发送到备机,备机接手完全之后开始同步操作。主机等待备机同步完毕之后开始下一次同步。



2、
异步:主机将需要同步的数据交付备机,等待备机接手之后,则进行下一次交付。



 



²  比较:



1、
采取同步机制,则单次数据同步的周期≈(主机获取数据时间+主机发送数据至备机时间+备机执行相关操作时间)×(需同步数据总记录数÷每次同步记录数)。而采用异步机制,则同步周期≈主机发送\数据至备机时间×(需同步数据总记录数÷每次同步记录数)。



2、
同步机制对于主机备机性能消耗较大,当同时托管多个系统时,数据同步响应较差。



²  结论:本文采用异步机制实现数据同步。



  软件应支持硬同步和软同步,由用户选择。本文支持两种模式。



u  统一访问接口:外部访问系统时,标识符一致。外部用户无需关心当前工作系统到底为其中哪一台机器。实现机制主要为VIP(虚拟IP)。当前活动主机创建虚拟IP,并对外发布,当服务切换时,之前主机删除IP,激活的备机在充当主机角色之前首先创建虚拟IP,以保证整个系统对服务接口一致。



 



 



 



n  具体实现方案:



 



u  预定义:



  心跳连接端口:40000。数据通道端口4000140002文件通道端口。



  心跳命令:格式为进程标识+命令



1、
0A0A:请求状态



2、
0F0F:状态回复,正在运行。



3、
F0F0:状态回复,关闭。



4、
CFCF:强制对方关闭服务。



  数据同步命令:



1、
0D0D:请求最新数据库更新文件



2、
D0D0:请求回复,有最新数据库更新文件文件,回复格式为D0D0++文件名长度(1BYTE+文件名+文件内容长度(2BYTES+文件内容。D0D0000000表示没有最新数据库更新文件。



3、
0F0F:请求最新文件



4、
F0F0:请求回复,格式为F0F0 +文件名长度(1BYTES+文件名+文件内容长度(2BYTES+文件内容。D0D0000000表示没有最新文件。



  数据文件:



1、
SENDDATA:本机最新数据文件存放处



2、
RECEIVEDATA:本机接收到的最新数据文件存放处



3、
SENDFILE:本机最新文件存放处



4、
RECEIVEFILE:本机接收到的最新文件存放处



u  运行步骤:



  业务切换:



1、
双机热备软件启动,开启本地端口400004000140002,处于侦听。尝试连接远程端口40000



2、
连接失败,创建虚拟IP,开启本机服务。并每隔指定时间尝试下一次连接,直至连接成功。如果创建虚拟IP失败,则开始周期性创建虚拟IP,直至成功。



3、
连接成功,发送0A0A请求对面状态,获得0F0F时,对照本机服务状态,如果也正在运行,则检查本机是否为事先指定主机,如果是,本机服务器仲裁标志位置1,,否则跳过。



4、
本机服务器端口侦听接受外部连接。接受到连接时则开始响应远程客户端数据请求。接收到0A0A时,首先检查本机仲裁标识,如果为1,则回应CFCF告知远程备机关闭业务。否则如果本机服务正在运行,则回复0F0F,如果本机不在运行,则回复F0F0



5、
接到CFCF命令,关闭本机业务,删除虚拟IP



6、
接收到F0F0时,如果本机服务未处于运行状态,则开启本机服务。



  数据同步:



²  数据库同步:



1、
数据库自身实现更改记录,并将生成的文件置于SENDDATA



2、
客户端请求连接40001,连接失败则按照预定周期重复尝试连接,直至成功。



3、
连接成功,客户端发送0D0D请求最新文件。服务器检查SENDDATA并检查本机服务状态,如果处于运行,则将SENDDATA中文件按照时间降序排列以文件作为单位发送,每次发送一个文件。发送完毕之后,删除文件。如果未处于运行状态,则删除SENDDATA中的文件,回应D0D0000000至客户端。



4、
客户端接受到回应之后,如果接收到文件,则将文件放置在RECEIVEDATA文件夹中。进行下一次数据请求。重复进行。如果接收到的为D0D0000000则休眠一段时间之后继续进行下一次数据请求。



5、
数据库检查REVEIVEDATA文件夹,根据其中文件进行自身更新操作。



²  文件同步:



1、
单独线程负责定时复制指定文件至SENDFILE。默认为30秒钟。



2、
客户端请求连接40002,连接失败则按照预订周期重复尝试连接,直至成功。默认为六秒。



3、
连接成功,客户端发送0F0F请求最新文件。服务器检查SENDFILE与自身服务状态。如果本机服务处于运行,则将SENDFILE中的文件按照生成时间降序排列,以文件作为单位依次发送,发送完毕之后删除对应文件。如果本机未处于运行状态,则删除文件,回应F0F0000000至客户端。



4、
客户端接收回应之后,如果接收到文件,则将文件放置在RECEIVEFILE文件夹下,进行下一次文件请求操作。重复进行。如果接收到的为F0F0000000则休眠一段时间继续进行下一次文件请求。



5、
单独线程负责定时检查RECEIVEFILE文件夹,将其中文件复制替换到服务对应位置。



 



n  扩展功能:



u  多数据库支持,支持sqlserverorclmysqldb2



u  多文件格式支持,xmlinidattxtconfig



u  支持筛选列、筛选行,支持定制同步。用户可根据需求选择自己要同步的数据



 



n  功能模块



u  网络通信模块:



  作为服务器开启本地端口,400014000240003。作为客户端连接远程400014000240003端口。



  负责服务切换相关网络指令收发与执行。



  执行数据同步文件交互以及文件夹中文件管理



u  数据层模块:生成数据文件,以及执行数据文件,以实现数据同步。对外接口为SENDDATARECEIVEDATASENDFILERECEIVE文件夹。生成文件部分为将需要同步的数据或操作生成文件之后,放置于SENDDATASENDFILE文件夹中。数据文件执行部分为从RECEIVEDATARECEIVEFILE文件夹中获取数据,并负责执行。



 



你可能感兴趣的:(开源项目)