欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法

文檔序號(hào):6439585閱讀:295來源:國(guó)知局

專利名稱::一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法
技術(shù)領(lǐng)域
:本發(fā)明涉及數(shù)據(jù)庫(kù)技術(shù),尤其涉及一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法。
背景技術(shù)
:目前MySQL被廣泛地應(yīng)用在Internet上的中小型網(wǎng)站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),許多中小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了MySQL作為網(wǎng)站數(shù)據(jù)庫(kù)。甚至在電信行業(yè)中,由于MySQL優(yōu)越的性能、穩(wěn)定性、完善的功能,也越來越多的被用于電信產(chǎn)品中。例如公開日為2008年04月09日、公開號(hào)為CN101158958A的專利文獻(xiàn)采用了這樣的技術(shù)方案,一種在線視頻控制系統(tǒng)及控制方法,其通過MySQL常規(guī)用法建立MySQL數(shù)據(jù)庫(kù)來對(duì)用戶信息、視頻信息和電影評(píng)論信息進(jìn)行控制,使用戶可以通過系統(tǒng)的操作界面輸入操作命令來實(shí)現(xiàn)操作目的,最終完成對(duì)所述視頻的各種操作,該方案雖然存在響應(yīng)速度、可靠性不高等不足,但仍然能夠順利實(shí)現(xiàn)視頻的各種操作控制。其實(shí),無論是互聯(lián)網(wǎng)產(chǎn)品還是電信產(chǎn)品,對(duì)產(chǎn)品的高可靠性及快速的響應(yīng)速度,都有著越來越高的要求。為了滿足高可靠性,在MySQL產(chǎn)品集中最好的選擇是MySQLCluster,它是一個(gè)高冗余的數(shù)據(jù)庫(kù)存儲(chǔ)引擎,但實(shí)踐證明,MySQLCluster的插入、查詢速度并不快,而且價(jià)格昂貴,管理功能有限。用戶需要很多二次開發(fā),比如,集群中的節(jié)點(diǎn)沒有自動(dòng)重啟的功能,需要用戶自行開發(fā),MySQLCluster作為一個(gè)新產(chǎn)品,也不夠穩(wěn)定。MySQL的Memory引擎,顧名思義,內(nèi)存中存儲(chǔ)數(shù)據(jù),非常高速,但MySQL服務(wù)器關(guān)閉后所有數(shù)據(jù)消失,沒有持久存儲(chǔ)的能力,而其使用SQL語句API,雖然方便,但沒有使查詢性能提高最大化。再者,關(guān)于MySQL的復(fù)制功能能解決備份、冗余、負(fù)載分擔(dān)等問題,但最終的查詢?cè)L問還是落在一個(gè)MySQL服務(wù)器上訪問磁盤表而非內(nèi)存表,對(duì)于快速度查詢,還是不如直接訪問內(nèi)存快。對(duì)于產(chǎn)品MySQLProxy,是主要借助MySQL的復(fù)制功能實(shí)現(xiàn)的,存在MySQL復(fù)制的問題。另外,雖然MySQL提供QueryCache機(jī)制,但它不適合查詢語句經(jīng)常變化的情形,并且如果數(shù)據(jù)表被更改,那么和這個(gè)數(shù)據(jù)表相關(guān)的全部Cache都會(huì)無效,并被刪除。當(dāng)然,MySQL的各種存儲(chǔ)引擎內(nèi)一般都有頁緩存機(jī)制,但這種機(jī)制復(fù)雜,由于緩存頁可能被釋放,可能在磁盤與緩存頁之間切換,造成過多的消耗,影響性能。還有訪問MySQL數(shù)據(jù)庫(kù),還需要解析編譯SQL語句,這都是不小的消耗。由上述可知,MySQL產(chǎn)品族中,并沒有一個(gè)能同時(shí)滿足高可靠性、冗余備份、持久存儲(chǔ)、高吞吐量、即時(shí)響應(yīng)、直接訪問表內(nèi)存的接口等要求的數(shù)據(jù)庫(kù)引擎。而MySQL之外的免費(fèi)內(nèi)存數(shù)據(jù)庫(kù),比如MonetDB、FastDB都是單機(jī)版的數(shù)據(jù)庫(kù),不能解決冗余備份問題。目前比較知名的商業(yè)內(nèi)存數(shù)據(jù)庫(kù)有Oracle的TimesTen,其性能非常強(qiáng)勁,但價(jià)格非常高昂,由于是關(guān)系型數(shù)據(jù)庫(kù),滿足嚴(yán)格的ACID(原子性、一致性、隔離性、持久性)要求,這也對(duì)讀寫速度也有著大的消耗,查詢速度未必最大化。其實(shí),為了提高數(shù)據(jù)庫(kù)的查詢性3能,很多公司都為自己的產(chǎn)品開發(fā)基于Oracle之上的內(nèi)存數(shù)據(jù)庫(kù)。Memcached也是常用的內(nèi)存對(duì)象緩存系統(tǒng),但它不基于數(shù)據(jù)庫(kù)表結(jié)構(gòu),不能直接用做表數(shù)據(jù)的緩存,需要一些在它之上的許多二次開發(fā)。在實(shí)際應(yīng)用中,很多產(chǎn)品并沒有嚴(yán)格的一致性要求,當(dāng)新數(shù)據(jù)寫入數(shù)據(jù)庫(kù)中時(shí),其實(shí)即使應(yīng)用程序并不能即時(shí)讀到該新數(shù)據(jù),也不影業(yè)務(wù)的運(yùn)行,比如,IPTV系統(tǒng),用戶購(gòu)買了某些頻道的觀看權(quán)利,由于訂購(gòu)記錄還未同步到用戶設(shè)備訪問的服務(wù)器中(也可能是內(nèi)存數(shù)據(jù)庫(kù)表中),幾秒鐘內(nèi)可能看不到節(jié)目,過了幾秒鐘后再看到,這是可以容忍的。再者,許多的應(yīng)用是查詢密集的應(yīng)用,少量的寫操作,所以只要能滿足高吞吐的查詢即可。
發(fā)明內(nèi)容本發(fā)明主要是解決現(xiàn)有技術(shù)所存在的MySQL產(chǎn)品不能同時(shí)滿足高可靠性、冗余備份、持久存儲(chǔ)、高吞吐量、即時(shí)響應(yīng)等技術(shù)問題,提供一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,它能夠在一些對(duì)一致性要求不嚴(yán)格、查詢密集、寫操作少的應(yīng)用中同時(shí)滿足高可靠性、冗余備份、存儲(chǔ)持久等要求,而且吞吐量大、響應(yīng)速度快,使用十分方便。本發(fā)明針對(duì)現(xiàn)有技術(shù)問題主要是通過下述技術(shù)方案得以解決的,一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,包括以下步驟(A)選擇兩臺(tái)計(jì)算機(jī),并分別安裝MySQL服務(wù)器;(B)分別在所述兩臺(tái)MySQL服務(wù)器上啟動(dòng)存儲(chǔ)引擎,所述存儲(chǔ)引擎是具有永久存儲(chǔ)功能的存儲(chǔ)引擎,建立等同的數(shù)據(jù)庫(kù),以實(shí)現(xiàn)內(nèi)存數(shù)據(jù)庫(kù)的持久存儲(chǔ)功能;(C)利用MySQL的復(fù)制功能,使所述兩個(gè)存儲(chǔ)引擎互為備份;(D)在應(yīng)用程序中部署內(nèi)存表和獨(dú)立運(yùn)行的緩存引擎。本發(fā)明選擇了兩個(gè)MySQL存儲(chǔ)引擎,這兩個(gè)存儲(chǔ)引擎分別運(yùn)行在兩個(gè)安裝在兩臺(tái)計(jì)算機(jī)上的MySQL服務(wù)器之內(nèi)。本發(fā)明選擇了具有持久存儲(chǔ)功能的MySQL存儲(chǔ)引擎,比如MyISAM存儲(chǔ)引擎或Innodb存儲(chǔ)引擎,以實(shí)現(xiàn)內(nèi)存數(shù)據(jù)庫(kù)的持久存儲(chǔ)。又利用MySQL的復(fù)制(replication)功能,使兩個(gè)存儲(chǔ)引擎互為備份,滿足冗余備份的要求,并且當(dāng)一個(gè)MySQL存儲(chǔ)引擎不能工作時(shí),另外一個(gè)能繼續(xù)提供服務(wù),再加上能提供高并發(fā)的快速查詢功能的內(nèi)存表,由此構(gòu)架了一個(gè)高可靠性、高性能的內(nèi)存數(shù)據(jù)庫(kù)平臺(tái)。作為優(yōu)選,內(nèi)存表部署在各個(gè)應(yīng)用程序的進(jìn)程之內(nèi),不同的應(yīng)用程序內(nèi)都運(yùn)行一個(gè)獨(dú)立工作的緩存引擎,應(yīng)用程序按照自己的需要選擇不同的物理數(shù)據(jù)庫(kù)表進(jìn)行緩存,還根據(jù)需要從物理數(shù)據(jù)庫(kù)表中選擇不同的記錄進(jìn)行緩存。各個(gè)應(yīng)用程序依靠自己的緩存引擎從物理數(shù)據(jù)庫(kù)表同步數(shù)據(jù)到內(nèi)存表,一個(gè)緩存引擎的故障并不影響其他緩存引擎的正常工作。兩個(gè)MySQL存儲(chǔ)引擎互相備份,而對(duì)表的寫操作,可以從任一引擎或兩引擎同時(shí)進(jìn)行。作為優(yōu)選,物理數(shù)據(jù)庫(kù)表是MySQL服務(wù)器磁盤上的數(shù)據(jù)庫(kù)表。物理數(shù)據(jù)庫(kù)也就是MySQL服務(wù)器磁盤上的數(shù)據(jù)庫(kù)。作為優(yōu)選,內(nèi)存表與應(yīng)用程序進(jìn)程占用同一個(gè)內(nèi)存空間,提供直接讀內(nèi)存表記錄的兩種接口,兩種接口都是緊耦合接口,一種接口是將內(nèi)存表記錄拷貝到應(yīng)用進(jìn)程指定的內(nèi)存塊中,另一種接口是將內(nèi)存表記錄的內(nèi)存地址返回給應(yīng)用進(jìn)程以便直接訪問其中數(shù)CN102937955A書明說3/10頁據(jù),兩種接口都采用記錄的行讀鎖。內(nèi)存表實(shí)現(xiàn)在應(yīng)用進(jìn)程的內(nèi)部,與應(yīng)用程序進(jìn)程占用同一個(gè)內(nèi)存空間,提供直接讀內(nèi)存表記錄的兩種接口,兩種都是緊耦合的接口,一種接口是將內(nèi)存表記錄拷貝到應(yīng)用進(jìn)程指定的內(nèi)存塊中,另一種接口是將內(nèi)存表記錄的內(nèi)存地址返回給應(yīng)用進(jìn)程以直接訪問其中數(shù)據(jù),兩種接口都采用記錄的行讀鎖。這種實(shí)現(xiàn)方式保證了對(duì)查詢密集的快速即時(shí)響應(yīng)。應(yīng)用本發(fā)明內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,可以根據(jù)需要部署多個(gè)緩存引擎,以實(shí)現(xiàn)一種集群的模式。作為優(yōu)選,利用MySQL的觸發(fā)器機(jī)制,比較實(shí)時(shí)地跟蹤物理數(shù)據(jù)庫(kù)表的修改動(dòng)作,及時(shí)將物理數(shù)據(jù)庫(kù)表記錄的修改、增加、刪除操作同步到內(nèi)存表中,保持內(nèi)存與磁盤的最終一致性,即保持內(nèi)存數(shù)據(jù)庫(kù)與物理數(shù)據(jù)庫(kù)的一致性。作為優(yōu)選,緩存引擎運(yùn)行在應(yīng)用程序內(nèi),當(dāng)一個(gè)MySQL存儲(chǔ)引擎不能工作時(shí),緩存引擎自動(dòng)切換到另一MySQL存儲(chǔ)引擎,繼續(xù)同步物理數(shù)據(jù)庫(kù)表數(shù)據(jù)。這些操作對(duì)應(yīng)用都是透明的。切換過程及切換后,內(nèi)存表中的數(shù)據(jù)并不丟失,并且即使兩個(gè)存儲(chǔ)引擎同時(shí)發(fā)生故障時(shí),由于內(nèi)存表依然存在并可用,所以應(yīng)用程序還可依賴內(nèi)存表繼續(xù)提供一定的服務(wù)。本發(fā)明帶來的有益效果是,提供了一種能同時(shí)滿足高可靠性、冗余備份、持久存儲(chǔ)、高吞吐量、即時(shí)響應(yīng)、直接訪問表內(nèi)存的MySQL內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,在對(duì)一致性要求不嚴(yán)格、查詢密集、寫操作少的應(yīng)用環(huán)境具有優(yōu)良的使用效果。圖I是本發(fā)明的一種整體結(jié)構(gòu)框圖;圖2是本發(fā)明緩存引擎的一種結(jié)構(gòu)和工作流程圖;圖3是本發(fā)明緩存引擎同步物理記錄的一種流程圖;圖4是本發(fā)明觸發(fā)器與復(fù)制的一種關(guān)系圖;圖5是本發(fā)明緩存引擎處理MySQL服務(wù)器切換示意圖;圖6是本發(fā)明的一種緩存事件表結(jié)構(gòu);圖7是本發(fā)明的輔助物理表結(jié)構(gòu)。具體實(shí)施方式下面通過實(shí)施例,并結(jié)合附圖,對(duì)本發(fā)明的技術(shù)方案作進(jìn)一步具體說明。實(shí)施例如圖I所示,本發(fā)明是一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,主要部件包括結(jié)構(gòu)圖中虛線橢圓框內(nèi)的兩個(gè)MySQL存儲(chǔ)引擎(MySQL服務(wù)器)和虛線圓框內(nèi)的內(nèi)存表和緩存引擎。兩個(gè)MySQL存儲(chǔ)引擎和緩存引擎分布在不同的機(jī)器上,緩存引擎和自己的內(nèi)存表在同一臺(tái)機(jī)器上。分別安裝在兩臺(tái)機(jī)器上的兩個(gè)MySQL服務(wù)器,按照MySQL的復(fù)制功能,將它們配置成一個(gè)復(fù)制環(huán),即雙向復(fù)制,從任何一臺(tái)服務(wù)器對(duì)表的修改都能夠復(fù)制到另外一臺(tái)服務(wù)器,每臺(tái)服務(wù)器既是對(duì)方的主服務(wù)器(master)又是對(duì)方的從服務(wù)器(slave)。MySQLI和MySQL2是分別安裝在兩臺(tái)機(jī)器上的MySQL服務(wù)器,數(shù)據(jù)即可從MySQLI寫入也可從MySQL2寫入,通過MySQL產(chǎn)品本身的復(fù)制機(jī)制,最終MySQLl服務(wù)器和MySQL2服務(wù)器的數(shù)據(jù)庫(kù)表中的數(shù)據(jù)將保持一致。應(yīng)用程序選哪個(gè)MySQL服務(wù)器讀寫由應(yīng)用5程序自己決定,只要選其中一個(gè)可以工作的MySQL服務(wù)器作為激活的(active)即可,如圖中應(yīng)用程序3選了MySQLl服務(wù)器,并通過MySQLClient接口向物理數(shù)據(jù)庫(kù)發(fā)起寫操作,這些寫操作最終會(huì)復(fù)制到MySQL2服務(wù)器上。應(yīng)用程序I和2內(nèi)部有各自的緩存引擎和內(nèi)存表,它們同步MySQL2服務(wù)器上的記錄,這些記錄的更改可能來自應(yīng)用程序3對(duì)MySQLl服務(wù)器上表的更改。圖I展示了本發(fā)明的一種體系結(jié)構(gòu),但并不作為限制本發(fā)明的使用形式。tWn,雖然圖中只有一個(gè)寫物理數(shù)據(jù)庫(kù)的應(yīng)用程序,但在實(shí)際應(yīng)用中可以有多個(gè)這樣的應(yīng)用程序。一個(gè)應(yīng)用程序即可寫物理數(shù)據(jù)庫(kù)也可讀內(nèi)存表。總的來說,本發(fā)明的管理配置極少,緩存引擎只需知道一個(gè)MySQL服務(wù)器的地址即可,緩存哪些表及表中哪些記錄由應(yīng)用決定,主要配置是在兩個(gè)MySQL服務(wù)器上,兩個(gè)MySQL服務(wù)器的安裝部署有特別之處,以達(dá)到要求。參照?qǐng)D1,兩個(gè)MySQL服務(wù)器分別安裝在兩臺(tái)機(jī)器上,同時(shí)每個(gè)機(jī)器上都有一個(gè)稱為DBGate的進(jìn)程,每個(gè)DBGate各自負(fù)責(zé)本地MySQL服務(wù)器的重啟、死活檢測(cè)、各種異常檢測(cè)等等。當(dāng)一臺(tái)MySQL服務(wù)器有嚴(yán)重故障時(shí),DBGate會(huì)將其停掉,并向系統(tǒng)網(wǎng)管發(fā)出告警。兩個(gè)MySQL服務(wù)器沒有公共的IP地址,即所謂的虛擬IP地址,只有各自的私有IP地址,它們之間除了MySQL復(fù)制功能模塊間的交互沒有任何其他交互。假設(shè)MySQLl的IP地址是10.50.49.12,MySQL2的IP地址是10.50.49.76,并且為它們建立相同的復(fù)制使用的賬號(hào)是george,密碼是rssl23。它們的物理數(shù)據(jù)庫(kù)有相同的名字,即Isdb,并且是使用相同的具有持久存儲(chǔ)功能的引擎建立的。那么,它們的MySQL配置分別如下,MySQLl服務(wù)器的配置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服務(wù)器的配置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從上面的配置信息,可見兩個(gè)MySQL服務(wù)器的配置項(xiàng)基本相同。不同是server_id、auto-increment-offset>master—host,其中auto-increment-offset是——個(gè)特別但很重要的配置項(xiàng),在后面的內(nèi)容中進(jìn)行說明。本發(fā)明允許應(yīng)用程序能往兩個(gè)MySQL服務(wù)器同時(shí)寫數(shù)據(jù)。但不能保證在下列情形數(shù)據(jù)能正確復(fù)制從MySQLl插入數(shù)據(jù)記錄(kl,valuel,其中kl為唯一的索引鍵值),從MySQL2插入數(shù)據(jù)記錄(kl,value2,kl為唯一的索引鍵值),假設(shè)MySQLl插入的記錄已同步到MySQL2,那么此時(shí),MySQL2不能插入記錄(kl,value2)。或者假設(shè)MySQLl插入的記錄還未同步到MySQL2,那么此刻,MySQL2能插入記錄(kl,value2),但隨后MySQL2在復(fù)制來自MySQLl的記錄(kl,valuel)時(shí)會(huì)失敗,因?yàn)殒I值為kl的記錄(kl,value2)已存在于MySQL2上了。上述的情形是MySQL本身的異步復(fù)制特性引起的,但可由應(yīng)用程序自行避免,比如不同的應(yīng)用程序負(fù)責(zé)寫不同的表,或者整個(gè)系統(tǒng)中只有一個(gè)應(yīng)用程序負(fù)責(zé)寫數(shù)據(jù)。在實(shí)際數(shù)據(jù)庫(kù)中,一些表由于使用了自增長(zhǎng)(auto_incretement)的數(shù)據(jù)類型,可能會(huì)導(dǎo)致復(fù)制出錯(cuò)。比如應(yīng)用程序曾經(jīng)通過MySQLl給某張表插入一個(gè)記錄,MySQLl給該記錄自增長(zhǎng)類型的列賦值為100,假設(shè)該記錄還沒同步到MySQL2之前,應(yīng)用程序發(fā)現(xiàn)MySQLl出了故障,并切換到MySQL2繼續(xù)在相同的表中插入另一記錄,MySQL2給該記錄自增長(zhǎng)類型的列賦值也為100,并插入成功,但隨后MySQLl恢復(fù)正常,MySQL2開始復(fù)制還未復(fù)制的鍵值為100的記錄(該記錄在MySQLl上),此時(shí)復(fù)制會(huì)出錯(cuò),因?yàn)镸ySQL2已有一個(gè)鍵值為100的記錄,發(fā)生鍵值沖突。本發(fā)明通過設(shè)置MySQL服務(wù)器的變量auto_increment_increment(增長(zhǎng)值)和auto_increment_offset(偏移量)可以協(xié)調(diào)兩個(gè)MySQL服務(wù)器復(fù)制具有AUT0_INCREMENT列的表記錄。把這些變量設(shè)置(auto_increment_increment和auto_increment_offset)為非沖突的值,在同一個(gè)表插入新行時(shí),服務(wù)器分配的自增長(zhǎng)的值就不會(huì)發(fā)生沖突,這樣就可以解決上述這個(gè)問題,比如以這里的兩臺(tái)服務(wù)器I和2為例在MySQLl的配置中包含有auto-increment-increment=2auto-increment-offset=I在MySQL2的配置中包含有auto-increment-increment=2auto-increment-offset=2這樣,兩臺(tái)服務(wù)器同時(shí)有數(shù)據(jù)插入到有自增長(zhǎng)字段的表時(shí),就不會(huì)發(fā)生沖突,一個(gè)簡(jiǎn)單的例子就是MySQLl下插入的自增長(zhǎng)字段值為1,3,5,7……,以此類推,MySQL2下插入的自增長(zhǎng)字段值就為2,4,6,8,……,以此類推。以上是本發(fā)明對(duì)存儲(chǔ)引擎的配置和管理以實(shí)現(xiàn)持久冗余的存儲(chǔ)。下面介紹本發(fā)明的緩存引擎的設(shè)計(jì)。本發(fā)明中雖然涉及兩個(gè)MySQL服務(wù)器,但應(yīng)用程序只需要知道其中一個(gè)MySQL服務(wù)器的地址即可,而無需知道兩個(gè),另外一個(gè)服務(wù)器的發(fā)現(xiàn),完全由緩存引擎去發(fā)現(xiàn)。這對(duì)已有的應(yīng)用程序改成使用本發(fā)明的內(nèi)存數(shù)據(jù)庫(kù)非常方便,比如,不需改變?cè)瓉碇挥幸粋€(gè)MySQL服務(wù)器的地址的配置。下面是緩存引擎發(fā)現(xiàn)另外一個(gè)MySQL服務(wù)器和選擇其一做為Active的過程1.緩存引擎啟動(dòng)后,使用配置的MySQL服務(wù)器IP地址,嘗試連接該服務(wù)器;2.若連接成功,則這個(gè)MySQL服務(wù)器作為active,并使用MySQL的命令‘showslave’獲得另一臺(tái)MySQL服務(wù)器的IP地址,并保存在一個(gè)本地文件中;3.若連接不成功,從上述的本地文件中讀取另一臺(tái)MySQL服務(wù)器的IP地址,若能連接,則以其作為active的服務(wù)器;4.若上述步驟的連接不成功,又不能從文件中讀取另一MySQL服務(wù)器的IP(如無文件),則表明兩臺(tái)MySQL服務(wù)器的復(fù)制從未正確初始化安裝或配置,或表明兩臺(tái)MySQL服務(wù)器之間從未曾正常通訊,需要檢測(cè)數(shù)據(jù)庫(kù)的安裝配置問題。經(jīng)過上述步驟,一般都能確定active的MySQL服務(wù)器,在隨后對(duì)物理數(shù)據(jù)庫(kù)的訪問中,如果緩存引擎發(fā)現(xiàn)active的MySQLserver不能提供服務(wù),而另外一臺(tái)可以,貝U切換到另外那臺(tái)MySQL服務(wù)器請(qǐng)求服務(wù),將其作為active。每個(gè)應(yīng)用程序中的緩存引擎選定MySQL服務(wù)器都是按上述步驟和原則獨(dú)自確定的,互相之間無任何協(xié)商,故存在它們各自選了不同的MySQL服務(wù)器作為active的可能,但由于兩個(gè)MySQL服務(wù)器是互相復(fù)制、互相備份的,所以這不影響內(nèi)存表數(shù)據(jù)同步及MySQL的使用,不影響內(nèi)存表內(nèi)容的正確性。當(dāng)一臺(tái)MySQL服務(wù)器有嚴(yán)重故障時(shí),DBGate會(huì)將其停掉,這樣,所有的應(yīng)用程序都會(huì)使用同一MySQL服務(wù)器。圖2是緩存引擎的一種結(jié)構(gòu)和工作流程圖。本發(fā)明的緩存引擎是利用MySQL的觸發(fā)器機(jī)制,將表記錄的修改、增加、刪除操作存儲(chǔ)在一個(gè)專門的表中,該表稱為緩存事件表cache_events。緩存引擎有一專門的線程(同步線程DB-Sync)負(fù)責(zé)讀取cache_events表中的記錄,該表記錄的是event_id從小到大的事件,等價(jià)于按時(shí)間先后順序,當(dāng)讀到事件表中的一個(gè)新的記錄時(shí),如果是一個(gè)修改或增加的日志,那么從物理數(shù)據(jù)庫(kù),根據(jù)事件中的表記錄的唯一標(biāo)識(shí)符讀取對(duì)應(yīng)的表記錄,并將其同步到內(nèi)存表中(當(dāng)然如果物理數(shù)據(jù)庫(kù)表中無該記錄,則從內(nèi)存表中刪除它,以保持物理表與內(nèi)存表一致)。如果是刪除記錄事件,而物理數(shù)據(jù)庫(kù)中又確實(shí)無該記錄了,則從內(nèi)存表中刪除它。簡(jiǎn)單流程如下①.應(yīng)用程序調(diào)用MySQLAPI通過MySQL客戶端向MySQL服務(wù)器請(qǐng)求修改物理數(shù)據(jù)庫(kù)中的表(當(dāng)然,數(shù)據(jù)修改也可以是復(fù)制了對(duì)端MySQL服務(wù)器上的修改操作);②.MySQL客戶端發(fā)送插入、修改或刪除記錄的命令到MySQL服務(wù)器;③.MySQL服務(wù)器修改物理數(shù)據(jù)庫(kù)表,并執(zhí)行相應(yīng)的觸發(fā)器程序;④.觸發(fā)器程序在cache_events表中插入一條事件記錄;⑤.同步線程DB-Sync在某個(gè)時(shí)刻讀到cache_events表中的這個(gè)新事件記錄;⑥.如果是修改或插入表記錄事件,同步線程會(huì)根據(jù)表名和記錄ID從物理數(shù)據(jù)庫(kù)表中讀取相應(yīng)的記錄;⑦.如果是修改或插入表記錄事件,將新數(shù)據(jù)同步到內(nèi)存表中,如果是刪除操作,則從內(nèi)存表中刪除記錄。cache_eVentS表是緩存引擎工作中需要的關(guān)鍵表,其結(jié)構(gòu)如圖6;輔助物理表cachejnfo,其結(jié)構(gòu)如圖7。對(duì)每一個(gè)表,都需要分別為它的三種操作事件(插入、修改、刪除)建立觸發(fā)器程序,觸發(fā)器程序由緩存引擎建立。假設(shè)物理數(shù)據(jù)庫(kù)中有一張表,表名為vocLcontent,被選為表的行記錄標(biāo)識(shí)符字段的列的名為recordid_field,那么為它建立三個(gè)觸發(fā)器程序的SQL語句如下①.插入記錄觸發(fā)器程序CREATETRIGGERtrigger_vod_content_insertAFTERINSERTonvod_contentFOREACHROWBEGINinsertintocache_events(record_id,‘vocLcontent’,event_type,timestamp)values(NEW.recordid_field,I,’I’,UNIX_TIMESTAMP(sysdate()));END②.修改記錄觸發(fā)器程序CREATETRIGGERtrigger_vod_content_updateAFTERUPDATEonvod_contentFOREACHROWBEGINinsertintocache_events(record_id,‘vod—content’,event_type,timestamp)values(NEW.recordid_field,I,’U’,UNIX_TIMESTAMP(sysdate()));END③.刪除記錄觸發(fā)器程序CREATETRIGGERtrigger_vod_content_deleteAFTERDELETEonvod_contentFOREACHROWBEGINinsertintocache_events(record_id,‘vod—content’,event_type,timestamp)values(OLD.recordid_field,I,’D,,UNIX_TIMESTAMP(sysdate()));END緩存引擎啟動(dòng)的初始化過程1.建立cache_info表(如果存在則不建立);2.讀取cache_info表中的數(shù)據(jù),并保留;3.如果無trigger程序,根據(jù)cach_info表中的數(shù)據(jù),建立之;4.讀取cache_events,獲得event_id最大的事件,即最后一個(gè)事件,并保留事件數(shù)據(jù);5.取得物理數(shù)據(jù)庫(kù)中的表名清單(調(diào)用SQL語句showtables獲得);6.為應(yīng)用需要緩存的表建立內(nèi)存表,并按照應(yīng)用需要設(shè)選記錄條件,之后從從物理表中抓取記錄存入內(nèi)存表;7.啟動(dòng)同步線程DBSync0建立cache_info表的步驟如下1.連接物理數(shù)據(jù)庫(kù);2.查有無cache_info表,若無,繼續(xù)下列步驟,否則,退出;2.建立cache_info表;3.取得物理數(shù)據(jù)庫(kù)中的表名清單(調(diào)用SQL語句showtables);4.對(duì)清單中的每一個(gè)表<table_name>,查詢其結(jié)構(gòu);5.確定可作為行記錄標(biāo)識(shí)ID的列字段名<id_col_name>;6.將表名和列字段名<id_col_name>作為一記錄插入cache_info;注意cache_info會(huì)被復(fù)制到另一個(gè)MySQL服務(wù)器。建立內(nèi)存表的具體部步驟1.用SQL語句desc<tablename>得到物理表的結(jié)構(gòu),建立一致的內(nèi)存表結(jié)構(gòu)(可按照應(yīng)用需要,選定某些列,及設(shè)定選記錄條件);2.用SQL語句showindexfrom<tablename>得到物理表的索引結(jié)構(gòu),建立一致的內(nèi)存表索引;在完成了上述的初始化流程之后,緩存引擎就可開始工作了。圖3是緩存引擎同步物理記錄流程圖。緩存引擎同步更新內(nèi)存表的具體流程為1.等待5秒;2.5秒超過后,檢查cache_events中有無新事件,如果無,回到第I步,否則,繼續(xù)下列步驟;3.按event_id從小到大讀取新事件,存入一個(gè)結(jié)果集;4.從結(jié)果集讀取第一條事件記錄,讀取后從結(jié)果集中刪除它;5.根據(jù)事件中record_id和table_id讀物理數(shù)據(jù)庫(kù)的一條記錄;6.判斷能否取得該物理記錄,若無記錄,跳到第8步執(zhí)行,若有,執(zhí)行下列步驟;7.用物理表記錄的數(shù)據(jù),插入或覆蓋內(nèi)存表對(duì)應(yīng)記錄,跳到第9步執(zhí)行;8.從內(nèi)存表中根據(jù)record_id和table_id刪除記錄;9.保留處理事件的event_id為last_event_id,這是設(shè)立同步點(diǎn);10.判斷第3步產(chǎn)生的結(jié)果集是否為空,若空,跳到第I步執(zhí)行,不空,則跳到第4步執(zhí)行。數(shù)據(jù)庫(kù)服務(wù)器切換時(shí),緩存引擎的處理本發(fā)明的緩存引擎借助表CaChe_eventS將每個(gè)對(duì)物理數(shù)據(jù)庫(kù)表記錄的修改操作(插入、刪除、修改)同步到相應(yīng)的內(nèi)存表中。在本發(fā)明的設(shè)計(jì)中,該表不作復(fù)制,這樣,cache_events表就相當(dāng)于只記錄本地物理數(shù)據(jù)庫(kù)表操作的事件日志(LOG),每個(gè)事件按照其發(fā)生先后順序按eVent_id從小到大排列。注意,cache_events就是一個(gè)本地日志(locallog)。圖4是觸發(fā)器與復(fù)制的一種關(guān)系圖。在圖中,如果應(yīng)用程序先連接到MySQLl服務(wù)器,并成功執(zhí)行了一個(gè)寫操作,那么MySQLl服務(wù)器的觸發(fā)器程序?qū)⑼瑫r(shí)在cache_events中插入一個(gè)事件記錄(event_id=99),但它不會(huì)被復(fù)制到對(duì)端的MySQL2服務(wù)器的cache_events表中。只有當(dāng)這個(gè)寫操作復(fù)制到MySQL2服務(wù)器時(shí),其上的觸發(fā)器此時(shí)才會(huì)在本地的cache_events中插入一個(gè)事件記錄(event_id=102),event_id102是MySQL2服務(wù)器自己分配的自增長(zhǎng)值??梢?,MySQL2服務(wù)器的事件記錄的產(chǎn)生,不是復(fù)制了對(duì)端的cache_events中的記錄,而是本地觸發(fā)器產(chǎn)生的,它們的event_id都不相同(一個(gè)為奇數(shù)序列,另一個(gè)為偶數(shù)序列,這是由服務(wù)器的配置決定的)。反之,如果從MySQL2服務(wù)器寫數(shù)據(jù)亦然。本發(fā)明不復(fù)制cache_events,其原因是,如果復(fù)制cache_events可能造成如下的問題假設(shè)一應(yīng)用程序在MySQLl服務(wù)器寫入數(shù)據(jù)并產(chǎn)生一個(gè)事件記錄(eVent_id=7)在cache_events中,此時(shí)應(yīng)用程序切換到MySQL2服務(wù)器,假設(shè)此時(shí)兩MySQL服務(wù)器間復(fù)制不工作或不夠及時(shí),導(dǎo)致這個(gè)事件記錄(event_id=7)和對(duì)應(yīng)的表記錄數(shù)據(jù)都未復(fù)制到MySQL2服務(wù)器上,也未同步到內(nèi)存表中。切換后,應(yīng)用程序繼續(xù)在MySQL2寫數(shù)據(jù),并且產(chǎn)生事件記錄12(event_id=12),緩存引擎的同步點(diǎn)指向了事件記錄12。一段時(shí)間后,復(fù)制功能恢復(fù),MySQLl服務(wù)器上的事件記錄(event_id=7)和表記錄數(shù)據(jù)都復(fù)制到MySQL2服務(wù)器上了,但由于事件記錄(event_id=7)<事件記錄(event_id=12),緩存引擎模塊只能撲捉eVent_id大于12的日志記錄事件,不會(huì)知曉小于12的事件的發(fā)生甚至存在,所以它并不能同步事件記錄(event_id=7)對(duì)應(yīng)的寫操作到內(nèi)存表中。這樣,內(nèi)存表就與物理數(shù)據(jù)庫(kù)產(chǎn)生不一致了。在本發(fā)明的設(shè)計(jì)中,cache_events表不作復(fù)制,這樣當(dāng)應(yīng)用程序切換MySQL服務(wù)器時(shí),由于兩臺(tái)MySQL服務(wù)器的cache_events表事件記錄的event_id(intvalue)可能完全不一致,甚至相差甚大,或者cache_events中記錄的內(nèi)容完全不一致??傊?,切換引出的問題就是切換后,需要在新的cache_events找到合適的起點(diǎn)事件,即新的同步點(diǎn),以保證緩存引擎可以在新的MySQL服務(wù)器上繼續(xù)正確的同步數(shù)據(jù)。圖5是緩存引擎處理MySQL服務(wù)器切換示意圖。應(yīng)用程序切換物理數(shù)據(jù)庫(kù)之前,它連接在MySQLl服務(wù)器上,并且同步的最后事件是98(event_id=98),事件99,100沒來得及同步就失去與MySQLl服務(wù)器的連接。而且我們還可以看到,MySQL2服務(wù)器的事件,從event_id看就與MySQLl服務(wù)器上的相差甚遠(yuǎn),前者是從40到202,后者是從O到100,更何況其中之內(nèi)容的差異。假設(shè)MySQLl的事件98記錄中的時(shí)間戳(timestamp)是T98,并且應(yīng)用程序的系統(tǒng)時(shí)間和MySQLl服務(wù)器上的系統(tǒng)時(shí)間相差為Td,即Td=APPtime-DBtime,按照應(yīng)用程序的時(shí)間計(jì)算,事件98發(fā)生的時(shí)間是T98=T98+Td,若應(yīng)用程序的系統(tǒng)時(shí)間和MySQL2服務(wù)器的系統(tǒng)時(shí)間相差為Td2,那么按照MySQL2服務(wù)器的時(shí)間計(jì)算,事件98發(fā)生的時(shí)間是T98=T98-Td20至此,我們估算出了事件98發(fā)生時(shí)對(duì)應(yīng)MySQL2上的時(shí)間,當(dāng)然,由于MySQLl和MySQL2的復(fù)制是異步的,可能事件98所代表的對(duì)物理數(shù)據(jù)庫(kù)記錄的操作還未在MySQL2發(fā)生也是極有可能的,但至少它已同步到內(nèi)存表中了。有了T98后,緩存引擎開始搜索MySQL2服務(wù)器上的cache_events。根據(jù)最新事件寫在尾部的原則,從后往前找(即從202開始,然后201,...),看看哪一個(gè)事件記錄的時(shí)間戳最接近T98,假設(shè)我們最終找到的是事件44(即它的時(shí)間戳T44=T98),那么這就是切換后的新的事件同步點(diǎn)。由于按時(shí)間找不是很精確的,所以我們適當(dāng)將新的事件同步點(diǎn)從44往前跳過若干個(gè)事件,以達(dá)到將同步時(shí)間往后退若干秒(如3秒),如跳到42。自此應(yīng)用程序內(nèi)的緩存引擎就從MySQL2上的事件42開始同步了,由于可能有些事件已同步了(比如44可能對(duì)應(yīng)MySQLl服務(wù)器上的事件96),但重新執(zhí)行事件對(duì)內(nèi)存表本身無影響,因?yàn)榫彺嬉嬖诓迦胗涗洸僮鲿r(shí),如果發(fā)現(xiàn)內(nèi)存表中已有記錄,則用物理表中的記錄覆蓋內(nèi)存表中的記錄;如果是刪除事件,而物理表中存在記錄,則緩存引擎將該事件轉(zhuǎn)化為插入事件處理。所以本發(fā)明具有高可靠性、冗余備份、持久存儲(chǔ)、高吞吐量、即時(shí)響應(yīng)、直接訪問表內(nèi)存,使用效果好等特征。權(quán)利要求1.一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,其特征在于,包括以下步驟(A)選擇兩臺(tái)計(jì)算機(jī),并分別安裝MySQL服務(wù)器;(B)分別在所述兩臺(tái)MySQL服務(wù)器上啟動(dòng)存儲(chǔ)引擎,所述存儲(chǔ)引擎是具有永久存儲(chǔ)功能的存儲(chǔ)引擎;(C)利用MySQL的復(fù)制功能,使所述兩個(gè)存儲(chǔ)引擎互為備份;(D)在應(yīng)用程序中部署內(nèi)存表和獨(dú)立運(yùn)行的緩存引擎。2.根據(jù)權(quán)利要求I所述一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,其特征在于所述步驟(D)中的內(nèi)存表部署在各個(gè)應(yīng)用程序的進(jìn)程之內(nèi),不同的應(yīng)用程序內(nèi)都運(yùn)行一個(gè)獨(dú)立工作的緩存引擎,應(yīng)用程序按照自己的需要選擇不同的物理數(shù)據(jù)庫(kù)表進(jìn)行緩存,還根據(jù)需要從物理數(shù)據(jù)庫(kù)表中選擇不同的記錄進(jìn)行緩存。3.根據(jù)權(quán)利要求2所述一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,其特征在于所述物理數(shù)據(jù)庫(kù)表是MySQL服務(wù)器磁盤上的數(shù)據(jù)庫(kù)表。4.根據(jù)權(quán)利要求I或2所述一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,其特征在于所述內(nèi)存表與應(yīng)用程序進(jìn)程占用同一個(gè)內(nèi)存空間,提供直接讀內(nèi)存表記錄的兩種接口,兩種接口都是緊耦合接口,一種接口是將內(nèi)存表記錄拷貝到應(yīng)用進(jìn)程指定的內(nèi)存塊中,另一種接口是將內(nèi)存表記錄的內(nèi)存地址返回給應(yīng)用進(jìn)程以便直接訪問其中數(shù)據(jù),兩種接口都采用記錄的行讀鎖。5.根據(jù)權(quán)利要求I所述一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,其特征在于利用MySQL的觸發(fā)器機(jī)制,實(shí)時(shí)地跟蹤物理數(shù)據(jù)庫(kù)表的修改動(dòng)作,及時(shí)將物理數(shù)據(jù)庫(kù)表記錄的修改、增加、刪除操作同步到內(nèi)存表中,保持內(nèi)存與磁盤的最終一致性。6.根據(jù)權(quán)利要求2所述一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,其特征在于所述緩存引擎運(yùn)行在應(yīng)用程序內(nèi),當(dāng)一個(gè)MySQL存儲(chǔ)引擎不能工作時(shí),緩存引擎自動(dòng)切換到另一MySQL存儲(chǔ)引擎,繼續(xù)同步物理數(shù)據(jù)庫(kù)表數(shù)據(jù)。全文摘要本發(fā)明公開了一種基于MySQL雙存儲(chǔ)引擎的內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)方法,目的在于解決現(xiàn)有技術(shù)所存在的MySQL產(chǎn)品不能同時(shí)滿足高可靠性、冗余備份、持久存儲(chǔ)、高吞吐量、即時(shí)響應(yīng)等技術(shù)問題。它能同時(shí)滿足高可靠性、冗余備份、存儲(chǔ)持久等要求,而且吞吐量大、響應(yīng)速度快,使用十分方便,它包括以下步驟選擇兩臺(tái)計(jì)算機(jī),并分別安裝MySQL服務(wù)器;分別在所述兩臺(tái)MySQL服務(wù)器上啟動(dòng)相同的存儲(chǔ)引擎,建立等同的數(shù)據(jù)庫(kù),以實(shí)現(xiàn)內(nèi)存數(shù)據(jù)庫(kù)的持久存儲(chǔ)功能;利用MySQL的復(fù)制功能,使所述兩個(gè)存儲(chǔ)引擎互為備份;配置內(nèi)存表等。文檔編號(hào)G06F17/30GK102937955SQ20111038737公開日2013年2月20日申請(qǐng)日期2011年11月29日優(yōu)先權(quán)日2011年11月29日發(fā)明者徐繼軍申請(qǐng)人:Ut斯達(dá)康通訊有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
定西市| 公主岭市| 芮城县| 荃湾区| 即墨市| 遂溪县| 河曲县| 湛江市| 泽普县| 麟游县| 馆陶县| 饶河县| 太原市| 红河县| 肃宁县| 奇台县| 城口县| 呼和浩特市| 平和县| 清远市| 雅安市| 山阳县| 井陉县| 呼玛县| 大同县| 澜沧| 南投县| 水富县| 石河子市| 洮南市| 绩溪县| 寿阳县| 怀来县| 罗甸县| 嘉禾县| 林芝县| 改则县| 华安县| 桐城市| 天祝| 桐乡市|