一种基于MySQL双存储引擎的内存数据库实现方法

文档序号:6439585阅读:246来源:国知局

专利名称::一种基于MySQL双存储引擎的内存数据库实现方法
技术领域
:本发明涉及数据库技术,尤其涉及一种基于MySQL双存储引擎的内存数据库实现方法。
背景技术
:目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。甚至在电信行业中,由于MySQL优越的性能、稳定性、完善的功能,也越来越多的被用于电信产品中。例如公开日为2008年04月09日、公开号为CN101158958A的专利文献采用了这样的技术方案,一种在线视频控制系统及控制方法,其通过MySQL常规用法建立MySQL数据库来对用户信息、视频信息和电影评论信息进行控制,使用户可以通过系统的操作界面输入操作命令来实现操作目的,最终完成对所述视频的各种操作,该方案虽然存在响应速度、可靠性不高等不足,但仍然能够顺利实现视频的各种操作控制。其实,无论是互联网产品还是电信产品,对产品的高可靠性及快速的响应速度,都有着越来越高的要求。为了满足高可靠性,在MySQL产品集中最好的选择是MySQLCluster,它是一个高冗余的数据库存储引擎,但实践证明,MySQLCluster的插入、查询速度并不快,而且价格昂贵,管理功能有限。用户需要很多二次开发,比如,集群中的节点没有自动重启的功能,需要用户自行开发,MySQLCluster作为一个新产品,也不够稳定。MySQL的Memory引擎,顾名思义,内存中存储数据,非常高速,但MySQL服务器关闭后所有数据消失,没有持久存储的能力,而其使用SQL语句API,虽然方便,但没有使查询性能提高最大化。再者,关于MySQL的复制功能能解决备份、冗余、负载分担等问题,但最终的查询访问还是落在一个MySQL服务器上访问磁盘表而非内存表,对于快速度查询,还是不如直接访问内存快。对于产品MySQLProxy,是主要借助MySQL的复制功能实现的,存在MySQL复制的问题。另外,虽然MySQL提供QueryCache机制,但它不适合查询语句经常变化的情形,并且如果数据表被更改,那么和这个数据表相关的全部Cache都会无效,并被删除。当然,MySQL的各种存储引擎内一般都有页缓存机制,但这种机制复杂,由于缓存页可能被释放,可能在磁盘与缓存页之间切换,造成过多的消耗,影响性能。还有访问MySQL数据库,还需要解析编译SQL语句,这都是不小的消耗。由上述可知,MySQL产品族中,并没有一个能同时满足高可靠性、冗余备份、持久存储、高吞吐量、即时响应、直接访问表内存的接口等要求的数据库引擎。而MySQL之外的免费内存数据库,比如MonetDB、FastDB都是单机版的数据库,不能解决冗余备份问题。目前比较知名的商业内存数据库有Oracle的TimesTen,其性能非常强劲,但价格非常高昂,由于是关系型数据库,满足严格的ACID(原子性、一致性、隔离性、持久性)要求,这也对读写速度也有着大的消耗,查询速度未必最大化。其实,为了提高数据库的查询性3能,很多公司都为自己的产品开发基于Oracle之上的内存数据库。Memcached也是常用的内存对象缓存系统,但它不基于数据库表结构,不能直接用做表数据的缓存,需要一些在它之上的许多二次开发。在实际应用中,很多产品并没有严格的一致性要求,当新数据写入数据库中时,其实即使应用程序并不能即时读到该新数据,也不影业务的运行,比如,IPTV系统,用户购买了某些频道的观看权利,由于订购记录还未同步到用户设备访问的服务器中(也可能是内存数据库表中),几秒钟内可能看不到节目,过了几秒钟后再看到,这是可以容忍的。再者,许多的应用是查询密集的应用,少量的写操作,所以只要能满足高吞吐的查询即可。
发明内容本发明主要是解决现有技术所存在的MySQL产品不能同时满足高可靠性、冗余备份、持久存储、高吞吐量、即时响应等技术问题,提供一种基于MySQL双存储引擎的内存数据库实现方法,它能够在一些对一致性要求不严格、查询密集、写操作少的应用中同时满足高可靠性、冗余备份、存储持久等要求,而且吞吐量大、响应速度快,使用十分方便。本发明针对现有技术问题主要是通过下述技术方案得以解决的,一种基于MySQL双存储引擎的内存数据库实现方法,包括以下步骤(A)选择两台计算机,并分别安装MySQL服务器;(B)分别在所述两台MySQL服务器上启动存储引擎,所述存储引擎是具有永久存储功能的存储引擎,建立等同的数据库,以实现内存数据库的持久存储功能;(C)利用MySQL的复制功能,使所述两个存储引擎互为备份;(D)在应用程序中部署内存表和独立运行的缓存引擎。本发明选择了两个MySQL存储引擎,这两个存储引擎分别运行在两个安装在两台计算机上的MySQL服务器之内。本发明选择了具有持久存储功能的MySQL存储引擎,比如MyISAM存储引擎或Innodb存储引擎,以实现内存数据库的持久存储。又利用MySQL的复制(replication)功能,使两个存储引擎互为备份,满足冗余备份的要求,并且当一个MySQL存储引擎不能工作时,另外一个能继续提供服务,再加上能提供高并发的快速查询功能的内存表,由此构架了一个高可靠性、高性能的内存数据库平台。作为优选,内存表部署在各个应用程序的进程之内,不同的应用程序内都运行一个独立工作的缓存引擎,应用程序按照自己的需要选择不同的物理数据库表进行缓存,还根据需要从物理数据库表中选择不同的记录进行缓存。各个应用程序依靠自己的缓存引擎从物理数据库表同步数据到内存表,一个缓存引擎的故障并不影响其他缓存引擎的正常工作。两个MySQL存储引擎互相备份,而对表的写操作,可以从任一引擎或两引擎同时进行。作为优选,物理数据库表是MySQL服务器磁盘上的数据库表。物理数据库也就是MySQL服务器磁盘上的数据库。作为优选,内存表与应用程序进程占用同一个内存空间,提供直接读内存表记录的两种接口,两种接口都是紧耦合接口,一种接口是将内存表记录拷贝到应用进程指定的内存块中,另一种接口是将内存表记录的内存地址返回给应用进程以便直接访问其中数CN102937955A书明说3/10页据,两种接口都采用记录的行读锁。内存表实现在应用进程的内部,与应用程序进程占用同一个内存空间,提供直接读内存表记录的两种接口,两种都是紧耦合的接口,一种接口是将内存表记录拷贝到应用进程指定的内存块中,另一种接口是将内存表记录的内存地址返回给应用进程以直接访问其中数据,两种接口都采用记录的行读锁。这种实现方式保证了对查询密集的快速即时响应。应用本发明内存数据库实现方法,可以根据需要部署多个缓存引擎,以实现一种集群的模式。作为优选,利用MySQL的触发器机制,比较实时地跟踪物理数据库表的修改动作,及时将物理数据库表记录的修改、增加、删除操作同步到内存表中,保持内存与磁盘的最终一致性,即保持内存数据库与物理数据库的一致性。作为优选,缓存引擎运行在应用程序内,当一个MySQL存储引擎不能工作时,缓存引擎自动切换到另一MySQL存储引擎,继续同步物理数据库表数据。这些操作对应用都是透明的。切换过程及切换后,内存表中的数据并不丢失,并且即使两个存储引擎同时发生故障时,由于内存表依然存在并可用,所以应用程序还可依赖内存表继续提供一定的服务。本发明带来的有益效果是,提供了一种能同时满足高可靠性、冗余备份、持久存储、高吞吐量、即时响应、直接访问表内存的MySQL内存数据库实现方法,在对一致性要求不严格、查询密集、写操作少的应用环境具有优良的使用效果。图I是本发明的一种整体结构框图;图2是本发明缓存引擎的一种结构和工作流程图;图3是本发明缓存引擎同步物理记录的一种流程图;图4是本发明触发器与复制的一种关系图;图5是本发明缓存引擎处理MySQL服务器切换示意图;图6是本发明的一种缓存事件表结构;图7是本发明的辅助物理表结构。具体实施方式下面通过实施例,并结合附图,对本发明的技术方案作进一步具体说明。实施例如图I所示,本发明是一种基于MySQL双存储引擎的内存数据库实现方法,主要部件包括结构图中虚线椭圆框内的两个MySQL存储引擎(MySQL服务器)和虚线圆框内的内存表和缓存引擎。两个MySQL存储引擎和缓存引擎分布在不同的机器上,缓存引擎和自己的内存表在同一台机器上。分别安装在两台机器上的两个MySQL服务器,按照MySQL的复制功能,将它们配置成一个复制环,即双向复制,从任何一台服务器对表的修改都能够复制到另外一台服务器,每台服务器既是对方的主服务器(master)又是对方的从服务器(slave)。MySQLI和MySQL2是分别安装在两台机器上的MySQL服务器,数据即可从MySQLI写入也可从MySQL2写入,通过MySQL产品本身的复制机制,最终MySQLl服务器和MySQL2服务器的数据库表中的数据将保持一致。应用程序选哪个MySQL服务器读写由应用5程序自己决定,只要选其中一个可以工作的MySQL服务器作为激活的(active)即可,如图中应用程序3选了MySQLl服务器,并通过MySQLClient接口向物理数据库发起写操作,这些写操作最终会复制到MySQL2服务器上。应用程序I和2内部有各自的缓存引擎和内存表,它们同步MySQL2服务器上的记录,这些记录的更改可能来自应用程序3对MySQLl服务器上表的更改。图I展示了本发明的一种体系结构,但并不作为限制本发明的使用形式。tWn,虽然图中只有一个写物理数据库的应用程序,但在实际应用中可以有多个这样的应用程序。一个应用程序即可写物理数据库也可读内存表。总的来说,本发明的管理配置极少,缓存引擎只需知道一个MySQL服务器的地址即可,缓存哪些表及表中哪些记录由应用决定,主要配置是在两个MySQL服务器上,两个MySQL服务器的安装部署有特别之处,以达到要求。参照图1,两个MySQL服务器分别安装在两台机器上,同时每个机器上都有一个称为DBGate的进程,每个DBGate各自负责本地MySQL服务器的重启、死活检测、各种异常检测等等。当一台MySQL服务器有严重故障时,DBGate会将其停掉,并向系统网管发出告警。两个MySQL服务器没有公共的IP地址,即所谓的虚拟IP地址,只有各自的私有IP地址,它们之间除了MySQL复制功能模块间的交互没有任何其他交互。假设MySQLl的IP地址是10.50.49.12,MySQL2的IP地址是10.50.49.76,并且为它们建立相同的复制使用的账号是george,密码是rssl23。它们的物理数据库有相同的名字,即Isdb,并且是使用相同的具有持久存储功能的引擎建立的。那么,它们的MySQL配置分别如下,MySQLl服务器的配置server-id=Ilog-bin=mysql-binbinlog-do_db=lsdbbinlog-ignore-db=mysqlbinlog-format=STATEMENTreplicate-ignore-table=lsdb.cache—eventsauto-increment—increment=2auto-increment-offset=2master-host=10.50.49.76master—user=georgemaster-password=rssl23MySQL2服务器的配置server-id=2log-bin=mysql-binbinlog-do_db=lsdbbinlog-ignore-db=mysqlbinlog-format=STATEMENTreplicate-ignore-table=lsdb.cache—eventsauto-increment-increment=2auto-increment-offset=Imaster-host=10.50.49.12master—user=georgemaster-password=rssl23从上面的配置信息,可见两个MySQL服务器的配置项基本相同。不同是server_id、auto-increment-offset>master—host,其中auto-increment-offset是——个特别但很重要的配置项,在后面的内容中进行说明。本发明允许应用程序能往两个MySQL服务器同时写数据。但不能保证在下列情形数据能正确复制从MySQLl插入数据记录(kl,valuel,其中kl为唯一的索引键值),从MySQL2插入数据记录(kl,value2,kl为唯一的索引键值),假设MySQLl插入的记录已同步到MySQL2,那么此时,MySQL2不能插入记录(kl,value2)。或者假设MySQLl插入的记录还未同步到MySQL2,那么此刻,MySQL2能插入记录(kl,value2),但随后MySQL2在复制来自MySQLl的记录(kl,valuel)时会失败,因为键值为kl的记录(kl,value2)已存在于MySQL2上了。上述的情形是MySQL本身的异步复制特性引起的,但可由应用程序自行避免,比如不同的应用程序负责写不同的表,或者整个系统中只有一个应用程序负责写数据。在实际数据库中,一些表由于使用了自增长(auto_incretement)的数据类型,可能会导致复制出错。比如应用程序曾经通过MySQLl给某张表插入一个记录,MySQLl给该记录自增长类型的列赋值为100,假设该记录还没同步到MySQL2之前,应用程序发现MySQLl出了故障,并切换到MySQL2继续在相同的表中插入另一记录,MySQL2给该记录自增长类型的列赋值也为100,并插入成功,但随后MySQLl恢复正常,MySQL2开始复制还未复制的键值为100的记录(该记录在MySQLl上),此时复制会出错,因为MySQL2已有一个键值为100的记录,发生键值冲突。本发明通过设置MySQL服务器的变量auto_increment_increment(增长值)和auto_increment_offset(偏移量)可以协调两个MySQL服务器复制具有AUT0_INCREMENT列的表记录。把这些变量设置(auto_increment_increment和auto_increment_offset)为非冲突的值,在同一个表插入新行时,服务器分配的自增长的值就不会发生冲突,这样就可以解决上述这个问题,比如以这里的两台服务器I和2为例在MySQLl的配置中包含有auto-increment-increment=2auto-increment-offset=I在MySQL2的配置中包含有auto-increment-increment=2auto-increment-offset=2这样,两台服务器同时有数据插入到有自增长字段的表时,就不会发生冲突,一个简单的例子就是MySQLl下插入的自增长字段值为1,3,5,7……,以此类推,MySQL2下插入的自增长字段值就为2,4,6,8,……,以此类推。以上是本发明对存储引擎的配置和管理以实现持久冗余的存储。下面介绍本发明的缓存引擎的设计。本发明中虽然涉及两个MySQL服务器,但应用程序只需要知道其中一个MySQL服务器的地址即可,而无需知道两个,另外一个服务器的发现,完全由缓存引擎去发现。这对已有的应用程序改成使用本发明的内存数据库非常方便,比如,不需改变原来只有一个MySQL服务器的地址的配置。下面是缓存引擎发现另外一个MySQL服务器和选择其一做为Active的过程1.缓存引擎启动后,使用配置的MySQL服务器IP地址,尝试连接该服务器;2.若连接成功,则这个MySQL服务器作为active,并使用MySQL的命令‘showslave’获得另一台MySQL服务器的IP地址,并保存在一个本地文件中;3.若连接不成功,从上述的本地文件中读取另一台MySQL服务器的IP地址,若能连接,则以其作为active的服务器;4.若上述步骤的连接不成功,又不能从文件中读取另一MySQL服务器的IP(如无文件),则表明两台MySQL服务器的复制从未正确初始化安装或配置,或表明两台MySQL服务器之间从未曾正常通讯,需要检测数据库的安装配置问题。经过上述步骤,一般都能确定active的MySQL服务器,在随后对物理数据库的访问中,如果缓存引擎发现active的MySQLserver不能提供服务,而另外一台可以,贝U切换到另外那台MySQL服务器请求服务,将其作为active。每个应用程序中的缓存引擎选定MySQL服务器都是按上述步骤和原则独自确定的,互相之间无任何协商,故存在它们各自选了不同的MySQL服务器作为active的可能,但由于两个MySQL服务器是互相复制、互相备份的,所以这不影响内存表数据同步及MySQL的使用,不影响内存表内容的正确性。当一台MySQL服务器有严重故障时,DBGate会将其停掉,这样,所有的应用程序都会使用同一MySQL服务器。图2是缓存引擎的一种结构和工作流程图。本发明的缓存引擎是利用MySQL的触发器机制,将表记录的修改、增加、删除操作存储在一个专门的表中,该表称为缓存事件表cache_events。缓存引擎有一专门的线程(同步线程DB-Sync)负责读取cache_events表中的记录,该表记录的是event_id从小到大的事件,等价于按时间先后顺序,当读到事件表中的一个新的记录时,如果是一个修改或增加的日志,那么从物理数据库,根据事件中的表记录的唯一标识符读取对应的表记录,并将其同步到内存表中(当然如果物理数据库表中无该记录,则从内存表中删除它,以保持物理表与内存表一致)。如果是删除记录事件,而物理数据库中又确实无该记录了,则从内存表中删除它。简单流程如下①.应用程序调用MySQLAPI通过MySQL客户端向MySQL服务器请求修改物理数据库中的表(当然,数据修改也可以是复制了对端MySQL服务器上的修改操作);②.MySQL客户端发送插入、修改或删除记录的命令到MySQL服务器;③.MySQL服务器修改物理数据库表,并执行相应的触发器程序;④.触发器程序在cache_events表中插入一条事件记录;⑤.同步线程DB-Sync在某个时刻读到cache_events表中的这个新事件记录;⑥.如果是修改或插入表记录事件,同步线程会根据表名和记录ID从物理数据库表中读取相应的记录;⑦.如果是修改或插入表记录事件,将新数据同步到内存表中,如果是删除操作,则从内存表中删除记录。cache_eVentS表是缓存引擎工作中需要的关键表,其结构如图6;辅助物理表cachejnfo,其结构如图7。对每一个表,都需要分别为它的三种操作事件(插入、修改、删除)建立触发器程序,触发器程序由缓存引擎建立。假设物理数据库中有一张表,表名为vocLcontent,被选为表的行记录标识符字段的列的名为recordid_field,那么为它建立三个触发器程序的SQL语句如下①.插入记录触发器程序CREATETRIGGERtrigger_vod_content_insertAFTERINSERTonvod_contentFOREACHROWBEGINinsertintocache_events(record_id,‘vocLcontent’,event_type,timestamp)values(NEW.recordid_field,I,’I’,UNIX_TIMESTAMP(sysdate()));END②.修改记录触发器程序CREATETRIGGERtrigger_vod_content_updateAFTERUPDATEonvod_contentFOREACHROWBEGINinsertintocache_events(record_id,‘vod—content’,event_type,timestamp)values(NEW.recordid_field,I,’U’,UNIX_TIMESTAMP(sysdate()));END③.删除记录触发器程序CREATETRIGGERtrigger_vod_content_deleteAFTERDELETEonvod_contentFOREACHROWBEGINinsertintocache_events(record_id,‘vod—content’,event_type,timestamp)values(OLD.recordid_field,I,’D,,UNIX_TIMESTAMP(sysdate()));END缓存引擎启动的初始化过程1.建立cache_info表(如果存在则不建立);2.读取cache_info表中的数据,并保留;3.如果无trigger程序,根据cach_info表中的数据,建立之;4.读取cache_events,获得event_id最大的事件,即最后一个事件,并保留事件数据;5.取得物理数据库中的表名清单(调用SQL语句showtables获得);6.为应用需要缓存的表建立内存表,并按照应用需要设选记录条件,之后从从物理表中抓取记录存入内存表;7.启动同步线程DBSync0建立cache_info表的步骤如下1.连接物理数据库;2.查有无cache_info表,若无,继续下列步骤,否则,退出;2.建立cache_info表;3.取得物理数据库中的表名清单(调用SQL语句showtables);4.对清单中的每一个表<table_name>,查询其结构;5.确定可作为行记录标识ID的列字段名<id_col_name>;6.将表名和列字段名<id_col_name>作为一记录插入cache_info;注意cache_info会被复制到另一个MySQL服务器。建立内存表的具体部步骤1.用SQL语句desc<tablename>得到物理表的结构,建立一致的内存表结构(可按照应用需要,选定某些列,及设定选记录条件);2.用SQL语句showindexfrom<tablename>得到物理表的索引结构,建立一致的内存表索引;在完成了上述的初始化流程之后,缓存引擎就可开始工作了。图3是缓存引擎同步物理记录流程图。缓存引擎同步更新内存表的具体流程为1.等待5秒;2.5秒超过后,检查cache_events中有无新事件,如果无,回到第I步,否则,继续下列步骤;3.按event_id从小到大读取新事件,存入一个结果集;4.从结果集读取第一条事件记录,读取后从结果集中删除它;5.根据事件中record_id和table_id读物理数据库的一条记录;6.判断能否取得该物理记录,若无记录,跳到第8步执行,若有,执行下列步骤;7.用物理表记录的数据,插入或覆盖内存表对应记录,跳到第9步执行;8.从内存表中根据record_id和table_id删除记录;9.保留处理事件的event_id为last_event_id,这是设立同步点;10.判断第3步产生的结果集是否为空,若空,跳到第I步执行,不空,则跳到第4步执行。数据库服务器切换时,缓存引擎的处理本发明的缓存引擎借助表CaChe_eventS将每个对物理数据库表记录的修改操作(插入、删除、修改)同步到相应的内存表中。在本发明的设计中,该表不作复制,这样,cache_events表就相当于只记录本地物理数据库表操作的事件日志(LOG),每个事件按照其发生先后顺序按eVent_id从小到大排列。注意,cache_events就是一个本地日志(locallog)。图4是触发器与复制的一种关系图。在图中,如果应用程序先连接到MySQLl服务器,并成功执行了一个写操作,那么MySQLl服务器的触发器程序将同时在cache_events中插入一个事件记录(event_id=99),但它不会被复制到对端的MySQL2服务器的cache_events表中。只有当这个写操作复制到MySQL2服务器时,其上的触发器此时才会在本地的cache_events中插入一个事件记录(event_id=102),event_id102是MySQL2服务器自己分配的自增长值。可见,MySQL2服务器的事件记录的产生,不是复制了对端的cache_events中的记录,而是本地触发器产生的,它们的event_id都不相同(一个为奇数序列,另一个为偶数序列,这是由服务器的配置决定的)。反之,如果从MySQL2服务器写数据亦然。本发明不复制cache_events,其原因是,如果复制cache_events可能造成如下的问题假设一应用程序在MySQLl服务器写入数据并产生一个事件记录(eVent_id=7)在cache_events中,此时应用程序切换到MySQL2服务器,假设此时两MySQL服务器间复制不工作或不够及时,导致这个事件记录(event_id=7)和对应的表记录数据都未复制到MySQL2服务器上,也未同步到内存表中。切换后,应用程序继续在MySQL2写数据,并且产生事件记录12(event_id=12),缓存引擎的同步点指向了事件记录12。一段时间后,复制功能恢复,MySQLl服务器上的事件记录(event_id=7)和表记录数据都复制到MySQL2服务器上了,但由于事件记录(event_id=7)<事件记录(event_id=12),缓存引擎模块只能扑捉eVent_id大于12的日志记录事件,不会知晓小于12的事件的发生甚至存在,所以它并不能同步事件记录(event_id=7)对应的写操作到内存表中。这样,内存表就与物理数据库产生不一致了。在本发明的设计中,cache_events表不作复制,这样当应用程序切换MySQL服务器时,由于两台MySQL服务器的cache_events表事件记录的event_id(intvalue)可能完全不一致,甚至相差甚大,或者cache_events中记录的内容完全不一致。总之,切换引出的问题就是切换后,需要在新的cache_events找到合适的起点事件,即新的同步点,以保证缓存引擎可以在新的MySQL服务器上继续正确的同步数据。图5是缓存引擎处理MySQL服务器切换示意图。应用程序切换物理数据库之前,它连接在MySQLl服务器上,并且同步的最后事件是98(event_id=98),事件99,100没来得及同步就失去与MySQLl服务器的连接。而且我们还可以看到,MySQL2服务器的事件,从event_id看就与MySQLl服务器上的相差甚远,前者是从40到202,后者是从O到100,更何况其中之内容的差异。假设MySQLl的事件98记录中的时间戳(timestamp)是T98,并且应用程序的系统时间和MySQLl服务器上的系统时间相差为Td,即Td=APPtime-DBtime,按照应用程序的时间计算,事件98发生的时间是T98=T98+Td,若应用程序的系统时间和MySQL2服务器的系统时间相差为Td2,那么按照MySQL2服务器的时间计算,事件98发生的时间是T98=T98-Td20至此,我们估算出了事件98发生时对应MySQL2上的时间,当然,由于MySQLl和MySQL2的复制是异步的,可能事件98所代表的对物理数据库记录的操作还未在MySQL2发生也是极有可能的,但至少它已同步到内存表中了。有了T98后,缓存引擎开始搜索MySQL2服务器上的cache_events。根据最新事件写在尾部的原则,从后往前找(即从202开始,然后201,...),看看哪一个事件记录的时间戳最接近T98,假设我们最终找到的是事件44(即它的时间戳T44=T98),那么这就是切换后的新的事件同步点。由于按时间找不是很精确的,所以我们适当将新的事件同步点从44往前跳过若干个事件,以达到将同步时间往后退若干秒(如3秒),如跳到42。自此应用程序内的缓存引擎就从MySQL2上的事件42开始同步了,由于可能有些事件已同步了(比如44可能对应MySQLl服务器上的事件96),但重新执行事件对内存表本身无影响,因为缓存引擎在插入记录操作时,如果发现内存表中已有记录,则用物理表中的记录覆盖内存表中的记录;如果是删除事件,而物理表中存在记录,则缓存引擎将该事件转化为插入事件处理。所以本发明具有高可靠性、冗余备份、持久存储、高吞吐量、即时响应、直接访问表内存,使用效果好等特征。权利要求1.一种基于MySQL双存储引擎的内存数据库实现方法,其特征在于,包括以下步骤(A)选择两台计算机,并分别安装MySQL服务器;(B)分别在所述两台MySQL服务器上启动存储引擎,所述存储引擎是具有永久存储功能的存储引擎;(C)利用MySQL的复制功能,使所述两个存储引擎互为备份;(D)在应用程序中部署内存表和独立运行的缓存引擎。2.根据权利要求I所述一种基于MySQL双存储引擎的内存数据库实现方法,其特征在于所述步骤(D)中的内存表部署在各个应用程序的进程之内,不同的应用程序内都运行一个独立工作的缓存引擎,应用程序按照自己的需要选择不同的物理数据库表进行缓存,还根据需要从物理数据库表中选择不同的记录进行缓存。3.根据权利要求2所述一种基于MySQL双存储引擎的内存数据库实现方法,其特征在于所述物理数据库表是MySQL服务器磁盘上的数据库表。4.根据权利要求I或2所述一种基于MySQL双存储引擎的内存数据库实现方法,其特征在于所述内存表与应用程序进程占用同一个内存空间,提供直接读内存表记录的两种接口,两种接口都是紧耦合接口,一种接口是将内存表记录拷贝到应用进程指定的内存块中,另一种接口是将内存表记录的内存地址返回给应用进程以便直接访问其中数据,两种接口都采用记录的行读锁。5.根据权利要求I所述一种基于MySQL双存储引擎的内存数据库实现方法,其特征在于利用MySQL的触发器机制,实时地跟踪物理数据库表的修改动作,及时将物理数据库表记录的修改、增加、删除操作同步到内存表中,保持内存与磁盘的最终一致性。6.根据权利要求2所述一种基于MySQL双存储引擎的内存数据库实现方法,其特征在于所述缓存引擎运行在应用程序内,当一个MySQL存储引擎不能工作时,缓存引擎自动切换到另一MySQL存储引擎,继续同步物理数据库表数据。全文摘要本发明公开了一种基于MySQL双存储引擎的内存数据库实现方法,目的在于解决现有技术所存在的MySQL产品不能同时满足高可靠性、冗余备份、持久存储、高吞吐量、即时响应等技术问题。它能同时满足高可靠性、冗余备份、存储持久等要求,而且吞吐量大、响应速度快,使用十分方便,它包括以下步骤选择两台计算机,并分别安装MySQL服务器;分别在所述两台MySQL服务器上启动相同的存储引擎,建立等同的数据库,以实现内存数据库的持久存储功能;利用MySQL的复制功能,使所述两个存储引擎互为备份;配置内存表等。文档编号G06F17/30GK102937955SQ20111038737公开日2013年2月20日申请日期2011年11月29日优先权日2011年11月29日发明者徐继军申请人:Ut斯达康通讯有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1