成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

NoSQL架構(gòu)實(shí)踐(一)以NoSQL為輔

數(shù)據(jù)庫 其他數(shù)據(jù)庫 數(shù)據(jù)庫運(yùn)維
很多朋友看到NoSQL時(shí)總會有困惑,覺得很好,但是卻不知道如何正式用到自己的項(xiàng)目中。下文中筆者帶我們看下怎么樣在我們的系統(tǒng)中使用NoSQL。

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

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

(一)NoSQL作為鏡像

    不改變原有的以MySQL作為存儲的架構(gòu),使用NoSQL作為輔助鏡像存儲,用NoSQL的優(yōu)勢輔助提升性能。

 

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

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

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

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

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

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

 

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

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

MySQL到NoSQL同步的實(shí)現(xiàn)可以使用MySQL UDF函數(shù),MySQL binlog的解析來實(shí)現(xiàn)。可以利用現(xiàn)有的開源項(xiàng)目來實(shí)現(xiàn),比如:


◆MySQL memcached UDFs:從通過UDF操作Memcached協(xié)議。
◆國內(nèi)張宴開源的mysql-udf-http:通過UDF操作http協(xié)議。

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

(二)MySQL和NoSQL組合

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

 

圖 3 -MySQL和NoSQL組合

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

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

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


◆節(jié)省MySQL的IO開銷。由于MySQL只存儲需要查詢的小字段,不再負(fù)責(zé)存儲大文本字段,這樣就可以節(jié)省MySQL存儲的空間開銷,從而節(jié)省MySQL的磁盤IO。我們曾經(jīng)通過這種優(yōu)化,把MySQL一個(gè)40G的表縮減到幾百M(fèi)。
◆提高M(jìn)ySQl Query Cache緩存命中率。我們知道query cache緩存失效是表級的,在MySQL表一旦被更新就會失效,經(jīng)過這種字段的分離,更新的字段如果不是存儲在MySQL中,那么對query cache就沒有任何影響。而NoSQL的Cache往往都是行級別的,只對更新的記錄的緩存失效。
◆提升MySQL主從同步效率。由于MySQL存儲空間的減小,同步的數(shù)據(jù)記錄也減小了,而部分?jǐn)?shù)據(jù)的更新落在NoSQL而不是MySQL,這樣也減少了MySQL數(shù)據(jù)需要同步的次數(shù)。
◆提高M(jìn)ySQL數(shù)據(jù)備份和恢復(fù)的速度。由于MySQL數(shù)據(jù)庫存儲的數(shù)據(jù)的減小,很容易看到數(shù)據(jù)備份和恢復(fù)的速度也將極大的提高。
◆比以前更容易擴(kuò)展。NoSQL天生就容易擴(kuò)展。經(jīng)過這種優(yōu)化,MySQL性能也得到提高。

總結(jié)

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

 

【編輯推薦】

  1. NoSQL理論研究:內(nèi)存是新的硬盤,硬盤是新的磁帶
  2. 關(guān)于NoSQL數(shù)據(jù)庫你應(yīng)該知道的10件事
  3. NoSQL就業(yè)形勢分析:Cassandra和MongoDB***
  4. 用NoSQL來替代MySQL在Digg中的原因
  5. 詳解NoSQL數(shù)據(jù)庫使用實(shí)例

 

責(zé)任編輯:艾婧 來源: InfoQ中文站
相關(guān)推薦

2011-03-14 15:56:37

NoSQL

2011-03-31 14:02:59

NoSQL緩存架構(gòu)

2022-08-21 21:28:32

數(shù)據(jù)庫實(shí)踐

2011-05-13 09:46:20

MySQLNoSQL

2011-08-18 14:09:35

NoSQL

2012-02-16 09:20:19

NoSQL

2015-02-04 13:07:39

DTCC

2012-05-15 10:28:29

NoSQL數(shù)據(jù)庫建模技術(shù)

2021-02-03 11:44:15

NoSQL關(guān)系數(shù)據(jù)庫

2016-12-04 16:36:18

NoSQL數(shù)據(jù)庫大數(shù)據(jù)

2012-02-01 16:26:04

NoSQLMoreSQL數(shù)據(jù)庫

2011-10-20 13:37:46

OracleNoSQL數(shù)據(jù)庫

2011-02-22 08:49:38

NoSQL

2023-07-06 00:41:03

SQLNoSQL數(shù)據(jù)庫

2015-04-16 15:42:21

關(guān)系型數(shù)據(jù)庫NoSQL

2011-03-24 17:09:08

TrinityNoSQL

2024-02-02 10:51:53

2014-08-01 09:12:52

NoSQL

2011-05-16 09:27:10

MySQLNoSQL

2012-05-15 11:03:22

NoSQL數(shù)據(jù)建模
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 日韩成人精品一区二区三区 | 国产精品综合一区二区 | 久久久久国 | 精品人伦一区二区三区蜜桃网站 | 亚洲欧美一区二区三区国产精品 | 美美女高清毛片视频免费观看 | 亚洲天堂中文字幕 | 成人在线免费电影 | 七七婷婷婷婷精品国产 | 日韩成人免费视频 | 国产精品一区二区视频 | 久久久久国产精品午夜一区 | 中文字幕在线视频精品 | 亚洲欧美中文日韩在线v日本 | 国产在线视频一区二区 | 一区在线视频 | 欧美日韩亚洲视频 | 一级一片在线观看 | 国产精品小视频在线观看 | 国产乱码精品一区二区三区忘忧草 | 一区视频在线免费观看 | 国产精品自拍视频网站 | 91美女在线观看 | 亚洲精品久久久久久一区二区 | 国产韩国精品一区二区三区 | 国产精品美女www爽爽爽视频 | 中国免费黄色片 | 福利视频1000 | 精品国产欧美一区二区三区成人 | 一区二区三区av | 欧美激情综合色综合啪啪五月 | 久久91精品国产一区二区 | 伊人久久综合影院 | 久久久久国产精品www | 日韩精品免费在线观看 | 香蕉视频黄色 | 久久久久国产 | 中文字幕日韩一区 | 欧美在线色视频 | 一级看片免费视频囗交动图 | 黄色91在线 |