APP下载

数据同步新机制在民航实时交易系统中的应用

2011-11-27贾宇清燕卫东

中国民航大学学报 2011年3期
关键词:数据文件队列事务

贾宇清,燕卫东,张 磊

(中国民航信息网络股份有限公司研发中心,北京 100029)

近年来,民航电子商务发展迅速,各种基于互联网的航空公司电子商务直销网站和代理人在线销售平台蓬勃发展,成为中国民航信息发布和机票销售的重要方式。但是,新兴的互联网销售对在大型主机上运营的中国民航实时交易系统带来了新的挑战,随着互联网信息查询的增加,查询和订票比例不断提升,传统主机系统处理的交易量不断增长,主机面临的压力日益突出。因采用可行的方式将主机系统核心数据实时同步到开放平台供互联网访问,以缓解主机的处理压力[1-3],满足互联网应用的要求,降低系统综合处理成本费非常必要。

为了能够在不影响民航实时交易系统正常运行的前提下,实现数据的实时同步,本文在民航实时交易系统中引入数据同步新机制,并通过改进实时文件的访问方式解决实时系统处理与数据同步对系统资源的共同占用问题,在大规模并发处理环境下实现实时数据同步。

1 实时交易系统中的数据同步方法

1.1 原有数据同步的方法

原有的数据同步方法主要是在应用程序中通过消息队列(message queue)的机制进行数据采集和数据传输。这种数据同步方法受到应用程序、系统交易并发和消息机制本身的影响,在应用程序异常终止、系统并发交易量大和消息机制本身出现问题时,存在无法支持在大并发交易量下的数据同步、数据同步准确率低、系统资源占用大等问题。如图1所示。

消息队列的索引文件使用的是主机系统内一种可恢复的数据文件。此类文件只有在数据更新被提交后,才能将变更数据写入物理文件,并释放锁控制。这样一来,当有大量的数据更新事务时,都会因为无法获得消息队列的索引文件而等待。

图1 传统数据同步模式Fig.1 Procedure in message queue

另外,原有的数据同步方法中,一个交易事务在将消息数据存入消息队列时,会把消息数据的全部内容都写入到消息队列中。对于内容太多的消息数据,还可能将其分割成若干个小报文。这一系列封装数据,写入消息队列的过程会增加数据同步时的系统资源开销,延长交易事务占用索引文件的时间,进一步降低消息队列索引文件的利用效率。

因此,针对原有消息队列机制中出现的上述问题,新的数据同步机制采用了文件记录索引与文件记录内容分离及使用不可恢复(non-recoverable freespace)的索引文件等方法提升数据同步的效率。

1.2 新的数据同步机制——TFCT

TFCT(TIP file change transfer)数据同步机制由数据索引系统和数据输入输出系统构成,包括数据输入模块、数据输出模块、数据索引模块,如图2所示。

如图3所示,数据输入模块嵌入在一个指定数据内容更新的事务中,通常是一个底层的通用数据更新程序。该通用数据更新程序专门用于某种主机数据文件的读写操作,可以实时跟踪记录主机系统数据文件的变更,并将发生变更的数据内容的全部或部分写入TFCT的数据队列中。应用程序在调用TFCT的数据输入模块之后,会得到其返回的一个状态值,标识数据存储是否成功。如果存储操作不成功,应用程序可启用既定的方案中止事务的处理或继续后续的任务。一旦数据被成功写入到TFCT的队列中,也释放了对队列索引文件的锁控制,应用程序就会默认数据已经准备好并且一定能够被发送到目标系统,转而开始处理后续的事务内容。由于TFCT中使用的是不可恢复的索引文件,一旦释放了队列索引文件的控制权,则方便了其他的事务继续操作存储数据到TFCT的数据队列中,关于这一特点后面会有详细描述。

图3 TFCT数据同步机制Fig.3 Procedure in TFCT

而且TFCT中的数据也支持基于文件记录索引的数据同步。主机系统中的数据文件被进一步分割成若干个记录(record),应用数据都存储在这些记录中。基本上1份数据至少占用1个记录,有的大型数据结构会占用多个记录,这些记录之间相互链接,形成一个记录链。TFCT所支持的基于文件记录索引的数据同步,即在TFCT的数据队列中,只存储该数据所在记录链的第1个记录的索引。所以只要掌握了这个记录索引,就能够在需要的时候读取记录链中的所有数据。关于这个特点,在后面也有详细的描述。

如图4所示,数据输出模块中常驻内存的后台扫描程序会周期性地扫描TFCT数据索引模块中所有的数据队列,并调度子进程来处理数据队列中的排队数据。为了避免与数据输入模块发生资源争夺,只有在获取了索引表控制权的前提下,处理数据的子进程才能顺利处理排队数据。而由于TFCT中的数据队列使用的是不可恢复的索引文件,因此,数据输出模块中调度的子进程才有可能尽早获取对队列索引文件的控制权,提高对数据队列的使用效率,缩短数据在TFCT队列中的等待时间。

数据索引模块维护TFCT内的所有数据队列、队列索引表等数据库结构,并实时监控各个数据队列中的容量使用。如图5所示,TFCT内部的数据库结构中有4层表结构。第1层是应用接入表(N0),该表属于内存数据结构,用于快速接入访问;第2层是队列表示表(N3),该表用于存储数据队列的静态描述信息,如队列长度、容量、起始地址等;前面两层的数据内容基本保持稳定,除非增加或删除队列,否则在数据处理过程中,其很少发生变化,即很少发生写操作。频繁发生修改的则是后面第3层和第4层。第3层就是队列索引表(N4),该表为不可恢复的数据文件,可以快速访问,为后面第4层的数据表(Q4)提供索引支持。

具体来说,队列索引表使用主机系统中一种称为不可恢复的数据文件作为载体,该文件具有写立即生效的特点,即执行写操作之后,没有磁盘缓存,无需额外的数据提交操作即可完成数据文件内的内容变更,可供输入输出模块快速的访问和释放索引文件,实现数据的快速处理。

总之,实时交易系统数据同步机制TFCT,采用存储转发的方法,充分利用主机系统提供的不可恢复数据文件的高效特性,提供存储记录文件索引或者数据记录完整内容两种数据形式,分离数据记录的存储与单独读取文件内容的方式,将改变后的数据记录内容传输给开放系统。它将数据的发送过程从交易事务中分离出来,独立于主机系统中的交易事务进行数据同步,不依赖于传统的消息队列模式。由于只在数据同步时锁定TFCT队列的索引文件,并不会等到事务结束,大大提高了TFCT中数据队列的访问效率。同时支持将文件索引记录和文件内容的传输分开,对在实时交易系统中运行具有较强的适应性,可满足大规模并发下的数据同步要求。本文从将文件记录索引和文件内容同步分离、应用不可恢复索引文件下的处理两项创新处理方面对该机制进行说明。

1.2.1 不可恢复索引文件控制下的处理方法

由于使用了存储转发的模式实现实时数据同步,数据队列处于先入先出的状态,而且需在写入数据的同时输出其他数据,必然需在索引文件的引导下同时完成快速的数据输入输出访问。因此,索引文件的读写操作是整个系统中最频繁的,其控制权成为众多交易事务竞相争夺的核心资源。

如图6所示,原有的消息队列的索引文件工作模式是线性的。交易事务一旦获得索引文件控制权,别的需要此索引表的事务只能排队等待。直到当前控制索引表的事务结束所有操作,完成了数据提交,释放了索引表的控制权之后,排队中的其他事务才有可能锁定消息队列的索引文件,实现数据访问。

这是因为原有的模式下,消息队列及其索引文件都是使用具有可恢复属性的物理文件,在写入操作完成之后,还需额外的数据提交操作,才能将数据真正写入到索引文件中。而主机系统内的交易事务出于事务完整性的要求,在交易事务正式提交所有数据修改之前,消息队列的索引文件和数据文件都是被其独占的。如果交易事务回滚,那么消息队列的状态可以恢复到前一个修改成功点(recovery success point)。虽然也可以在完成消息队列的写入操作之后,立即提交数据修改,创建一个修改成功点。但是,此举却完全破坏了整个事务的数据一致性,导致事务处理一旦需要回滚,无法恢复到理想的初始状态。

如图7所示,在TFCT数据同步机制中,使用不可恢复的数据文件来构造TFCT中各种数据队列的索引文件,而数据队列本身依然基于可恢复的数据文件。在发生主机数据变更时,索引文件和数据队列同时被更新。索引文件标识出数据队列的长度变化以及队尾指针的相对位置;而数据队列则应为即将写入的数据准备一片空白区域。此时,在主机当前事务正式提交所有的数据变更,创建一个修改成功点之前,数据依然没有被写入到数据文件中。但是,由于索引文件具有的不可恢复的文件结构,在写入当时索引文件就已经发生了变更,而无需等待正式的数据提交。实际上当前事务对索引文件的占用时间仅仅只有更新时短暂的一段,很快就释放了对索引文件的锁控制,因而其他事务就能快速控制索引文件,开始新的数据更新。如此,多个事务之间就能够快速移交对索引文件的控制,提高了索引文件的利用率,分享同一个索引文件的事务也由原来的串行执行变成了现在的并行执行,极大地提升了系统整体的执行效率。

经过对TFCT中这种索引结构的分析,看起来很多时候索引文件和数据文件是不一致的,例如,事务A锁定并更新索引文件之后,标识数据文件中的第n个数据区域为事务A的数据同步所用,后来的事务B则只能使用第n+1个数据区域。而此时,事务A可能还没有结束,第n个数据区域内依然是空白的,索引文件中的指示与数据文件中真实写入的内容是不一致的。但是,这种不一致是可控的、低风险的。至少后续的事务B、C等主机系统内的其他交易可以正常执行下去,而不用等待事务A的结束。这就是为什么不可恢复的索引文件能够大幅提升数据同步的效率[4-5]。

至于事务A的数据是否能够被正常处理、有几种情况需要考虑?当数据输出模块中的处理程序找到了第n个数据区域的时候,如果发现了这种不一致,不会立即处理这里的数据,会等待一段时间(时间长短由参数设置)。事务A的同步数据最终写入了第n个数据区域,那么数据处理程序会按照应用的设定将其发送到开放系统;如果事务A因为处理失败而回滚,数据最终都没有能够成功写入数据文件,则TFCT会把这个空记录作为一个错误数据而删除掉。然而,无论事务A的数据成功处理与否,都不会影响其他事务数据的处理。

1.2.2 支持基于文件记录索引的数据同步

主机系统中的数据文件通常都被分割为成千上万个记录,应用数据都存储在这些记录中。基本上1份数据至少占用1个记录,有的大型数据结构会占用多个记录,这些记录之间相互链接,形成1个记录链。每个记录都有1个记录索引,即这个记录在数据文件中的相对位置地址。记录链的索引通常就是记录链中第1个记录的索引。在进行数据处理时,主机系统中的各类程序都是通过记录的索引对记录中的数据进行访问。数据一旦写入数据文件,除非记录被删除或特别要求迁移到其他记录,其占用的记录一般不会发生变更。也就是说,在记录的生存期内,其中存储的应该都是同一个数据。

在TFCT数据同步机制中,存储到TFCT数据队列中的报文消息可以是完整的数据更新内容,例如,一个旅客信息记录的全部数据,它通常是一个包含多个记录的记录链。存储完整的数据更新内容,在TFCT的数据队列中不限制单个数据大小。对于超大的数据内容可以通过记录级联的方式进行扩展,保证将所有的数据都存储到数据队列中。

作为一种更高效的存储方式,TFCT的数据队列支持在队列中只存储文件记录的索引。文件记录的索引相当于一个地址,标识数据更新内容在数据文件中的相对位置。也就是说,数据输入的时候,数据内容仍然保存在主机系统的文件记录中,而只是把文件记录的索引地址存入TFCT的数据队列中。等到数据输出时,处理程序根据数据队列中文件记录的索引,检索到指定的文件记录,再将此时文件记录中的所有数据内容封装之后,发送到开放系统[6-8]。

基于文件记录索引的数据同步有以下几个优势:①简化数据输入流程,实现数据快速存储;②累积数据变更,避免重复数据。

在交易事务同步数据的过程中,锁控制TFCT数据队列索引文件的时间越短,则留给其他交易事务的时间也就越多,数据同步的效率也就越高。如果只是存储文件记录的索引,这个索引只占1个数据字(主机系统内的1个数据字包含36 bit)的长度,比起存储一个上百个数据字的文件记录的完整内容,效率的提高非常明显。而且,在TFCT的数据输出模块中,处理程序通过数据队列中的文件记录索引提取数据内容时,对文件记录是只读的,不需要锁定TFCT数据队列及其索引文件。这样,可以在数据处理过程中,尽可能减小对主机系统生产数据的影响。

另外,在记录索引存入TFCT的数据队列,到被处理程序提取出来这段时间之内,记录索引指向的数据内容可能发生变化。但即便是内容发生变化,依然存储在同一个记录中。数据内容的变化都累积在这一个文件记录内,那么,通过文件记录的索引,TFCT的后台处理程序随时都能提取到最新的文件记录内容,并将其发送到其他目标系统。很明显,数据内容虽然更新了多次,但只有其中最新的一份被发送,其发送效率异常可观。

在民航实时交易系统中,旅客订座记录数据的变更通常都较集中,连续几次修改通常都在1 s内完成。

如图8所示,在第n次修改旅客订座记录P的时候,修改后的内容会被写入到TFCT数据队列中,排队等候处理。此后,旅客订座记录P又紧接着完成了2次修改,达到了n+2次修改。同样,后面的两次修改也会加入到等候处理的排队中。而当TFCT的数据输出模块中的处理程序检索到TFCT中存储的旅客订座记录P的第n次修改时,发现主机系统中当前的数据已经更新到n+2次了。因此,包括第n次修改和第n+1次修改的信息都会被处理程序直接删除,而只处理第n+2次修改的数据。这样一来,原本需发送3份数据的处理逻辑,在使用文件记录索引后,只有1份最新的数据会被处理,数据处理的效率得到了很大提升。

2 新方法在民航交易系统中的应用

2.1 在旅客订座记录数据中的应用

2009年12月25日,在中国航信的代理人分销系统中,开始使用TFCT数据同步机制将主机系统中的旅客订座记录同步到开放系统的Oracle数据库中。TFCT中为其创建了20个数据队列,分别用20个不可恢复的索引文件为这些数据队列提供排队数据索引。

在代理人分销系统中,一旦有新的旅客订座记录生成或有旧的旅客订座记录发生变更,除了在主机系统的数据文件记录中存储旅客订座记录的数据外,还会将发生变更的旅客订座记录的索引和一个标识修改时间的标志一并存入TFCT的一个数据队列中。

经过性能统计,通过TFCT数据同步机制发送1份报文所消耗的系统资源远远低于原有的消息队列机制,如表1~表2所示。

很明显,使用TFCT数据同步机制的效率和性能都要好于使用消息队列的数据同步机制。从表1的比较可以看到,实现几乎相同的传送速率,TFCT所消耗的系统资源只是主机消息队列机制的一半。

更重要的一点,TFCT在实际处理代理人分销系统中的旅客订座记录数据时,只发送最新的数据记录。而主机消息队列机制处理的每一个记录,都会发送到开放系统。无形中,使用TFCT数据同步机制也为开放系统节省将近50%的系统资源。

TFCT数据同步机制的另一个优势在于其控制参数是可以动态调整的,修改TFCT的配置参数是可以动态变更,不用将整个数据同步机制完全关闭就可实现配置变更。这在原有的主机消息队列同步机制中是不可实现的。

2.2 应用效果

TFCT数据同步机制在中国航信的代理人分销系统投产之后,经过几个月的试运行之后,很快就实现了将系统内全部的旅客订座记录数据同步传送到开放系统中。在系统内,每天都有将近一百万个新创建的旅客订座记录,有几十万个旅客订座记录被删除,平均还有三百万左右的旅客订座记录会伴随着旅客订座、出票、取消等状态发生变更,这些都会被TFCT发送到开放系统中。但是,在同步如此众多的数据时,TFCT消耗的系统资源只占到了全部系统可用资源的2%。

表1 不同数据同步方式压力测试性能比较Tab.1 Effect of performance test on TFCT and message queue

表2 不同数据同步方式工作性能比较Tab.2 Effect of data transfer on TFCT and message queue

3 结语

本文介绍了一种全新的主机数据同步机制。这种称为TFCT的新结构采用了文件记录索引与文件记录内容分离,以及使用不可恢复的索引文件等方法,实现了主机系统内同外部开放系统的快速数据同步。通过与主机系统内原有的基于消息队列的同步机制的比较,凸显出TFCT数据同步机制的优异性能。而且,经过半年多生产系统的投产实践,TFCT安全稳定的将代理人分销系统中所有的旅客订座记录修改同步到指定的开放系统数据库中,证明了TFCT能够满足主机系统内的数据同步需要。

[1]顾穗珊,张治江.XML/EDI:新型的电子商务数据交换模式[J].情报科学,2003,5(21):534-535.

[2]曾昭冰.XML/EDI发展趋势研究[J].宿州学院学报,2004,4(19):93-95.

[3]肖富军,陈文麝,胡运发.基于XML技术的电子数据交换[J].计算机工程,2000,9(26):129-131.

[4]TOSHIFUMI MORIYAMA,YUJI YAMAGUCHI,KISMET ANAK HONG PING,et al.Parallel processing of forward-backward timestepping method for time domain inverse scattering[J].PIERS Online,2008,4(6):695-700.

[5]BRANIMIR RADIC,VEDRAN KAJIC,EMIR IMAMAGIC.Optimizationofdatatransferforgrid using GridFTP[J].JournalofComputingand Information Technology,2007,15(4):347-353.

[6]EIKE BORN.Analytical performance modelling of lock management in distributed systems[J].Distributed Systems Engineering,1996,3(1):68-76.

[7]GREGORY D PETERSON,ROGER D CHAMBERLAIN.Parallel application performance in a shared resource environment[J].Distributed Systems Engineering,1996,3(1):9-19.

[8]KIM SANGHWAN,LEE SANGHO,LEE JONGKUN.Deadlock analysis of petri nets based on the resource share places relationship[J].Studies in Informatics and Control Journal,2007,16(1):33-44.

猜你喜欢

数据文件队列事务
河湖事务
队列里的小秘密
基于多队列切换的SDN拥塞控制*
基于改进乐观两阶段锁的移动事务处理模型
在队列里
基于表空间和数据文件探讨MIS中数据库架构设计
丰田加速驶入自动驾驶队列
基于网络环境的社区协同办公问题探讨(二)
基于优先级的多版本两阶段锁并发控制协议
浅析Oracle事务