自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談如何將NoSQL引入現(xiàn)有架構(gòu)系統(tǒng)

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
對(duì)于NoSQL大家不算陌生,但是如何在我們現(xiàn)有的系統(tǒng)架構(gòu)中該如何引入NoSQL是大家常見(jiàn)的問(wèn)題。本文將明確引入的NoSQL數(shù)據(jù)庫(kù)帶給系統(tǒng)的作用,它能解決什么問(wèn)題,以及可能帶來(lái)的新的問(wèn)題。

經(jīng)常有朋友遇到困惑,看到NoSQL的介紹,覺(jué)得很好,但是卻不知道如何正式用到自己的項(xiàng)目中。很大的原因就是思維固定在MySQL中了,他們問(wèn)得最多的問(wèn)題就是用了NoSQL,我如何做關(guān)系查詢。那么接下來(lái),我們看下怎么樣在我們的系統(tǒng)中使用NoSQL。

怎么樣把NoSQL引入到我們的系統(tǒng)架構(gòu)設(shè)計(jì)中,需要根據(jù)我們系統(tǒng)的業(yè)務(wù)場(chǎng)景來(lái)分析,什么樣類(lèi)型的數(shù)據(jù)適合存儲(chǔ)在NoSQL數(shù)據(jù)庫(kù)中,什么樣類(lèi)型的數(shù)據(jù)必須使用關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)。明確引入的NoSQL數(shù)據(jù)庫(kù)帶給系統(tǒng)的作用,它能解決什么問(wèn)題,以及可能帶來(lái)的新的問(wèn)題。下面我們分析幾種常見(jiàn)的NoSQL架構(gòu)。

(一)NoSQL作為鏡像

不改變?cè)械囊訫ySQL作為存儲(chǔ)的架構(gòu),使用NoSQL作為輔助鏡像存儲(chǔ),用NoSQL的優(yōu)勢(shì)輔助提升性能。

圖 1 -NoSQL為鏡像(代碼完成模式 )

  1. //寫(xiě)入數(shù)據(jù)的示例偽代碼 //data為我們要存儲(chǔ)的數(shù)據(jù)對(duì)象 data.title=”title”;   
  2. data.name=”name”;  
  3.  data.time=”2009-12-01 10:10:01”;   
  4. data.from=”1”;   
  5. id=DB.Insert(data);//寫(xiě)入MySQL數(shù)據(jù)庫(kù)   
  6. NoSQL.Add(id,data);//以寫(xiě)入MySQL產(chǎn)生的自增id為主鍵寫(xiě)入NoSQL數(shù)據(jù)庫(kù) 

如果有數(shù)據(jù)一致性要求,可以像如下的方式使用

  1. //寫(xiě)入數(shù)據(jù)的示例偽代碼 //data為我們要存儲(chǔ)的數(shù)據(jù)對(duì)象 
  2. bool status=false;   
  3. DB.startTransaction();//開(kāi)始事務(wù)   
  4. id=DB.Insert(data);//寫(xiě)入MySQL數(shù)據(jù)庫(kù)   
  5. if(id>0){       
  6. status=NoSQL.Add(id,data);//以寫(xiě)入MySQL產(chǎn)生的自增id為主鍵寫(xiě)入NoSQL數(shù)據(jù)庫(kù) }   
  7. if(id>0 && status==true){       
  8. DB.commit();//提交事務(wù) }else{       
  9. DB.rollback();//不成功,進(jìn)行回滾 } 

上面的代碼看起來(lái)可能覺(jué)得有點(diǎn)麻煩,但是只需要在DB類(lèi)或者ORM層做一個(gè)統(tǒng)一的封裝,就能實(shí)現(xiàn)重用了,其他代碼都不用做任何的修改。

這種架構(gòu)在原有基于MySQL數(shù)據(jù)庫(kù)的架構(gòu)上增加了一層輔助的NoSQL存儲(chǔ),代碼量不大,技術(shù)難度小,卻在可擴(kuò)展性和性能上起到了非常大的作用。只需要程序在寫(xiě)入MySQL數(shù)據(jù)庫(kù)后,同時(shí)寫(xiě)入到NoSQL數(shù)據(jù)庫(kù),讓MySQL和NoSQL擁有相同的鏡像數(shù)據(jù),在某些可以根據(jù)主鍵查詢的地方,使用高效的NoSQL數(shù)據(jù)庫(kù)查詢,這樣就節(jié)省了MySQL的查詢,用NoSQL的高性能來(lái)抵擋這些查詢。

圖 2 -NoSQL為鏡像(同步模式)

這種不通過(guò)程序代碼,而是通過(guò)MySQL把數(shù)據(jù)同步到NoSQL中,這種模式是上面一種的變體,是一種對(duì)寫(xiě)入透明但是具有更高技術(shù)難度一種模式。這種模式適用于現(xiàn)有的比較復(fù)雜的老系統(tǒng),通過(guò)修改代碼不易實(shí)現(xiàn),可能引起新的問(wèn)題。同時(shí)也適用于需要把數(shù)據(jù)同步到多種類(lèi)型的存儲(chǔ)中。

MySQL到NoSQL同步的實(shí)現(xiàn)可以使用MySQL UDF函數(shù),MySQL binlog的解析來(lái)實(shí)現(xiàn)??梢岳矛F(xiàn)有的開(kāi)源項(xiàng)目來(lái)實(shí)現(xiàn),比如:

MySQL memcached UDFs:從通過(guò)UDF操作Memcached協(xié)議。

國(guó)內(nèi)張宴開(kāi)源的mysql-udf-http:通過(guò)UDF操作http協(xié)議。

有了這兩個(gè)MySQL UDF函數(shù)庫(kù),我們就能通過(guò)MySQL透明的處理Memcached或者Http協(xié)議,這樣只要有兼容Memcached或者Http協(xié)議的NoSQL數(shù)據(jù)庫(kù),那么我們就能通過(guò)MySQL去操作以進(jìn)行同步數(shù)據(jù)。再結(jié)合lib_mysqludf_json,通過(guò)UDF和MySQL觸發(fā)器功能的結(jié)合,就可以實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)同步。

(二)MySQL和NoSQL組合

MySQL中只存儲(chǔ)需要查詢的小字段,NoSQL存儲(chǔ)所有數(shù)據(jù)。

圖 3 -MySQL和NoSQL組合

  1. //寫(xiě)入數(shù)據(jù)的示例偽代碼   
  2. //data為我們要存儲(chǔ)的數(shù)據(jù)對(duì)象   
  3. data.title=”title”; data.name=”name”;   
  4. data.time=”2009-12-01 10:10:01”;  
  5. data.from=”1”;  
  6. bool status=false; DB.startTransaction();//開(kāi)始事務(wù)   
  7. id=DB.Insert(“INSERT INTO table (from
  8. VALUES(data.from)”);//寫(xiě)入MySQL數(shù)據(jù)庫(kù),只寫(xiě)from需要where查詢的字段 
  9. if(id>0){       
  10. status=NoSQL.Add(id,data);//以寫(xiě)入MySQL產(chǎn)生的自增id為主鍵寫(xiě)入NoSQL數(shù)據(jù)庫(kù) }   
  11. if(id>0 && status==true){       
  12. DB.commit();//提交事務(wù) }else{       
  13. DB.rollback();//不成功,進(jìn)行回滾 } 

把需要查詢的字段,一般都是數(shù)字,時(shí)間等類(lèi)型的小字段存儲(chǔ)于MySQL中,根據(jù)查詢建立相應(yīng)的索引,其他不需要的字段,包括大文本字段都存儲(chǔ)在NoSQL中。在查詢的時(shí)候,我們先從MySQL中查詢出數(shù)據(jù)的主鍵,然后從NoSQL中直接取出對(duì)應(yīng)的數(shù)據(jù)即可。

這種架構(gòu)模式把MySQL和NoSQL的作用進(jìn)行了融合,各司其職,讓MySQL專(zhuān)門(mén)負(fù)責(zé)處理擅長(zhǎng)的關(guān)系存儲(chǔ),NoSQL作為數(shù)據(jù)的存儲(chǔ)。它有以下優(yōu)點(diǎn):

節(jié)省MySQL的IO開(kāi)銷(xiāo)。由于MySQL只存儲(chǔ)需要查詢的小字段,不再負(fù)責(zé)存儲(chǔ)大文本字段,這樣就可以節(jié)省MySQL存儲(chǔ)的空間開(kāi)銷(xiāo),從而節(jié)省MySQL的磁盤(pán)IO。我們?cè)?jīng)通過(guò)這種優(yōu)化,把MySQL一個(gè)40G的表縮減到幾百M(fèi)。

提高M(jìn)ySQl Query Cache緩存命中率。我們知道query cache緩存失效是表級(jí)的,在MySQL表一旦被更新就會(huì)失效,經(jīng)過(guò)這種字段的分離,更新的字段如果不是存儲(chǔ)在MySQL中,那么對(duì)query cache就沒(méi)有任何影響。而NoSQL的Cache往往都是行級(jí)別的,只對(duì)更新的記錄的緩存失效。

提升MySQL主從同步效率。由于MySQL存儲(chǔ)空間的減小,同步的數(shù)據(jù)記錄也減小了,而部分?jǐn)?shù)據(jù)的更新落在NoSQL而不是MySQL,這樣也減少了MySQL數(shù)據(jù)需要同步的次數(shù)。

提高M(jìn)ySQL數(shù)據(jù)備份和恢復(fù)的速度。由于MySQL數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)的減小,很容易看到數(shù)據(jù)備份和恢復(fù)的速度也將極大的提高。

比以前更容易擴(kuò)展。NoSQL天生就容易擴(kuò)展。經(jīng)過(guò)這種優(yōu)化,MySQL性能也得到提高。

比如手機(jī)鳳凰網(wǎng)就是這種架構(gòu) http://www.cnblogs.com/sunli/archive/2010/12/20/imcp.html

總結(jié)

以NoSQL為輔的架構(gòu)還是以MySQL架構(gòu)的思想為中心,只是在以前的架構(gòu)上輔助增加了NoSQL來(lái)提高其性能和可擴(kuò)展性。這種架構(gòu)實(shí)現(xiàn)起來(lái)比較容易,卻能取得不錯(cuò)的效果。如果正想在項(xiàng)目中引入NoSQL,或者你的以MySQL架構(gòu)的系統(tǒng)目前正出現(xiàn)相關(guān)的瓶頸,希望本文可以為你帶來(lái)幫助。

關(guān)于作者

孫立,目前在鳳凰網(wǎng)負(fù)責(zé)底層組的研發(fā)工作。曾就職于搜狐和ku6。多年互聯(lián)網(wǎng)從業(yè)經(jīng)驗(yàn)和程序開(kāi)發(fā),對(duì)分布式搜索引擎的開(kāi)發(fā),高并發(fā),大數(shù)據(jù)量網(wǎng)站系統(tǒng)架構(gòu)優(yōu)化,高可用性,可伸縮性,分布式系統(tǒng)緩存,數(shù)據(jù)庫(kù)分表分庫(kù)(sharding)等有豐富的經(jīng)驗(yàn),并且對(duì)運(yùn)維監(jiān)控和自動(dòng)化運(yùn)維控制有經(jīng)驗(yàn)。開(kāi)源項(xiàng)目phplock,phpbuffer的作者。近期開(kāi)發(fā)了一個(gè)NOSQL數(shù)據(jù)庫(kù)存儲(chǔ)INetDB,是NoSQL數(shù)據(jù)庫(kù)愛(ài)好者。他的新浪微博是:http://t.sina.com.cn/sunli1223

原文鏈接:http://www.cnblogs.com/sunli/archive/2011/02/21/NoSQL_architecture_1.html

【編輯推薦】

  1. NoSQL數(shù)據(jù)庫(kù)Apache CouchDB 0.11.0發(fā)布
  2. 關(guān)于NoSQL數(shù)據(jù)庫(kù)你應(yīng)該知道的10件事
  3. 細(xì)數(shù)那些運(yùn)行在微軟平臺(tái)上的NoSQL數(shù)據(jù)庫(kù)
  4. 用NoSQL來(lái)替代MySQL在Digg中的原因
  5. 詳解NoSQL數(shù)據(jù)庫(kù)使用實(shí)例
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2022-05-05 11:39:07

智能技術(shù)智能建筑

2011-05-18 14:51:43

2021-01-28 09:00:00

SQL數(shù)據(jù)庫(kù)NoSQL

2009-04-14 09:24:40

OracleXML導(dǎo)出

2009-06-29 17:07:54

EJB部署Jboss

2009-06-15 16:32:00

NetBeans字體設(shè)置

2015-06-23 22:32:59

2022-11-21 07:54:32

安全護(hù)欄應(yīng)用安全程序

2011-04-20 16:30:06

UbuntuLiveCD

2018-02-02 06:03:04

移動(dòng)運(yùn)營(yíng)商MEC網(wǎng)絡(luò)邊緣

2017-07-03 11:00:51

深度學(xué)習(xí)人工智能

2021-05-12 08:00:00

深度學(xué)習(xí)人工智能設(shè)備

2024-11-05 09:41:27

2022-11-25 16:27:07

應(yīng)用開(kāi)發(fā)鴻蒙

2016-08-31 14:16:55

LinuxLVM卷轉(zhuǎn)移

2021-11-24 15:20:04

FreeDOSLinux

2011-09-08 11:22:59

Ubuntu中文系統(tǒng)英文系統(tǒng)

2009-08-26 18:05:25

ViewState持久

2022-05-19 10:45:36

軟件開(kāi)發(fā)技術(shù)

2011-08-31 18:08:26

win7Win7PE
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)