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

NoSQL架構(gòu)實(shí)踐(二)以NoSQL為主

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù)運(yùn)維
前面一篇《NoSQL架構(gòu)實(shí)踐(一)以NoSQL為輔》主要介紹了以NoSQL為輔助的架構(gòu),這種架構(gòu)實(shí)施起來(lái)比較簡(jiǎn)單,易于理解,由于其中也使用了傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù),讓開發(fā)者更容易控制NoSQL帶來(lái)的風(fēng)險(xiǎn)。接下來(lái)我們繼續(xù)深入下去,換另外一個(gè)角度,“以NoSQL為主”來(lái)架構(gòu)系統(tǒng)。

前面一篇《NoSQL架構(gòu)實(shí)踐(一)以NoSQL為輔》主要介紹了以NoSQL為輔助的架構(gòu),這種架構(gòu)實(shí)施起來(lái)比較簡(jiǎn)單,易于理解,由于其中也使用了傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù),讓開發(fā)者更容易控制NoSQL帶來(lái)的風(fēng)險(xiǎn)。接下來(lái)我們繼續(xù)深入下去,換另外一個(gè)角度,“以NoSQL為主”來(lái)架構(gòu)系統(tǒng)。

(三)純NoSQL架構(gòu)

只使用NoSQL作為數(shù)據(jù)存儲(chǔ)。

 

圖 4-純NoSQL架構(gòu)

在一些數(shù)據(jù)結(jié)構(gòu)、查詢關(guān)系非常簡(jiǎn)單的系統(tǒng)中,我們可以只使用NoSQL即可以解決存儲(chǔ)問(wèn)題。這樣不但可以提高性能,還非常易于擴(kuò)展。手機(jī)鳳凰網(wǎng)的前端展示系統(tǒng)就使用了這種方案。

在一些數(shù)據(jù)庫(kù)結(jié)構(gòu)經(jīng)常變化,數(shù)據(jù)結(jié)構(gòu)不定的系統(tǒng)中,就非常適合使用NoSQL來(lái)存儲(chǔ)。比如監(jiān)控系統(tǒng)中的監(jiān)控信息的存儲(chǔ),可能每種類型的監(jiān)控信息都不太一樣。這樣可以避免經(jīng)常對(duì)MySQL進(jìn)行表結(jié)構(gòu)調(diào)整,增加字段帶來(lái)的性能問(wèn)題。

這種架構(gòu)的缺點(diǎn)就是數(shù)據(jù)直接存儲(chǔ)在NoSQL中,不能做關(guān)系數(shù)據(jù)庫(kù)的復(fù)雜查詢,如果由于需求變更,需要進(jìn)行某些查詢,可能無(wú)法滿足,所以采用這種架構(gòu)的時(shí)候需要確認(rèn)未來(lái)是否會(huì)進(jìn)行復(fù)雜關(guān)系查詢以及如何應(yīng)對(duì)。

非常幸運(yùn)的是,有些NoSQL數(shù)據(jù)庫(kù)已經(jīng)具有部分關(guān)系數(shù)據(jù)庫(kù)的關(guān)系查詢特性,他們的功能介于key-value和關(guān)系數(shù)據(jù)庫(kù)之間,卻具有key-value數(shù)據(jù)庫(kù)的性能,基本能滿足絕大部分web 2.0網(wǎng)站的查詢需求。比如:

MongoDB就帶有關(guān)系查詢的功能,能解決常用的關(guān)系查詢,所以也是一種非常不錯(cuò)的選擇。下面是一些MongoDB的資料:

◆《視覺(jué)中國(guó)的NoSQL之路:從MySQL到MongoDB》
◆《Choosing a non-relational database; why we migrated from MySQL to MongoDB》
◆最近的一次Mongo Beijing 開發(fā)者聚會(huì)也有一部分資料。

 雖然Foursquare使用MongoDB的宕機(jī)事件的出現(xiàn)使人對(duì)MongoDB的自動(dòng)Shard提出了質(zhì)疑,但是毫無(wú)疑問(wèn),MongoDB在NoSQL中,是一個(gè)優(yōu)秀的數(shù)據(jù)庫(kù),其單機(jī)性能和功能確實(shí)是非常吸引人的。由于上面的例子有詳細(xì)的介紹,本文就不做MongoDB的使用介紹。

Tokyo Tyrant數(shù)據(jù)庫(kù)帶有一個(gè)名為table的存儲(chǔ)類型,可以對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行關(guān)系查詢和檢索。一個(gè)table庫(kù)類似于MySQL中的一個(gè)表。下面我們看一個(gè)小演示:

我們要存儲(chǔ)一批用戶信息,用戶信息包含用戶名(name),年齡(age),email,最后訪問(wèn)時(shí)間(lastvisit),地區(qū)(area)。下面為寫入的演示代碼:

  1.  
  2. $tt = new TokyoTyrantTable ( "127.0.0.1", 1978 );  
  3.  
  4. $tt->vanish ();//清空  
  5.  
  6. $id = $tt->genUid ();//獲取一個(gè)自增id  
  7.  
  8. //put方法提供數(shù)據(jù)寫入。 put ( string $key , array $columns );  
  9.  
  10. $tt->put ( $id, array ("id" => $id, "name" => "zhangsan""age" => 27, "email" => "zhangsan@gmail.com""lastvisit" =>strtotime ( "2011-3-5 12:30:00" ), "area" => "北京" ) );  
  11.  
  12. $id = $tt->genUid ();  
  13.  
  14. $tt->put ( $id, array ("id" => $id, "name" => "lisi""age" => 25, "email" => "lisi@126.com""lastvisit" => strtotime( "2011-3-3 14:40:44" ), "area" => "北京" ) );  
  15.  
  16. $id = $tt->genUid ();  
  17.  
  18. $tt->put ( $id, array ("id" => $id, "name" => "laowang""age" => 37, "email" => "laowang@yahoo.com""lastvisit" =>strtotime ( "2011-3-5 08:30:12" ), "area" => "成都" ) );  
  19.  
  20. $id = $tt->genUid ();  
  21.  
  22. $tt->put ( $id, array ("id" => $id, "name" => "tom""age" => 21, "email" => "tom@hotmail.com""lastvisit" =>strtotime ( "2010-12-10 13:12:13" ), "area" => "天津" ) );  
  23.  
  24. $id = $tt->genUid ();  
  25.  
  26. $tt->put ( $id, array ("id" => $id, "name" => "jack""age" => 21, "email" => "jack@gmail.com""lastvisit" =>strtotime ( "2011-02-24 20:12:55" ), "area" => "天津" ) );  
  27.  
  28. //循環(huán)打印數(shù)據(jù)庫(kù)的所有數(shù)據(jù)庫(kù)  
  29.  
  30. $it = $tt->getIterator ();  
  31.  
  32. foreach ( $it as $k => $v ) {  
  33.  
  34. print_r ( $v );  
  35.  
  36. }  
  37.  
  38. ?>  
  39. 比如我們需要查詢年齡為21歲的所有用戶:  
  40.  
  41.  
  42. $tt = new TokyoTyrantTable ( "127.0.0.1", 1978 );  
  43.  
  44. $query = $tt->getQuery ();  
  45.  
  46. //查詢年齡為21歲的用戶  
  47.  
  48. $query->addCond ( “age”, TokyoTyrant::RDBQC_NUMEQ, “21” );  
  49.  
  50. print_r ( $query->search () );  
  51.  
  52. ?>  
  53. 查詢所有在2011年3月5日之后登陸的用戶:  
  54.  
  55.  
  56. $tt = new TokyoTyrantTable ( "127.0.0.1", 1978 );  
  57.  
  58. $query = $tt->getQuery ();  
  59.  
  60. $query->addCond ( “l(fā)astvisit”, TokyoTyrant::RDBQC_NUMGE, strtotime ( "2011-3-5 00:00:00" ) );  
  61.  
  62. print_r ( $query->search () );  
  63.  
  64. ?> 

從上面的示例代碼可以看出,使用起來(lái)是非常簡(jiǎn)單的,甚至比SQL語(yǔ)句還要簡(jiǎn)單。Tokyo Tyrant的表類型存儲(chǔ)還提供了給字段建立普通索引和倒排全文索引,大大增強(qiáng)了其檢索功能和檢索的性能。

所以,完全用NoSQL來(lái)構(gòu)建部分系統(tǒng),是完全可能的。配合部分帶有關(guān)系查詢功能的NoSQL,在開發(fā)上比MySQL數(shù)據(jù)庫(kù)更加快速和高效。

(四)以NoSQL為數(shù)據(jù)源的架構(gòu)

數(shù)據(jù)直接寫入NoSQL,再通過(guò)NoSQL同步協(xié)議復(fù)制到其他存儲(chǔ)。根據(jù)應(yīng)用的邏輯來(lái)決定去相應(yīng)的存儲(chǔ)獲取數(shù)據(jù)。

 

圖 5 -以NoSQL為數(shù)據(jù)源

純NoSQL的架構(gòu)雖然結(jié)構(gòu)簡(jiǎn)單,易于開發(fā),但是在應(yīng)付需求的變更、穩(wěn)定性和可靠性上,總是給開發(fā)人員一種風(fēng)險(xiǎn)難于控制的感覺(jué)。為了降低風(fēng)險(xiǎn),系統(tǒng)的功能不局限在NoSQL的簡(jiǎn)單功能上,我們可以使用以NoSQL為數(shù)據(jù)源的架構(gòu)。

在這種架構(gòu)中,應(yīng)用程序只負(fù)責(zé)把數(shù)據(jù)直接寫入到NoSQL數(shù)據(jù)庫(kù)就OK,然后通過(guò)NoSQL的復(fù)制協(xié)議,把NoSQL數(shù)據(jù)的每次寫入,更新,刪除操作都復(fù)制到MySQL數(shù)據(jù)庫(kù)中。同 時(shí),也可以通過(guò)復(fù)制協(xié)議把數(shù)據(jù)同步復(fù)制到全文檢索實(shí)現(xiàn)強(qiáng)大的檢索功能。在海量數(shù)據(jù)下面,我們也可以根據(jù)不同的規(guī)則,把數(shù)據(jù)同步復(fù)制到設(shè)計(jì)好的分表分庫(kù)的 MySQL中。這種架構(gòu):
◆非常靈活??梢苑浅7奖愕脑诰€上系統(tǒng)運(yùn)行過(guò)程中進(jìn)行數(shù)據(jù)的調(diào)整,比如調(diào)整分庫(kù)分表的規(guī)則、要添加一種新的存儲(chǔ)類型等等。
◆操作簡(jiǎn)單。只需要寫入NoSQL數(shù)據(jù)庫(kù)源,應(yīng)用程序就不用管了。需要增加存儲(chǔ)類型或者調(diào)整存儲(chǔ)規(guī)則的時(shí)候,只需要增加同步的數(shù)據(jù)存儲(chǔ),調(diào)整同步規(guī)則即可,無(wú)需更改應(yīng)用程序的代碼。
◆性能高。數(shù)據(jù)的寫入和更新直接操作NoSQL,實(shí)現(xiàn)了寫的高性能。而通過(guò)同步協(xié)議,把數(shù)據(jù)復(fù)制到各種適合查詢類型的存儲(chǔ)中(按照業(yè)務(wù)邏輯區(qū)分不同的存儲(chǔ)),能實(shí)現(xiàn)查詢的高性能,不像以前MySQL一種數(shù)據(jù)庫(kù)就全包了?;蛘呔鸵粋€(gè)表負(fù)責(zé)跟這個(gè)表相關(guān)的所有的查詢,現(xiàn)在可以把一個(gè)表的數(shù)據(jù)復(fù)制到各種存儲(chǔ),讓各種存儲(chǔ)用自己的長(zhǎng)處來(lái)對(duì)外服務(wù)。
◆易擴(kuò)展。開發(fā)人員只需要關(guān)心寫入NoSQL數(shù)據(jù)庫(kù)。數(shù)據(jù)的擴(kuò)展可以方便的在后端由復(fù)制協(xié)議根據(jù)規(guī)則來(lái)完成。

這種架構(gòu)需要考慮數(shù)據(jù)復(fù)制的延遲問(wèn)題,這跟使用MySQL的master-salve模式的延遲問(wèn)題是一樣的,解決方法也一樣。

在這種以NoSQL為數(shù)據(jù)源的架構(gòu)中,最核心的就是NoSQL數(shù)據(jù)庫(kù)的復(fù)制功能的實(shí)現(xiàn)。而當(dāng)前的幾乎所有的NoSQL都沒(méi)有提供比較易于使用的復(fù)制接口來(lái)完成這種架構(gòu),對(duì)NoSQL進(jìn)行復(fù)制協(xié)議的二次開發(fā),需要更高的技術(shù)水平,所以這種架構(gòu)看起來(lái)很好,但是卻不是非常容易實(shí)現(xiàn)的。我的開源項(xiàng)目PHPBuffer中有個(gè)實(shí)現(xiàn)TokyoTyrant復(fù)制的例子,雖然是PHP版本的,但是很容易就可以翻譯成其他語(yǔ)言。通過(guò)這個(gè)例子的代碼,可以實(shí)現(xiàn)從Tokyo Tyrant實(shí)時(shí)的復(fù)制數(shù)據(jù)到其他系統(tǒng)中。

總結(jié)

以NoSQL為主的架構(gòu)應(yīng)該算是對(duì)NoSQL的一種深度應(yīng)用,整個(gè)系統(tǒng)的架構(gòu)以及代碼都不是很復(fù)雜,但是卻需要一定的NoSQL使用經(jīng)驗(yàn)才行。

 【編輯推薦】

  1. NoSQL理論研究:內(nèi)存是新的硬盤,硬盤是新的磁帶
  2. 關(guān)于NoSQL數(shù)據(jù)庫(kù)你應(yīng)該知道的10件事
  3. NoSQL就業(yè)形勢(shì)分析:Cassandra和MongoDB最受歡迎
  4. 用NoSQL來(lái)替代MySQL在Digg中的原因
  5. NoSQL架構(gòu)實(shí)踐(一)以NoSQL為輔
責(zé)任編輯:艾婧 來(lái)源: InfoQ中文站
相關(guān)推薦

2011-03-14 14:59:01

NoSQL

2011-03-31 14:02:59

NoSQL緩存架構(gòu)

2022-08-21 21:28:32

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

2011-05-13 09:46:20

MySQLNoSQL

2012-02-16 09:20:19

NoSQL

2011-08-18 14:09:35

NoSQL

2015-02-04 13:07:39

DTCC

2016-12-04 16:36:18

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

2012-02-01 16:26:04

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

2011-10-20 13:37:46

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

2012-05-15 10:28:29

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

2023-07-06 00:41:03

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

2011-02-22 08:49:38

NoSQL

2013-09-09 09:57:04

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

2012-05-15 11:03:22

NoSQL數(shù)據(jù)建模

2011-12-09 11:02:52

NoSQL

2011-05-16 09:27:10

MySQLNoSQL

2011-03-24 17:09:08

TrinityNoSQL

2024-02-02 10:51:53

2015-04-16 15:42:21

關(guān)系型數(shù)據(jù)庫(kù)NoSQL
點(diǎn)贊
收藏

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