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

淺談如何將NoSQL引入現有架構系統

數據庫 其他數據庫
對于NoSQL大家不算陌生,但是如何在我們現有的系統架構中該如何引入NoSQL是大家常見的問題。本文將明確引入的NoSQL數據庫帶給系統的作用,它能解決什么問題,以及可能帶來的新的問題。

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

怎么樣把NoSQL引入到我們的系統架構設計中,需要根據我們系統的業務場景來分析,什么樣類型的數據適合存儲在NoSQL數據庫中,什么樣類型的數據必須使用關系數據庫存儲。明確引入的NoSQL數據庫帶給系統的作用,它能解決什么問題,以及可能帶來的新的問題。下面我們分析幾種常見的NoSQL架構。

(一)NoSQL作為鏡像

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

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

  1. //寫入數據的示例偽代碼 //data為我們要存儲的數據對象 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);//寫入MySQL數據庫   
  6. NoSQL.Add(id,data);//以寫入MySQL產生的自增id為主鍵寫入NoSQL數據庫 

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

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

上面的代碼看起來可能覺得有點麻煩,但是只需要在DB類或者ORM層做一個統一的封裝,就能實現重用了,其他代碼都不用做任何的修改。

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

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

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

MySQL到NoSQL同步的實現可以使用MySQL UDF函數,MySQL binlog的解析來實現。可以利用現有的開源項目來實現,比如:

MySQL memcached UDFs:從通過UDF操作Memcached協議。

國內張宴開源的mysql-udf-http:通過UDF操作http協議。

有了這兩個MySQL UDF函數庫,我們就能通過MySQL透明的處理Memcached或者Http協議,這樣只要有兼容Memcached或者Http協議的NoSQL數據庫,那么我們就能通過MySQL去操作以進行同步數據。再結合lib_mysqludf_json,通過UDF和MySQL觸發器功能的結合,就可以實現數據的自動同步。

(二)MySQL和NoSQL組合

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

圖 3 -MySQL和NoSQL組合

  1. //寫入數據的示例偽代碼   
  2. //data為我們要存儲的數據對象   
  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();//開始事務   
  7. id=DB.Insert(“INSERT INTO table (from
  8. VALUES(data.from)”);//寫入MySQL數據庫,只寫from需要where查詢的字段 
  9. if(id>0){       
  10. status=NoSQL.Add(id,data);//以寫入MySQL產生的自增id為主鍵寫入NoSQL數據庫 }   
  11. if(id>0 && status==true){       
  12. DB.commit();//提交事務 }else{       
  13. DB.rollback();//不成功,進行回滾 } 

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

這種架構模式把MySQL和NoSQL的作用進行了融合,各司其職,讓MySQL專門負責處理擅長的關系存儲,NoSQL作為數據的存儲。它有以下優點:

節省MySQL的IO開銷。由于MySQL只存儲需要查詢的小字段,不再負責存儲大文本字段,這樣就可以節省MySQL存儲的空間開銷,從而節省MySQL的磁盤IO。我們曾經通過這種優化,把MySQL一個40G的表縮減到幾百M。

提高MySQl Query Cache緩存命中率。我們知道query cache緩存失效是表級的,在MySQL表一旦被更新就會失效,經過這種字段的分離,更新的字段如果不是存儲在MySQL中,那么對query cache就沒有任何影響。而NoSQL的Cache往往都是行級別的,只對更新的記錄的緩存失效。

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

提高MySQL數據備份和恢復的速度。由于MySQL數據庫存儲的數據的減小,很容易看到數據備份和恢復的速度也將極大的提高。

比以前更容易擴展。NoSQL天生就容易擴展。經過這種優化,MySQL性能也得到提高。

比如手機鳳凰網就是這種架構 http://www.cnblogs.com/sunli/archive/2010/12/20/imcp.html

總結

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

關于作者

孫立,目前在鳳凰網負責底層組的研發工作。曾就職于搜狐和ku6。多年互聯網從業經驗和程序開發,對分布式搜索引擎的開發,高并發,大數據量網站系統架構優化,高可用性,可伸縮性,分布式系統緩存,數據庫分表分庫(sharding)等有豐富的經驗,并且對運維監控和自動化運維控制有經驗。開源項目phplock,phpbuffer的作者。近期開發了一個NOSQL數據庫存儲INetDB,是NoSQL數據庫愛好者。他的新浪微博是:http://t.sina.com.cn/sunli1223

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

【編輯推薦】

  1. NoSQL數據庫Apache CouchDB 0.11.0發布
  2. 關于NoSQL數據庫你應該知道的10件事
  3. 細數那些運行在微軟平臺上的NoSQL數據庫
  4. 用NoSQL來替代MySQL在Digg中的原因
  5. 詳解NoSQL數據庫使用實例
責任編輯:彭凡 來源: 博客園
相關推薦

2022-05-05 11:39:07

智能技術智能建筑

2011-05-18 14:51:43

2021-01-28 09:00:00

SQL數據庫NoSQL

2009-04-14 09:24:40

OracleXML導出

2009-06-29 17:07:54

EJB部署Jboss

2009-06-15 16:32:00

NetBeans字體設置

2015-06-23 22:32:59

2022-11-21 07:54:32

安全護欄應用安全程序

2011-04-20 16:30:06

UbuntuLiveCD

2017-07-03 11:00:51

深度學習人工智能

2018-02-02 06:03:04

移動運營商MEC網絡邊緣

2021-05-12 08:00:00

深度學習人工智能設備

2024-11-05 09:41:27

2016-08-31 14:16:55

LinuxLVM卷轉移

2022-11-25 16:27:07

應用開發鴻蒙

2021-11-24 15:20:04

FreeDOSLinux

2011-09-08 11:22:59

Ubuntu中文系統英文系統

2009-08-26 18:05:25

ViewState持久

2022-05-19 10:45:36

軟件開發技術

2011-08-31 18:08:26

win7Win7PE
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一区二区三区在线观看 | 在线播放国产一区二区三区 | 91偷拍精品一区二区三区 | 91成人免费观看 | 国产精品久久久久久久免费大片 | 欧美精品久久久久久久久久 | 不卡一二三区 | 欧美亚洲国产成人 | 成人视屏在线观看 | 国产情侣在线看 | 色精品| 欧美二区三区 | 一区二区三区亚洲 | 国产精品国产三级国产aⅴ中文 | 国产高清精品一区二区三区 | 亚洲视频免费在线观看 | 另类视频在线 | 激情国产| 精品久久久久久红码专区 | 精品一区二区三区不卡 | 自拍视频精品 | 国产精品视屏 | 99精品国产一区二区青青牛奶 | 天天干在线播放 | 在线观看中文字幕 | 国产成人午夜高潮毛片 | 欧美精品乱码久久久久久按摩 | 成人久久久 | 色欧美综合 | 亚洲网在线 | 国产一区二区三区免费观看在线 | 精品国产精品国产偷麻豆 | 亚洲欧美中文日韩在线v日本 | 99热热热热| 99re免费| 天天草草草| 一级做a| 成人av在线播放 | www97影院| 久久午夜视频 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 |