CN101398857B - 嵌入式分布式系统中数据同步的方法及嵌入式分布式系统 - Google Patents
嵌入式分布式系统中数据同步的方法及嵌入式分布式系统 Download PDFInfo
- Publication number
- CN101398857B CN101398857B CN2008102264704A CN200810226470A CN101398857B CN 101398857 B CN101398857 B CN 101398857B CN 2008102264704 A CN2008102264704 A CN 2008102264704A CN 200810226470 A CN200810226470 A CN 200810226470A CN 101398857 B CN101398857 B CN 101398857B
- Authority
- CN
- China
- Prior art keywords
- data
- message
- program
- distribution system
- information synchronization
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种嵌入式分布式系统中数据同步的方法及嵌入式分布式系统,方法包括:在所述嵌入式分布式系统的进程间通讯层上建立用于发布和同步数据的信息同步代码库;所述嵌入式分布式系统中部署有数据源的程序通过所述信息同步代码库发布数据;所述嵌入式分布式系统中待同步数据的程序通过所述信息同步代码库同步所述部署有数据源的程序发布的数据,生成镜像数据。系统包括部署有数据源的程序、待同步数据的程序及包括有服务端接口、服务端、客户端接口及客户端的信息同步代码库。通过创建信息同步代码库,并利用信息同步代码库进行数据同步,实现了数据同步机制的统一,极大地降低了代码冗余,提高了数据同步机制的可维护性及可扩展性。
Description
技术领域
本发明涉及嵌入式分布式信息同步的方法技术领域,尤其涉及一种嵌入式分布式系统中数据同步的方法及嵌入式分布式系统。
背景技术
嵌入式分布式系统是在由通信网络互联的多处理机体系结构上执行任务的嵌入式系统,包括分布式程序。分布式程序是指基于模块化设计考虑或由于程序部署于不同的硬件载体上而产生的、由多个程序模块协作完成某一特定功能的程序,包括核心程序及应用程序。分布式程序在空间上位于嵌入式分布式系统的分布中。这些分布可为软件空间,也可为硬件空间。
分布式程序采取对数据直接进行访问即直接内存访问的方式,以满足嵌入式系统要求快速的数据访问。其中,分布式程序需要访问的数据称为应用数据。为了满足分布式程序能够直接内存访问,一般将应用数据部署在分布式程序中。分布式程序的部署形式如图1所示,应用数据13被部署在一个应用程序模块11中,应用程序模块11中的业务逻辑12对应用数据13进行直接的存取操作,具有很高的数据存取访问效率。
但是,分布式程序之间往往具有数据信息共享的需求,因此,需要分布式程序相互之间进行数据信息共享。数据信息的共享分为数据同步共享和数据服务共享两种方式。
现有技术中,数据同步共享使用独立进程进行数据同步。但是,这种方案局限于某一应用程序的数据信息同步,且其设计实现必须有独立的用于进行数据库同步的进程,易造成数据库同步进程处理瓶径,以及数据保护的安全隐患。
或者,数据同步共享通过为分布式程序设计一个数据变化消息通告机制,把一个分布程式序的应用数据同步到另一个分布式程序,构成镜像数据。消息通告机制基本的消息类型包括:用于添加或修改一条应用数据的消息,及用于删除一条应用数据的消息。如图2所示,部署于第一分布式程序中的应用数据21为数据源。第二分布式程序以数据镜像的方式从数据源同步一份相同应用数据,即镜像数据22,第二分布式程序对应用数据的访问只需要对同步数据即镜像数据22进行访问即可。在应用数据发生变化时,第一分布式程序通过调用数据变化消息通告模块23将此变化通告给第二分布式程序,第二分布式程序的数据变化消息接收模块24接收到数据变化消息,更新镜像数据,实现应用数据与镜像数据的数据同步需求。
相应地,嵌入式分布式系统软件层次架构如图3所示。嵌入式分布式系统中的应用程序P1、应用程序P2、应用程序P3、应用程序Px分别使用数据变化消息处理模块Msg1、Msg2、Msg3、Msgx进行数据同步。
现有技术存在的缺陷在于:数据变化消息通告模块和数据变化消息接收模块的代码存在代码冗余、可维护性低及扩展性不强等问题。
一个嵌入式分布式系统中往往存在多个分布,分布中又包含多个分布式程序,隶属于不同分布的分布式程序之间也需要进行数据同步。这样,各个分布式程序均具有消息处理模块以实现数据同步共享,使得一个系统中各个隶属于不同分布式程序的数据变化消息通告模块和数据变化消息接收模块存在许多相似的逻辑,即产生代码冗余。如图4所示,分布41中包括分布式程序A1、分布式程序B1;分布42中包括分布式程序A2、分布式程序B2。分布41中的第一消息通告模块与第二消息通告模块虽然隶属于不同的分布式程序,并且所要同步的应用数据也不相同,但它们具有许多相似的逻辑,因此,存在代码冗余。类似地,第一消息接收模块和第二消息接收模块也存在代码冗余。
可维护性低下主要体现在消息通告机制的维护人员要实现消息通告的调 度,必须了解进程通讯机制、应用程序的应用数据结构及应用程序的调度机制。如图5所示,图5为图2的设计架构的软件层次图。数据变化消息通告模块51的维护人员要实现消息通告的调度,必须知道应用程序的调度机制;要构造出对应此应用数据的消息,必须知道应用数据的结构。并且,由于消息通告基于进程间通讯层52,要实现消息通告,必须了解进程间通讯机制。因此,维护难度较高。当涉及到一个系统内多个应用程序需要数据同步时,其维护难度就更高了。
现有技术中的应用数据扩展如图6所示。假设应用程序在扩展之前只需要同步一张库表--库表1,此时它的消息同步模块需要处理两个基本的消息:库表1的表项添加/修改消息以及库表1的表项删除消息。应用程序扩展一个新的需要同步的库表--库表2时,消息同步模块必须额外再增加两个消息:库表2的表项添加/修改消息及库表2的表项删除消息。通过新增消息来满足这种扩展需求,就需要扩展数据变化消息协议,导致需要修改很多代码,使得扩展性不强。类似的,如库表结构的扩展需求,一样需要对消息结构进行修改。如果涉及更高要求的扩展需求时,比如数据变化消息通告希望支持批量的数据变化通告,而不是一个消息一个变化通告,这种扩展需求产生的修改就更加困难了。
发明内容
本发明的目的在于提出一种嵌入式分布式系统中数据同步的方法及嵌入式分布式系统,以解决嵌入式分布式系统中数据同步所带来的代码冗余问题。
为实现上述目的,本发明提供了一种嵌入式分布式系统中数据同步的方法,包括:
在所述嵌入式分布式系统的进程间通讯层上建立用于发布和同步数据的信息同步代码库;
所述嵌入式分布式系统中部署有数据源的程序通过所述信息同步代码库 发布数据;
所述嵌入式分布式系统中待同步数据的程序通过所述信息同步代码库同步所述部署有数据源的程序发布的数据,生成镜像数据;
其中,所述信息同步代码库内部通过应用层上用于信息同步的协议报文进行交互;
所述协议报文包括消息头和消息体两部分;所述消息头包括用于标识消息类型、报文长度及应答对象的字段;
所述协议报文包括用于请求同步数据的打开报文、用于应答打开报文的打开回复报文、用于发送同步数据的更新报文及用于确认数据同步的确认报文;
所述打开报文的消息体包括用于标识客户端标识、协议版本、运行模式、同步时间间隔、批量传输的最大值、压缩算法类型及报文结束的字段;所述客户端标识用于在所述信息同步代码库内部建立连接;
所述打开回复报文的消息体包括用于标识所述客户端标识、所述协议版本、错误代码及指示信息的字段;所述指示信息与所述错误代码相对应,根据所述错误代码的值存放错误描述信息或带同步数据的编码信息;
所述更新报文的消息体包括用于标识库表标识及所述库表标识对应的库表的更新信息的字段;所述更新信息包括更新方式及更新信息长度。
本发明还提供了一种嵌入式分布式系统,包括部署有数据源的程序与待同步数据的程序,其中,所述部署有数据源的程序与待同步数据的程序之间连接有用于发布和同步数据的信息同步代码库;所述信息同步代码库包括:
服务端接口,用于提供所述信息同步代码库与所述部署有数据源的程序之间的交互接口;
服务端,用于通过所述服务端接口接收所述部署有数据源的程序发布的数据;
客户端接口,用于提供所述信息同步代码库与所述待同步数据的程序的交互接口;
客户端,用于通过所述客户端接口接收所述待同步数据的程序发起的数据同步请求,并从所述服务端获取发布的数据,进行数据同步,生成镜像数据。
上述技术方案通过创建信息同步代码库,并利用信息同步代码库进行数据同步,实现了数据同步机制的统一,极大地降低了代码冗余,提高了代码的重用性,大大简化了分布式应用程序的设计,同时也提高了数据同步机制的可维护性,及可扩展性。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
附图说明
图1为现有技术中分布式程序的部署形式示意图;
图2为现有技术中数据同步的示意图;
图3为现有技术中嵌入式分布式系统软件层次架构示意图;
图4为现有技术中存在多个分部的数据同步示意图;
图5为图2的设计架构的软件层次图;
图6为现有技术中的应用数据扩展示意图;
图7为本发明嵌入式分布式系统中数据同步的方法实施例中信息同步代码库在嵌入式分布式系统中的分布情况示意图;
图8为本发明嵌入式分布式系统中数据同步的方法实施例中通过IsLib75同步数据的示意图;
图9为本发明嵌入式分布式系统中数据同步的方法实施例中IsLib为两个以上的分布式程序提供数据同步服务的示意图;
图10为本发明嵌入式分布式系统中数据同步的方法实施例中通过IsLib生成的镜像数据保存在IsLib中的示意图;
图11为本发明嵌入式分布式系统中数据同步的方法实施例的流程图;
图12为本发明嵌入式分布式系统中数据同步的方法实施例中信息同步代码库的示意图;
图13为本发明嵌入式分布式系统中数据同步的方法实施例中信息同步协议报文格式示意图;
图14为本发明嵌入式分布式系统中数据同步的方法实施例中MESSAGE_HEADER格式示意图;
图15为本发明嵌入式分布式系统中数据同步的方法实施例中OPEN报文的MESSAGE_BODY格式示意图;
图16为本发明嵌入式分布式系统中数据同步的方法实施例中OPEN_REP报文的MESSAGE_BODY格式示意图;
图17为本发明嵌入式分布式系统中数据同步的方法实施例中UPDATE报的MESSAGE_BODY格式示意图;
图18为本发明嵌入式分布式系统中数据同步的方法实施例中db entry TLV格式示意图;
图19为本发明嵌入式分布式系统中数据同步的方法实施例中Same colu mns与diff columns格式示意图;
图20为本发明嵌入式分布式系统中数据同步的方法实施例中same column db entry与db entries的格式示意图;
图21为本发明嵌入式分布式系统中数据同步的方法实施例中NOTIFICATION报文的MESSAGE_BODY格式示意图;
图22为本发明嵌入式分布式系统中数据同步的方法实施例中IsServerEntry对象与IsClient对象之间的协议报文交互示意图;
图23为本发明嵌入式分布式系统中数据同步的方法实施例中初始化IsLib服务端的示意图;
图24为本发明嵌入式分布式系统中数据同步的方法实施例中初始化IsLib客户端的示意图;
图25为本发明嵌入式分布式系统中数据同步的方法实施例中IsServer接入处理操作的示意图;
图26为本发明嵌入式分布式系统中数据同步的方法实施例中IsServerEntry对象的状态机示意图;
图27为本发明嵌入式分布式系统中数据同步的方法实施例中IsServer的处理流程示意图;
图28为本发明嵌入式分布式系统中数据同步的方法实施例中IsClient更新数据示意图;
图29为本发明嵌入式分布式系统中数据同步的方法实施例中使用纯粹库的形式调度IsLib的运作示意图;
图30为本发明嵌入式分布式系统中数据同步的方法实施例的应用示意图。
具体实施方式
本发明实施例数据同步的方法将现有技术中的消息同步模块进行整合, 得到适应于嵌入式分布式系统中所有分布式程序的信息同步代码库(以下简称为IsLib)。IsLib功能明确单一,具有同步需求的分布式程序只需要利用此IsLib提供的接口,即可实现数据同步。IsLib在嵌入式分布式系统中的分布情况如图7所示。本发明实施例将原本隶属于不同分布式程序如第三分布式程序71、第四分布式程序72、第五分布式程序73及第六分布式程序74的各个应用数据变化消息通告机制抽象出IsLib75,使得各分布式程序不再需要单独拥有同步消息通告模块,也就不需要维护管理同步消息通告模块。凡有数据同步需求的分布式程序都可通过IsLib75来实现数据同步。IsLib75是一种应用协议,该应用协议的实现建立在进程间通讯层76基础上,不涉及进程间通讯接口。本发明实施例中,进程间通讯指的是进程间消息通讯。进程间消息通讯方式有UNIX DOMAIN通讯机制,TIPC通讯机制等,采用哪种进程间通讯机制与本发明实施例无关。
IsLib包括服务端与客户端,并设置有分别为服务端、客户端提供的接口。部署有数据源的分布式程序调用为服务端提供的接口,由服务端发布数据;带同步数据的分布式程序调用为客户端提供的接口,由客户端生成镜像数据,并同步后续更新的数据。通过IsLib同步数据的示意图如图8所示,管理数据源的分布式程序通过使用IsLib为IsLib服务端81提供的接口发布数据,经进程间通讯层82、通讯信道83传输到另一个物理分布或同一物理分布的进程间通讯层84,经IsLib为IsLib客户端85提供的接口将数据传输给需要同步数据的分布式程序,生成镜像数据,并同步数据源后续更新的数据。
IsLib也可为两个以上的分布式程序提供数据同步服务。如图9所示,部署有数据源的分布式程序91通过IsLib向多个分布式程序:分布式程序92、分布式程序93、...、分布式程序9N提供数据同步服务。分布式程序仍使用IsLib为服务端提供的接口,其它需要镜像数据的程序即分布式程序92、分布式程序93、...、分布式程序9N都使用IsLib为Client端提供的接口。
通过IsLib生成的镜像数据也可保存在IsLib中。如图10所示,第八分 布式程序102将对应于第七分布式程序101中的数据源生成的镜像数据存储在IsLib中。在第八分布式程序102需要访问数据时,向IsLib获取。这种情况下,IsLib为第八分布式程序102提供接口,并且,IsLib可将镜像数据保存在其自身维护的库表结构中,以供第八分布式程序102访问。
图11为本发明嵌入式分布式系统中数据同步的方法实施例的流程图。包括:
步骤111、在所述嵌入式分布式系统的进程间通讯层上建立用于发布和同步数据的信息同步代码库。
如图12所示,信息同步代码库可包含如下几个内部对象类:
IsServer: 信息同步服务端类;
IsServerEntry: 信息同步服务端对应的接入客户端类;
IsClient: 信息同步客户端类;
SynDatabase: 同步数据库类;
SynTable: 同步数据库库表类;
SynColumn: 同步数据库库表列类;
MySql: 数据库操作接口类;
SqlResult: 数据库查询结果类;
BitTable: 比特(Bit)索引容器类;
IsMessage: 同步协议消息解析类。
SynDatabase对应于一个分布式程序,可包含多个SynTable。每个SynTable由一组SynColumn组成。SynDatabase依据打开方式不同,分别对应于一个IsServer或一个IsClient。若SynDatabase以创建(Create)操作方式打开,则SynDatabase对应IsServer;若SynDatabase以打开(Open)操作方式打开,则SynDatabase对应于IsClient。IsServer维护接入的客户端对象,即IsServerEntry对象。由于IsServerEntry和IsClient都需要对同步协议消息进行解析,因此,IsServerEntry和IsClient都是IsMessage类的使用者。SynTable 是IsLib的核心,对应于一个BitTable。BitTable是IsLib具有统一存储形式的存储容器,所谓BitTable,只要是能对以可变长Bit为索引的存储容器即可,一般形式是二叉树形式。SqlResult是IsClient针对SynTable对数据进行查询或同步过程中获得的结果信息,作为SynTable类的工具类。MySql同样是SynTable的使用者,IsServer的SynTable对象是MySql的主要使用者。SynDatabase、SynTable、MySql以及SqlResult四个类对外分别提供有第一接口集合121、第二接口集合122、第三接口集合123及第四接口集合124,作为IsLib的接口集合。
第一接口集合121包括:接口1、接口2、接口3、接口4、接口5及接口6。
接口1即同步数据库创建(S)接口,详细定义如下:
描述:创建同步数据库对象;
角色:服务端;
参数:数据库名称;
返回:同步数据库对象指针。
接口2即同步数据库创建库表(S)接口,详细定义如下:
描述:为同步数据库对象创建库表;
角色:服务端;
参数:1.同步数据库对象指针;
2.库表描述字串,库表描述字串可类似于结构化查询语言(structured query language,SQL)语句中的CTREAT TABLE语句。如:
CREATE TABLE table(
column type
[NULL|NOT NULL][DEFAULT value]
[,...]
,PRIMARY KEY(column[,...])
)。
库表描述字串不限于使用SQL语句表达,还可为其它自定义的语句表达,如过程化语言(procedure language,PL)语句表达。主要用于为table命名,并说明申请此table的column,及column的类型,以及table由哪些column组成key。
返回:同步数据库库表对象指针。
接口3即同步数据库更新库表(S)接口,详细定义如下:
描述:同步数据库更新库表,在第一次同步WalkFunc中调用,或在应用程序数据信息发生变化时调用;
角色:服务端;
参数:1.同步数据库对象指针;
2.同步数据库库表对象指针或同步数据库库表名;
3.MySql对象指针。
MySql对象带有操作类型信息,向哪个IsServerEntry发送,未指明IsServerEntry,则表示向所有IsLib客户端都通告变更。
返回:错误码信息。
接口4即打开同步数据库(C)接口,详细定义如下:
描述:打开方式创建同步数据库对象;
角色:客户端;
参数:数据库名称;
返回:同步数据库对象指针。
接口5即打开同步数据库库表(C)接口,详细定义如下:
描述:打开方式创建同步数据库库表对象;
角色:客户端;
参数:1.同步数据库对象指针;
2.需要同步的库表描述字串。此描述字串类似于SQL的SELECT 语句。如:
SELECT column[,...]FROM table
为了减少IsLib的逻辑复杂度,所罗列的column必须包含在服务端创建库表时指定的所有key column。
返回:同步数据库库表对象指针。
接口6即进行同步操作(C)接口,详细定义如下:
描述:开始进行同步,用于指示IsLib可以开始向服务端建立连接进行数据同步;
角色:客户端;
参数:同步数据库对象指针;
返回:错误码信息。
第二接口集合122包括:接口7及接口8。
接口7即同步库表设置WalkFunc(S)接口,详细定义如下:
描述:为同步数据库库表对象设置WalkFunc,WalkFunc将在服务端接收到一个新的客户端接入时调用,其内部实现为应用程序遍历对应数据表,并使用接口3进行第一次同步的数据通告;
角色:服务端;
参数:1.同步数据库库表名称或指针;
2.WalkFunc函数指针。
返回:无。
接口8即同步库表设置UpdateFunc(C)接口,详细定义如下:
描述:为打开的同步数据库库表设置UpdateFunc,UpdateFunc是对于镜象数据库更新的调用函数;
角色:客户端;
参数:1.同步数据库库表名或对象指针;
2.UpdateFunc函数指针。
返回:无。
第三接口集合123包括接口9。
接口9为MySql象类接口,详细定义如下:
描述:SQL语句对象类接口,可用于作为接口3的参数用(S)以及作为Walkfunc的参数用(S),还可以作为接口5、接口6的参数用(C)。
第四接口集合124包括接口10。接口10为SqlResult对象类接口,详细定义如下:
描述:作为UpdateFunc的参数用(C)。
上述接口1~接口10描述中,(S)表示IsLib服务端接口,(C)表示IsLib客户端接口。
IsLib采用信息同步协议用于IsLib服务端与IsLib客户端同步数据的交互。IsLib采用的信息同步协议为应用层协议,无需考虑数据传输的可靠性。数据传输的可靠性由承载此协议的通讯方式保证,如传输控制协议(Transmission Control Protocol,TCP协议),或透明内部进程通信(TIPC)协议中的流方式或可靠报文方式。IsLib服务端与IsLib客户端在同步数据的交互过程中,采用五种协议报文即打开(OPEN)报文、打开回复(OPEN_REP)报文、更新(UPDATE)报文、确认(ACK)报文以及告警(NOTIFICATION)报文进行信息交互。实际应用中,可根据IsLib的需求扩展协议报文。
信息同步协议所有报文都采用<MESSAGE_HEADER,MESSAGE_BODY>的形式。如图13所示。MESSAGE_HEADER为消息头部,占用8个字节。MESSAGE_BODY为消息体。报文的消息类型不同,其消息体的结构也不相同。MESSAGE_HEADER格式如图14所示。MESSAGE_TYPE为unsignedshort类型,用于标识报文的消息类型。MESSAGE_LENGTH为unsigned short类型,用于记录整个报文的长度。MESSAGE_ID由消息发送者分配,作为消息的标识,若有应答形式协议需求时,可使用MESSAGE_ID来确认此应答是针对哪个询问请求。
基本的MESSAGE_TYPE有:MESSAGE_TYPE_OPEN(0x0001)、MESSAGE_TYPE_OPEN_REP(0x0002)、MESSAGE_TYPE_UPDATE(0x0003)、MESSAGE_TYPE_ACK(0x0004)及MESSAGE_TYPE_NOTIFICATION(0x0005)。
打开(OPEN)报文用于客户端向服务端打开同步数据库库表的消息,其MESSAGE_TYPE为MESSAGE_TYPE_OPEN。OPEN报文的MESSAGE_BODY的格式如图15所示。
client_index为服务端为客户端分配的客户端标识,类型为unsigned short。在服务端与客户端第一次连接时,client_index值为0,此后服务端返回的OPEN_REP报文中为该客户端分配一个client_index,客户端记录此client_index值。若连接断开后重新建立连接时,则客户端发送的OPEN报文可以使用上一次分配的client_index值进行连接。这样,服务端可依据client_index进行针对性地同步,以加快连接断开后的数据同步。
version为信息同步协议的版本,类型为unsigned short,用于对协议版本进行兼容性考虑。running_mode记录运行模式的约定,类型为unsigned short。每一个bit位代表一种模式信息,从右至左依次编号为0~15,本发明实施例中使用了头三位。第0位代表IS_RMODE_ASYNC,值为0时表示同步模式,值为1时表示异步模式;第1位代表IS_RMODE_REALTIME,值为0时表示非实时同步,值为1时表示实时同步;第2位代表IS_RMODE_COMPRESS,值为0时表示传输时不压缩,值为1时表示以压缩形式传输。
sync_interval约定非实时同步时的同步间隔时间,类型为unsigned short。当IS_RMODE_REALTIME为0时,此类型有效。
max_batch为批量传输的最大个数,类型为unsigned short。这里约定一个报文最多允许批量传输多少条表项。
compress_type约定压缩算法类型,类型为unsigned short。当IS_RMODE_COMPRESS为1时,此类型有效。
open SQL string是一个以‘/0’结束的字符串,其描述与IsLib上述接口5一致。
当IsLib服务端收到IsLib客户端发送的OPEN报文,并确认有效后,回应打开回复(OPEN_REP)报文给IsLib客户端。OPEN_REP报文的MESSAGE_BODY格式如图16所示。
其中,client_index为IsLib服务端为IsLib客户端分配的标识id,类型为unsigned char。
version为IsLib服务端数据同步协议版本号,类型为unsigned char。
error_code为OPEN报文检查错误码,类型为unsigned char。该值为0表示确认通过,没有错误。
当error_code非0时,open reply string存放着错误的描述。当error_code为0时,open reply string为针对所打开库表的编码信息。两种情况下,open reply string都是以字符串的形式传递信息。open reply string为编码信息时,可为如下形式:
“table-name1=1{column_name1=1ik,column_name2=2h,....}and table-name2=2{column_namel=1%16sk,column_name2=2c,column_name3=3p...}”
其中,“table-name=table-id”,table-id为0~255的数字,为table数字标识。可将table-id转换为一个字节的unsigned char后,在UPDATE报文中使用。
“column_name=ITK”,ITK为column-Id+column_Type+is_Key;Column-Id为一个0~255的数字,为column标识。将Column-Id转换为一个字节的unsigned char后,在UPDATE报文中使用。Column_type为一个ascII字符,指示column的数据类型,目前支持如表1所示的数据类型。
表1 Column_type指示的数据类型表
Column-type | 对应类型 | 描述 |
I | int | 4字节integer |
H | Short int | 2字节short integer |
C | char | 1字节char |
D | data | 二进制数据,对于data可带“%+数据 长度+d”来标识。数据长度以byte为单位。 |
S | string | 对于string可带“%+字串最大长度+s” 来标识。如%16s即代表最大长度为 16字节的string。若不带%限定string 长度,在update报文中string域以一个’ \0’结束。限定长度和未限定长度的 string都以’\0’结束,区别在于限定长度的string包含’\0’总长度不得大于 所指定的“字串最大长度”,否则认为 是错误报文。‘\0’结束符之后不得再 带其它信息,即在报文解析时,对于 string类型只解析到’\0’为止,后一个 字节为下一个column的值。 |
Is-Key为小写字母’k’或空,当为’k’时表示此column为key的一部分。
更新(UPDATE)报文用于更新数据库信息,其MESSAGE_BODY格式如图17所示。第一个字节是table-id,与OPEN_REP报文里定义的table-id相同;接着是db entry TLV。一个UPDATE报文只针对一个table进行更新,不支持多个table在一个UPDATE报文中更新。
Db entry TLV格式如图18所示。其中,Update_entry_type bit定义如下:
IS_UPDATE_ADD,从右往左第0位bit位,标记此操作是添加还是删除,该位为0表示删除操作,该位为1表示添加操作;
IS_UPDATE_BATCH,从右往左第1位bit位,标记是批量格式还是单条格式,该位为0表示单条操作,该位为1表是批量操作。
Update_entry_length为update entry tlv长度,包括update_entry_type。
当IS_UPDATE_BATCH位被置上时,后续格式为{same columns+samecolumns db entry+diff columns+db entrys}。
Same columns与diff columns格式如图19所示。Columns count为samecolumns的个数,或diff columns的个数。取值范围为0~255。Column-id为OPEN_REPLY中交互的column-id,取值范围为0~255,column-id与OPEN_REP里通告的column-id一致。
same column db entry的格式与db entries相同,如图20所示。其中,Entry_count为entry的条目数,Entries直接为各个条目。Entries中,条目的内容对应same columns或diff columns所标记的columns顺序和类型。对于非批量格式的update entry,entries直接以OPEN_REP报文中告知的columns顺序和类型直接填充。
确认(ACK)报文无MESSAGE_BODY。
信息服务双方即IsLib服务端与IsLib客户端都可以发送告警(NOTIFICATION)报文。NOTIFICATION报文的MESSAGE_BODY格式如图21所示。其中,error-code为2字节整数,标识错误类型。error-subcode为2字节整数,扩展error-code的子错误码。error description为以’\0’结尾的字符串。
IsServerEntry对象与IsClient对象之间的协议报文交互如图22所示。交互过程包括:
步骤221、IsLib客户端IsClient向IsLib服务端IsServerEntry发送OPEN报文,OPEN报文携带有客户端需要打开哪些table,以及每个table中需要关心哪些column。
步骤222、IsServerEntry收到OPEN报文后,经确认客户端所要求的table和column无误,则回应一个OPEN_REP报文,请客户端确认关心的table和column的类型,以及它们的编码。
步骤223、若客户端确认OPEN_REP报文中的信息是自己需要的,则记录table和column的编码,并发送ACK报文。这时,IsLib客户端和IsLib服务端就完成了初始的交互过程。
此后,IsLib服务端可通过向IsLib客户端即IsClient通告数据更新的UPDATE报文进行第一次数据同步,完成数据源已有数据的同步,在没有数据源的程序侧生成镜像数据。
当后续数据源的数据发生变更时,IsLib服务端同样通过UPDATE报文实现同步。
当IsLib服务端与客户端通讯过程出现异常时,整个通讯过程中任何一方都可通过发起NOTIFICATION报文,通告告警信息。任何一方接收到NOTIFICATION报文之后,则结束会话过程,断开连接。
步骤112、所述嵌入式分布式系统中部署有数据源的程序通过所述信息同步代码库发布数据。
部署有数据源的程序使用IsLib发布数据前,首先初始化IsLib服务端。如图23所示,纵向实线为控制流,横向虚线为对象流。部署有数据源的程序顺序调用IsLib的接口1:同步数据库创建;接口2:同步数据库创建库表;接口7:同步库表设置WalkFunc。IsLib服务端被初始化后,就能够接收IsClient的接入请求。IsLib服务端的IsServer接收到接入请求后将调用WalFunc,由Walkfun内部进行数据的发布。
步骤113、所述嵌入式分布式系统中待同步数据的程序通过所述信息同步代码库同步所述部署有数据源的程序发布的数据,生成镜像数据。
待同步数据的程序同步数据之前,首先初始化IsLib客户端,如图24所示。待同步数据的程序顺序调用IsLib的三个接口即接口4、接口5及接口6初始化IsLib客户端。具体为:调用接口4打开同步数据库;调用接口5打开同步数据库库表;调用接口6向IsServer发送OPEN报文,申请接入。
IsLib服务端的IsServer在IsLib客户端被初始化时,接收OPEN报文,获知该IsLib客户端的接入事件信息。IsServer收到客户端接入事件,进行接入处理操作,为该接入的客户端创建IsServerEntry对象。如图25所示,当接收到从该客户端发送来的OPEN报文时,触发IsServerEntry状态机。 IsServerEntry状态机对OPEN报文进行解析,若解析得到的结果正确,则生成一个代表OPEN SQL语句的MySql对象,并通过IsMessage对象向该客户端发送OPEN_REP报文。此后,一旦收到来自客户端的ACK报文,触发IsServerEntry状态机,此时,状态机调用部署有数据源的程序为SynTable所设置的WalkFunc,通过调用接口3并发送UPDATE报文进行第一次数据同步。待同步数据的程序侧生成镜像数据,完成数据同步。镜像数据可保存在IsLib客户端的IsClient中,也可保存在待同步数据的程序中。
上述实施例通过实现信息同步代码库,减少了代码冗余,增加了软件产品的可维护性及可扩展性。通过BitTable缓存机制,解决了数据振荡造成的通讯信道拥塞现象;通过使用IsLib的接口设计,减少代码偶合度,提高了程序的模块化。
IsServerEntry对象的状态机如图26所示。IsServerEntry对象被创建时的状态为INIT状态。当IsServer收到客户端被初始化时发送的OPEN报文,IsServerEntry对象进入OPEN_RECV状态,解析OPEN报文,打开客户端所关心的数据Table,接着发送OPEN_REP报文,进入OPEN_SEND状态。当IsServer接收到从客户端来的ACK报文,则进入EXCHANGE状态,IsServerEntry对待同步数据的程序打开的所有SynTable进行第一次同步动作,此动作把当前数据源同步传输给IsLib客户端,IsLib客户端接收来自IsServer的同步数据,通过调用UpdateFunc在待同步数据的程序侧生成镜像数据。当所有的SynTable都完成第一次数据同步动作,即当前数据源数据都完成同步,待同步数据的程序侧生成镜像数据,则IsServerEntry对象进入ESTABLISH状态。ESTABLISH状态下,IsServe收到任何数据信息变更事件都发送UPDATE报文,通告IsLib客户端。若IsServer发现连接断开或连接异常事件,则删除释放IsServerEntry。
当数据源的数据发生变化时,IsServer的处理流程如图27所示。IsServer调用IsLib接口3“同步数据库变更库表”,经SynTable对象类处理数据变更 操作,将DbInfo加入到该SynTable的BitTable中。DbInfo是基于该SynTable的数据结构,包含Table的Key和Value信息。DbInfo带变更类型,标识数据变更属于数据添加还是数据删除。并且DbInfo在加入到BitTable之前,记录此项信息所需通告的所有IsServerEntry。之后,IsServer开启更新定时器(Update Timer)。由于IsServerEntry为此项信息需通告的对象,因此在更新定时器超时时,IsServer向IsServerEntry发送Update事件。IsServerEntry状态机处理此事件,收集所有与该IsServerEntry关联的DbInfo,生成UPDATE报文,向客户端通告变更。DbInfo入库以及通过来触发更新报文是为了防止数据振荡造成通讯信道拥塞。也可省去Update Timer,通过判断通讯信道是否通畅触发生成UPDATE报文,来防止振荡。
相应地,IsLib客户端负责从IsLib服务端接收数据库更新消息,将更新信息存放于BitTable中,或直接将信息通告给待同步数据的程序。更新信息存放于BitTable中还是直接通告给待同步数据的程序,可由接口5“打开同步数据库库表”所给的参数来控制。
如图28所示,当IsClient收到IsLib服务端发送的UPDATE报文,IsClient读取报文并分析,进行同步操作,即接收来自IsServer的同步数据,通过调用UpdateFunc来更新镜像数据。若报文所指定的SynTable为直接通告方式,则IsClient通过调用UpdateFunc向待同步数据的程序直接通告更新;若镜像数据存放于IsLib中,则IsClient保存更新的数据到BitTable中,留待未来待同步数据的程序通过查询接口来获取。
当需同步数据的各分布式程序的数据存储形式不同时,还可包括将各分布式程序数据的存储形式整合为IsLib所识别的数据信息,然后在IsLib服务端及客户端之间完成这些数据信息的同步操作。
所有分布式程序管理的数据,不论其存储形式怎样,都可以将其看成库表形式的存储方式。也就是说,所有的数据都可看成是{key,value}的一个组合。Key为这数据的唯一标识,value为数据除标识之后的其它信息。如存储 形式为全局变量只有value,没有key时,可以为其分配一个key值,如key恒等于1,得到存储形式为库表形式的数据,即{1,value}。如以列表形式存储的数据,假设一个存储上线用户用户名的列表,列表本身的形式没有任何意义,转换为库表就是一张在线用户表,它的key就是用户名,如果没有其它信息,其value恒为空(NULL)。
基于这种数据存储形式的整合方式,不论各分布式程序对自身维护的数据如何存储,都可根据通过接口2或接口5把不同存储形式的数据描述成为一张表,并把该表的形式告诉IsLib。这样,IsLib内部对数据的存储就能与各分布式程序达成一致。
上述实施例中,IsLib的调度可以是纯粹库的形式,由程序调度;也可以是IsLib做为一个独立进程模块运行。
纯粹库的形式下,IsLib运行在调用其接口的分布式程序中;而独立进程模块形式下,IsLib控制本身的运行。
例如使用纯粹库的形式调度IsLib的运作,如图29所示。假设程序为使用套接口方式的应用程序。应用程序调度socket触发机,IsServer及IsServerEntry等IsLib对象通过步骤291~步骤295向socket触发机注册socket来实现被应用程序调度。所谓套接口是指操作系统中常见的socket套接口通讯方式。
纯粹库的形式下,IsLib涉及的以下事件的触发调度:
1)IsServer收到客户端接入事件;
2)IsServerEntry或IsClient收到数据报文事件;
3)IsServerEntry通讯信道可写事件;
4)IsLib所涉及的定时器事件;
5)数据变更事件。
上述事件的触发调度根据分布式程序的类型不同而有所区别。
若分布式程序为内核程序,事件1)、事件2)、事件3)基于通讯信道 模块API接口触发,运行实体为通讯模块;事件4)可由核心定时器(kerneltimer,ktimer)触发,运行实体为ktimer;事件5)则是该内核程序触发,运行实体为内核程序。这种情况下,由于IsLib的调度由多个运行实体触发调度,IsLib的实现需要考虑对IsLib内部数据的保护。这时IsLib内部数据可通过锁保护实现。
若分布式程序为应用程序,且应用程序基于标准套接口实现通讯,则上述5个事件调度都可以在此应用程序实体上实现调度,IsLib仅需要提供获取套接口句柄的接口即可实现事件1)、事件2)、事件3)的调度。事件4)中的定时器可由应用程序实现,IsLib提供一个添加定时器(timer)的虚函数即可。这种情况下,IsLib的内部数据不需要保护。如果应用程序的实现有更好的设计架构,比如共用一个统一的应用程序类实现,那么IsLib的封装性将更好。
上述实施例主要应用于嵌入式分布式系统中,具有信息同步需求的环境。例如,在嵌入式分布式交换机产品中,有许多的分布式数据同步需求,使用上述实施例中的同步信息库设计,能够很好地实现这些同步需求,并且代码可维护性可扩展性强。三层核心交换机产品多以嵌入式分布式软件及硬件架构实现,具有主管理板、备管理板、线卡、多业务卡等等多个分布,它们之间有许多的数据同步需求,如图30所示。备管理板作为主管理板的备份,需要将主管理板许多数据库表同步到备管理板。而线卡负责数据报文的转发,在转发中需要同步路由信息和主机表信息等数据库表。多业务板也由于自身业务需求的要求,需要同步部份数据库信息。通过本发明上述实施例中利用信息同步代码库实现数据同步,避免了现有技术中嵌入式设备中这些数据信息由各个嵌入式应用程序维护管理,各个模块都通过各自的方式将信息发送到其它分布中,所造成的大量的代码冗余,以及维护性低下,扩展性不强等诸多弊端,极大地提高了软件的可维护性及可扩展性。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤 可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (7)
1.一种嵌入式分布式系统中数据同步的方法,其特征在于,包括:
在所述嵌入式分布式系统的进程间通讯层上建立用于发布和同步数据的信息同步代码库;
所述嵌入式分布式系统中部署有数据源的程序通过所述信息同步代码库发布数据;
所述嵌入式分布式系统中待同步数据的程序通过所述信息同步代码库同步所述部署有数据源的程序发布的数据,生成镜像数据;
其中,所述信息同步代码库内部通过应用层上用于信息同步的协议报文进行交互;
所述协议报文包括消息头和消息体两部分;所述消息头包括用于标识消息类型、报文长度及应答对象的字段;
所述协议报文包括用于请求同步数据的打开报文、用于应答打开报文的打开回复报文、用于发送同步数据的更新报文及用于确认数据同步的确认报文;
所述打开报文的消息体包括用于标识客户端标识、协议版本、运行模式、同步时间间隔、批量传输的最大值、压缩算法类型及报文结束的字段;所述客户端标识用于在所述信息同步代码库内部建立连接;
所述打开回复报文的消息体包括用于标识所述客户端标识、所述协议版本、错误代码及指示信息的字段;所述指示信息与所述错误代码相对应,根据所述错误代码的值存放错误描述信息或带同步数据的编码信息;
所述更新报文的消息体包括用于标识库表标识及所述库表标识对应的库表的更新信息的字段;所述更新信息包括更新方式及更新信息长度。
2.根据权利要求1所述的嵌入式分布式系统中数据同步的方法,其特征在于,还包括:
所述部署有数据源的程序发布的数据,通过所述信息同步代码库统一存储形式。
3.根据权利要求1所述的嵌入式分布式系统中数据同步的方法,其特征在于,还包括:
所述部署有数据源的程序通过所述信息同步代码库发布更新的数据;
所述待同步数据的程序通过所述信息同步代码库将所述更新的数据同步到所述镜像数据。
4.根据权利要求1所述的嵌入式分布式系统中数据同步的方法,其特征在于,还包括:所述信息同步代码库在通讯异常情况下结束同步服务。
5.根据权利要求1-4中任一项所述的嵌入式分布式系统中数据同步的方法,其特征在于,所述镜像数据存储在所述信息同步代码库或所述待同步数据的程序。
6.根据权利要求1所述的嵌入式分布式系统中数据同步的方法,其特征在于,所述协议报文还包括:用于在所述信息同步代码库通讯异常情况下结束同步服务的告警报文。
7.根据权利要求6所述的嵌入式分布式系统中数据同步的方法,其特征在于,所述告警报文的消息体包括用于标识错误代码、子错误代码及错误描述的字段。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008102264704A CN101398857B (zh) | 2008-11-12 | 2008-11-12 | 嵌入式分布式系统中数据同步的方法及嵌入式分布式系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008102264704A CN101398857B (zh) | 2008-11-12 | 2008-11-12 | 嵌入式分布式系统中数据同步的方法及嵌入式分布式系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101398857A CN101398857A (zh) | 2009-04-01 |
CN101398857B true CN101398857B (zh) | 2012-07-25 |
Family
ID=40517409
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2008102264704A Expired - Fee Related CN101398857B (zh) | 2008-11-12 | 2008-11-12 | 嵌入式分布式系统中数据同步的方法及嵌入式分布式系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101398857B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101902473B (zh) * | 2010-07-22 | 2013-03-27 | 武汉中地数码科技有限公司 | 基于网格gis的数据同步更新实现方法 |
CN102508722B (zh) * | 2011-12-02 | 2015-04-08 | 中科方德软件有限公司 | 一种嵌入式环境下的进程间通信方法 |
CN103744952A (zh) * | 2014-01-02 | 2014-04-23 | 北京集奥聚合网络技术有限公司 | NoSQL数据库多表特性的实现方法及系统 |
CN107193961B (zh) * | 2017-05-24 | 2021-01-08 | 上海星佑网络科技有限公司 | 信息记录方法和装置 |
CN108287886B (zh) * | 2018-01-16 | 2022-04-08 | 创新先进技术有限公司 | 同步数据变更信息的方法及装置 |
CN109446464B (zh) * | 2018-11-09 | 2021-02-02 | 深圳高灯计算机科技有限公司 | 并发数确定方法、装置及服务器 |
CN110971509A (zh) * | 2019-11-27 | 2020-04-07 | 江苏艾佳家居用品有限公司 | 一种高并发场景下即时通信消息传输方法 |
CN111258742B (zh) * | 2020-02-17 | 2023-08-04 | 杭州依图医疗技术有限公司 | 一种数据同步的方法、系统、计算设备及存储介质 |
-
2008
- 2008-11-12 CN CN2008102264704A patent/CN101398857B/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
CN101398857A (zh) | 2009-04-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101398857B (zh) | 嵌入式分布式系统中数据同步的方法及嵌入式分布式系统 | |
CN110650189B (zh) | 一种基于中继的区块链的交互系统及方法 | |
CN112488679B (zh) | 一种区块链的跨链合约解析方法、中继链及跨链系统 | |
US7831724B2 (en) | Services layer model for providing standards-based communications | |
CN109460593B (zh) | 一种区块链虚拟仿真系统 | |
CN108123842A (zh) | 一种基于knx协议可接入多厂家设备的适配系统及方法 | |
CN107454092A (zh) | 一种opcua与dds协议信号转换装置、通信系统及通信方法 | |
CN106130759A (zh) | 面向服务的模块化系统体系架构 | |
CN102866998A (zh) | 一种同步系统中集中式密码管理方法和系统 | |
WO2015091198A1 (en) | Method for an integrated data handling for the engineering and operation of a plant | |
CN101197722A (zh) | 一种多系统错误码管理方法、装置及系统 | |
CN102073501A (zh) | 一种基于逻辑功能块的网络设备中央控制器的实现方法 | |
CN101795206A (zh) | 一种在分布式构成设备上实现snmp代理的方法和装置 | |
CN113259457B (zh) | 区块链子网的信息同步方法及装置 | |
CN106027534A (zh) | 一种基于Netty实现金融报文处理系统 | |
CN1973282A (zh) | 用于管理针对集群配置的改变的系统和方法 | |
CN101364924A (zh) | 一种基于企业服务总线的数据采集自适应体系结构 | |
CN102088475A (zh) | 控制流集中数据流分布的组合服务执行系统及执行方法 | |
CN100550803C (zh) | 一种多协议公共路由管理的装置和方法 | |
CN101304410A (zh) | 分布式web的智能信息平台 | |
CN112153023B (zh) | 一种基于智能合约库的多智能合约系统平台 | |
CN112153124B (zh) | 一种区块链及智能合约系统协作层设计 | |
WO2003073727A1 (en) | Network communication method with a smartcard using asynchronous messages | |
CN101630334A (zh) | 分布式系统中的数据更新方法 | |
CN105117972A (zh) | 电网多环节互动终端集成方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120725 Termination date: 20141112 |
|
EXPY | Termination of patent right or utility model |