異步緩存數(shù)據(jù)同步的方法
【專利摘要】本發(fā)明涉及網(wǎng)絡(luò)【技術(shù)領(lǐng)域】,具體涉及一種異步緩存數(shù)據(jù)同步的方法。本發(fā)明是將MySQL數(shù)據(jù)首先放入Gearman中,然后通過一個(gè)編寫的PHP Gearman Worker,將數(shù)據(jù)同步到Redis。本發(fā)明解決了靜態(tài)緩存、Redis處理存在開銷大、數(shù)據(jù)可靠性難以滿足的問題;可以用于異步緩存數(shù)據(jù)的同步處理。
【專利說明】異步緩存數(shù)據(jù)同步的方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及網(wǎng)絡(luò)【技術(shù)領(lǐng)域】,具體涉及一種異步緩存數(shù)據(jù)同步的方法。
【背景技術(shù)】
[0002] 網(wǎng)絡(luò)技術(shù)高速發(fā)展的今天,緩存技術(shù)已經(jīng)成為大型網(wǎng)站和移動(dòng)應(yīng)用的一個(gè)關(guān)鍵技 術(shù)。緩存設(shè)計(jì)好壞直接關(guān)系的一個(gè)網(wǎng)站訪問的速度,W及購(gòu)置服務(wù)器的數(shù)量,甚至影響到用 戶的體驗(yàn)。
[0003] 對(duì)于變化頻率非??斓臄?shù)據(jù)來說,如果還選擇傳統(tǒng)的靜態(tài)緩存方式(MemcachecU File System等)展示數(shù)據(jù),可能在緩存的存取上會(huì)有很大的開銷,并不能很好的滿足需 要。而Redis該樣基于內(nèi)存的NoS化數(shù)據(jù)庫(kù),就非常適合擔(dān)任實(shí)時(shí)數(shù)據(jù)的容器。
[0004] 但是往往我們又有數(shù)據(jù)可靠性的需求。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明解決的技術(shù)問題在于提供一種數(shù)據(jù)緩存同步的方法,有效解決靜態(tài)緩存、 Redis處理存在開銷大、數(shù)據(jù)可靠性難W滿足的問題。
[0006] 本發(fā)明解決上述技術(shù)問題的技術(shù)方案是:
[0007] 將MySQL數(shù)據(jù)首先放入Gearman中,然后通過一個(gè)編寫的PHP Gearman Worker,將 數(shù)據(jù)同步到RediSo
[0008] 所述的方法包括W下步驟:
[0009] 一、安裝 Gearman;
[0010] 安裝完后,檢查Gearman的運(yùn)行狀況;當(dāng)返回gearmand is running,說明Gearman 已經(jīng)安裝成功;
[0011] 二、PHP Gearman 擴(kuò)展;
[0012] 采用編譯方式安裝;
[001引 H、通過 MySQL UDF+Trigger 同步數(shù)據(jù)到 Gearman ;
[0014] 使用 lib_mysqlutf_json 和 gearman-mysql-u壯的組合,讓 MySQL 能將數(shù)據(jù)傳入 Gearman ;
[0015] 先安裝 lib_mysqlutf_json ;
[0016] 然后,查看MySQL的插件安裝路徑;
[0017] 再將lib_mysqlutf_json. SO文件復(fù)制到對(duì)應(yīng)位置:
[0018] 最后登入MyS化運(yùn)行語句注冊(cè)UDF函數(shù)。
[0019] 所述的所述的Gearman的Job Server對(duì)應(yīng)Resque的Redis部分,Client對(duì)應(yīng) Resque 的如eue 操作,Worker 對(duì)應(yīng) Resque 的 Worker 和 Job。
[0020] 所述的PHP Gearman擴(kuò)展中,選擇安裝舊版本擴(kuò)展:
[0021] peel install gearman-1. 0. 3
[0022] Gearman+PHP 實(shí)例
[0023] W進(jìn)行一個(gè)文件處理的為例,
[0024] 首先編寫一個(gè) Gearman Client 并命名為 client, php
[0025] 運(yùn)行相關(guān)文件,模擬用戶請(qǐng)求一個(gè)Web頁(yè)面后,將處理結(jié)束的信息返回用戶,
[002引可W看到輸出為
[0027] writeLog 10 0
[002引說明已經(jīng)在Gearman中建立了一個(gè)名為writeLog的任務(wù),并且有1個(gè)任務(wù)在隊(duì)列 等待中;
[0029] 而上面的4列分別代表當(dāng)前的Gearman的運(yùn)行狀態(tài);任務(wù)名稱、在等待隊(duì)列中的任 務(wù)、正在運(yùn)行的任務(wù)、正在運(yùn)行的Worker進(jìn)程;
[0030] 可W使用watch進(jìn)行實(shí)時(shí)監(jiān)控:
[0031] 然后編寫一個(gè) Gearman Worker 命名為 worker, php :
[0032] Worker使用一個(gè)while死循環(huán)實(shí)現(xiàn)守護(hù)進(jìn)程,運(yùn)行地p worker, php可W看到 Gearman狀態(tài)變?yōu)椋?br>
[0033] writeLog 0 0 1
[0034] 同時(shí)查看同目錄下gearman. log,內(nèi)容應(yīng)為從Client傳入的值Log conte。本 發(fā)明的有益效果是;本發(fā)明采用MyS化作為數(shù)據(jù)存儲(chǔ)引擎,Redis則作為化Che ;采用 Gearman+PHP+MySQL UDF的組合異步實(shí)現(xiàn)MyS化到Redis的數(shù)據(jù)復(fù)制。本發(fā)明實(shí)現(xiàn)成本更 低,更容易操作。
【專利附圖】
【附圖說明】
[00巧]下面結(jié)合附圖對(duì)本發(fā)明進(jìn)一步說明:
[0036] 圖1是本發(fā)明總體框架圖。
【具體實(shí)施方式】
[0037] 在異步緩存數(shù)據(jù)的處理中,需要考慮到性能、穩(wěn)定性和可用性問題。
[0038] 性能一將相應(yīng)數(shù)據(jù)存儲(chǔ)起來W避免數(shù)據(jù)的重復(fù)創(chuàng)建、處理和傳輸,可有效提高 性能。比如將不改變的數(shù)據(jù)緩存起來,例如國(guó)家列表等,該樣能明顯提高web程序的反應(yīng)速 度。
[0039] 穩(wěn)定性一同一個(gè)應(yīng)用中,對(duì)同一數(shù)據(jù)、邏輯功能和用戶界面的多次請(qǐng)求時(shí)經(jīng)常 發(fā)生的。當(dāng)用戶基數(shù)很大時(shí),如果每次請(qǐng)求都進(jìn)行處理,消耗的資源是很大的浪費(fèi),也同時(shí) 造成系統(tǒng)的不穩(wěn)定。例如,web應(yīng)用中,對(duì)一些靜態(tài)頁(yè)面的呈現(xiàn)內(nèi)容進(jìn)行緩存能有效的節(jié)省 資源,提高穩(wěn)定性。而緩存數(shù)據(jù)也能降低對(duì)數(shù)據(jù)庫(kù)的訪問次數(shù),降低數(shù)據(jù)庫(kù)的負(fù)擔(dān)和提高數(shù) 據(jù)庫(kù)的服務(wù)能力。
[0040] 可用性一有時(shí),提供數(shù)據(jù)信息的服務(wù)可能會(huì)意外停止,如果使用了緩存技術(shù),可 W在一定時(shí)間內(nèi)仍正常提供對(duì)最終用戶的支持,提高了系統(tǒng)的可用性。
[0041] 本發(fā)明的關(guān)鍵點(diǎn)是:
[0042] 關(guān)鍵點(diǎn)1,理解狀態(tài)
[0043] 在深入介紹緩存技術(shù)之前,需要對(duì)狀態(tài)有一個(gè)認(rèn)識(shí),因?yàn)榫彺婵蒞說是狀態(tài)管理 的框架。理解狀態(tài)的含義和它的一些特性一比如生存期和生存范圍一對(duì)決定是否緩存 和選擇合適的緩存技術(shù)有很大幫助。狀態(tài)是指一些數(shù)據(jù),在應(yīng)用系統(tǒng)某個(gè)時(shí)間點(diǎn)上,數(shù)據(jù)的 狀態(tài)和條件。該些數(shù)據(jù)可能是永久性的存儲(chǔ)在數(shù)據(jù)庫(kù)中,可能是只在內(nèi)存里停留一會(huì),也可 能是按照某個(gè)邏輯存活(比如多長(zhǎng)時(shí)間后釋放),它的應(yīng)用范圍可能是所有用戶可訪問,可 能是單個(gè)用戶有權(quán)限;
[0044] 關(guān)鍵點(diǎn)2,狀態(tài)的生存期;
[0045] 生存期是指數(shù)據(jù)保持有效性的時(shí)間區(qū)間,也就是從創(chuàng)建到移除的時(shí)間間隔。通常 的生存期有W下幾種:
[0046] ?永久狀態(tài)化rmanent State-應(yīng)用程序使用的永久數(shù)據(jù);
[0047] ?進(jìn)程狀態(tài)Process State-只在進(jìn)程周期內(nèi)有效;
[0048] ?會(huì)話狀態(tài)Session State--和特定的用戶會(huì)話有關(guān);
[0049] ?消息狀態(tài)Message State-處理某個(gè)消息的時(shí)間內(nèi)有效;
[0050] 關(guān)鍵點(diǎn)3,狀態(tài)數(shù)據(jù)的陳舊;
[0051] 緩存的狀態(tài)數(shù)據(jù)只是主數(shù)據(jù)(Master State Data)的快照,由于數(shù)據(jù)源可能被修 改,所W狀態(tài)數(shù)據(jù)就有會(huì)陳舊的特性。合理利用此特性和將數(shù)據(jù)陳舊的負(fù)面影響最小化是 緩存狀態(tài)數(shù)據(jù)的一個(gè)重要任務(wù)。你可WW-下方式定義數(shù)據(jù)的陳舊依據(jù):
[0052] ?主數(shù)據(jù)更改的可能性一隨著時(shí)間的推進(jìn),主數(shù)據(jù)更改的可能是否大大增加? 按照該一點(diǎn)來決定緩存狀態(tài)數(shù)據(jù)的陳舊;
[0053] ?更改的相關(guān)性一主數(shù)據(jù)更新時(shí),緩存的狀態(tài)數(shù)據(jù)不相應(yīng)更新是不是造成影響 系統(tǒng)的使用?比如,更改系統(tǒng)的外觀風(fēng)格并不會(huì)對(duì)業(yè)務(wù)造成很大影響。
[0054] 關(guān)鍵點(diǎn)4,狀態(tài)數(shù)據(jù)陳舊的容忍度;
[00巧]緩存狀態(tài)數(shù)據(jù)的陳舊對(duì)業(yè)務(wù)流程的影響稱為容忍度,應(yīng)用系統(tǒng)的可W為不能容忍 (No Tolerance)和一定程度的容忍(some Tolerance),前者必須和主數(shù)據(jù)同步更新,后者 允許一定時(shí)間或一定范圍的陳舊,判斷標(biāo)準(zhǔn)就是對(duì)業(yè)務(wù)流程的影響度。
[0056] 基于對(duì)本發(fā)明涉及問題的理解,無論MyS化還是Redis,自身都帶有數(shù)據(jù)同步的機(jī) 債J,像比較常用的MyS化的Master/Slave模式,就是由Slave端分析Master的binlog來 實(shí)現(xiàn)的,該樣的數(shù)據(jù)復(fù)制其實(shí)還是一個(gè)異步過程,只不過當(dāng)服務(wù)器都在同一內(nèi)網(wǎng)時(shí),異步的 延遲幾乎可W忽略。
[0057] 那么也可W用同樣方式,分析MySQL的binlog文件并將數(shù)據(jù)插入Redis。但是該 需要對(duì)binlog文件W及MyS化有非常深入的理解,同時(shí)由于binlog存在Statement/Row/ Mixedlevel多種形式,分析binlog實(shí)現(xiàn)同步的工作量是非常大的。
[0058] 因此本發(fā)明選擇一種開發(fā)成本更加低廉的方式,借用已經(jīng)比較成熟的MySQL UDF, 將MySQL數(shù)據(jù)首先放入Gearman中,然后通過一個(gè)自己編寫的PHP Gearman Worker,將數(shù)據(jù) 同步到Redis。比分析binlog的方式增加了不少流程,但是實(shí)現(xiàn)成本更低,更容易操作。
[0059] 見圖1所示,下面結(jié)合具體實(shí)例對(duì)本發(fā)明進(jìn)行說明。
[0060] (一)Gearman的安裝與使用
[0061] Gearman是一個(gè)支持分布式的任務(wù)分發(fā)框架。設(shè)計(jì)簡(jiǎn)潔,得到了非常廣泛的支持。 一個(gè)典型的Gearman應(yīng)用包括W下該些部分:
[0062] Gearman Job Server ;Gearman核也程序,需要編譯安裝并W守護(hù)進(jìn)程形式運(yùn)行在 后臺(tái)
[0063] Gearman Client :可W理解為任務(wù)的收件員,比如我要在后臺(tái)執(zhí)行一個(gè)發(fā)送郵件 的任務(wù),可W在程序中調(diào)用一個(gè)Gearman Client并傳入郵件的信息,然后就可W將執(zhí)行結(jié) 果立即展示給用戶,而任務(wù)本身會(huì)慢慢在后臺(tái)運(yùn)行。Gearman Worker:任務(wù)的真正執(zhí)行者, 一般需要自己編寫具體邏輯并通過守護(hù)進(jìn)程方式運(yùn)行,Gearman Worker接收到Gearman Client傳遞的任務(wù)內(nèi)容后,會(huì)按順序處理。
[0064] Gearman Job Server :對(duì)應(yīng) Resque 的 Redis 部分
[0065] Gearman Client :對(duì)應(yīng) Resque 的 Queue 操作
[0066] Gearman Worker :對(duì)應(yīng) Resque 的 Worker 和 Job
[0067] 這里么所W選擇Gearman而不是Resque是因?yàn)镚earman提供了比較好用的MySQL UDF,工作量更小。
[006引 (二)安裝 Gearman 及 PHP Gearman 擴(kuò)展
[0069] 過pt-get install ge過rm過n ge過rm過n-server Iibge過rm過n-dev
[0070] 檢查Gearman的運(yùn)行狀況:
[0071] /etc/init. d/gearman-job-server status
[0072] 當(dāng)返回gearmand is running,說明Gearman已經(jīng)安裝成功。
[0073] ( S ) PHP 的 Gearman 擴(kuò)展
[0074] peel install gearman
[0075] echo" extension = gearman. so" 〉/etc/php5/conf. d/gearman. ini
[0076] service php5-fpm restart
[0077] 但是實(shí)測(cè)發(fā)現(xiàn)ubun化默認(rèn)安裝的gearman版本過低,直接運(yùn)行peel install gearman會(huì)報(bào)錯(cuò)
[0078] CO打figure :error :libge過rm過打 vetsio打 I. I. Oor I過ter required
[0079] 因此Gearman+PHP擴(kuò)展建議通過編譯方式安裝,這里為了簡(jiǎn)單說明,選擇安裝舊 版本擴(kuò)展:
[0080] peel install gearman-1. 0. 3
[0081] Gearman+PHP 實(shí)例
[0082] 為了更容易理解后文Gearman的運(yùn)行流程,這里不妨從一個(gè)最簡(jiǎn)單的Gearman實(shí) 例來說明,比如我們要進(jìn)行一個(gè)文件處理的操作,首先編寫一個(gè)Gearman Client并命名為 client, php
[0083] < ? php
[0084] Sclient 二 new GearmanClient 0 ;
[0085] $client->addServer 0 ;
[0086] $client-〉doBackground(' writeLog',' Log content');
[0087] echo'文件已經(jīng)在后臺(tái)操作';
[0088] 運(yùn)行這個(gè)文件,相當(dāng)于模擬用戶請(qǐng)求一個(gè)Web頁(yè)面后,將處理結(jié)束的信息返回用 戶:
[0089] php client, php
[0090] 查看一下Gearman的狀況:
[0091] (echo status ;sle邱 0? 1) Inetcat 127. 0?0? 1 4730
[0092] 可W看到輸出為
[0093] writeLog 10 0
[0094] 說明我們已經(jīng)在Gearman中建立了一個(gè)名為writeLog的任務(wù),并且有1個(gè)任務(wù)在 隊(duì)列等待中。
[0095] 而上面的4列分別代表當(dāng)前的Gearman的運(yùn)行狀態(tài):
[009引任務(wù)名稱
[0097] 在等待隊(duì)列中的任務(wù)
[0098] 正在運(yùn)行的任務(wù)
[0099] 正在運(yùn)行的Worker進(jìn)程
[0100] 可W使用watch進(jìn)行實(shí)時(shí)監(jiān)控:
[0101] watch-n 1" (echo status ;sle巧 0. 1) Inc 127. 0. 0. 1 4730"
[0102] 然后我們需要編寫一個(gè)Gearman Worker命名為worker, php :
[0103]
【權(quán)利要求】
1. 異步緩存數(shù)據(jù)同步的方法,其特征在于:將MySQL數(shù)據(jù)首先放入Gearman中,然后通 過一個(gè)編寫的PHP Gearman Worker,將數(shù)據(jù)同步到Redis。
2. 根據(jù)權(quán)利要求1所述的異步緩存數(shù)據(jù)同步的方法,其特征在于:所述的方法包括以 下步驟: ―、安裝 Gearman ; 安裝完后,檢查Gearman的運(yùn)行狀況;當(dāng)返回gearmand is running,說明Gearman已 經(jīng)安裝成功; 二、 PHP Gearman 擴(kuò)展; 采用編譯方式安裝; 三、 通過 MySQL UDF+Trigger 同步數(shù)據(jù)到 Gearman ; 使用 lib_mysqludf_json 和 gearman-mysql-udf 的組合,讓 MySQL 能將數(shù)據(jù)傳入 Gearman ; 先安裝 lib-mysqludf-json ; 然后,查看MySQL的插件安裝路徑; 再將lib_mysqludf_json. so文件復(fù)制到對(duì)應(yīng)位置: 最后登入MySQL運(yùn)行語句注冊(cè)UDF函數(shù)。
3. 根據(jù)權(quán)利要求1所述的異步緩存數(shù)據(jù)同步的方法,其特征在于:所述的所述的 Gearman 的 Job Server 對(duì)應(yīng) Resque 的 Redis 部分,Client 對(duì)應(yīng) Resque 的 Queue 操作, Worker 對(duì)應(yīng) Resque 的 Worker 和 Job。
4. 根據(jù)權(quán)利要求2所述的異步緩存數(shù)據(jù)同步的方法,其特征在于:所述的所述的 Gearman 的 Job Server 對(duì)應(yīng) Resque 的 Redis 部分,Client 對(duì)應(yīng) Resque 的 Queue 操作, Worker 對(duì)應(yīng) Resque 的 Worker 和 Job。
5. 根據(jù)權(quán)利要求2或4所述的異步緩存數(shù)據(jù)同步的方法,其特征在于:所述的PHP Gearman擴(kuò)展中,選擇安裝舊版本擴(kuò)展: peel install gearman-1. 0. 3 Gearman+PHP 實(shí)例 以進(jìn)行一個(gè)文件處理的為例, 首先編寫一個(gè)Gearman Client并命名為client, php 運(yùn)行相關(guān)文件,模擬用戶請(qǐng)求一個(gè)Web頁(yè)面后,將處理結(jié)束的信息返回用戶, 可以看到輸出為 writeLog 100 說明已經(jīng)在Gearman中建立了一個(gè)名為writeLog的任務(wù),并且有1個(gè)任務(wù)在隊(duì)列等待 中; 而上面的4列分別代表當(dāng)前的Gearman的運(yùn)行狀態(tài):任務(wù)名稱、在等待隊(duì)列中的任務(wù)、 正在運(yùn)行的任務(wù)、正在運(yùn)行的Worker進(jìn)程; 可以使用watch進(jìn)行實(shí)時(shí)監(jiān)控: 然后編寫一個(gè) Gearman Worker 命名為 worker, php : Worker使用一個(gè)while死循環(huán)實(shí)現(xiàn)守護(hù)進(jìn)程,運(yùn)行php worker, php可以看到Gearman 狀態(tài)變?yōu)椋? writeLog 001 同時(shí)查看同目錄下gearman. log,內(nèi)容應(yīng)為從C/ient傳入的值Log conte。
【文檔編號(hào)】H04L29/08GK104363303SQ201410720048
【公開日】2015年2月18日 申請(qǐng)日期:2014年11月28日 優(yōu)先權(quán)日:2014年11月28日
【發(fā)明者】賀忠堂, 王迪, 李智勇, 溫志強(qiáng), 李新安 申請(qǐng)人:東莞中國(guó)科學(xué)院云計(jì)算產(chǎn)業(yè)技術(shù)創(chuàng)新與育成中心