天天看點

關系型資料庫MySql與非關系型資料庫NoSql

雲計算背後的秘密:NoSQL誕生的原因和優缺點

我本來一直覺得NoSQL其實很容易了解的,我本身也已經對NoSQL有了非常深入的研究,但是在最近準備YunTable的Chart的時候,發現NoSQL不僅非常博大精深,而且我個人對NoSQL的了解也隻是皮毛而已,但我還算是一個“知恥而後勇”的人,是以經過一段時間的學習之後,從本系列第六篇開始,就将和大家聊聊NoSQL,而本篇将主要給大家做一下NoSQL資料庫的綜述。 

首先将和大家聊聊為什麼NoSQL會在關系型資料庫已經非常普及的情況下異軍突起?

誕生的原因

随着網際網路的不斷發展,各種類型的應用層出不窮,是以導緻在這個雲計算的時代,對技術提出了更多的需求,主要展現在下面這四個方面: 

1. 低延遲的讀寫速度:應用快速地反應能極大地提升使用者的滿意度; 

2. 支撐海量的資料和流量:對于搜尋這樣大型應用而言,需要利用PB級别的資料和能應對百萬級的流量; 

3. 大規模叢集的管理:系統管理者希望分布式應用能更簡單的部署和管理;

  1. 龐大營運成本的考量:IT經理們希望在硬體成本、軟體成本和人力成本能夠有大幅度地降低;

目前世界上主流的存儲系統大部分還是采用了關系型資料庫,其主要有一下優點:

1.事務處理—保持資料的一緻性;

2.由于以标準化為前提,資料更新的開銷很小(相同的字段基本上隻有一處);

3.可以進行Join等複雜查詢。

雖然關系型資料庫已經在業界的資料存儲方面占據不可動搖的地位,但是由于其天生的幾個限制,使其很難滿足上面這幾個需求: 

1. 擴充困難:由于存在類似Join這樣多表查詢機制,使得資料庫在擴充方面很艱難; 

2. 讀寫慢:這種情況主要發生在資料量達到一定規模時由于關系型資料庫的系統邏輯非常複雜,使得其非常容易發生死鎖等的并發問題,是以導緻其讀寫速度下滑非常嚴重; 

3. 成本高:企業級資料庫的License價格很驚人,并且随着系統的規模,而不斷上升; 

4. 有限的支撐容量:現有關系型解決方案還無法支撐Google這樣海量的資料存儲; 

業界為了解決上面提到的幾個需求,推出了多款新類型的資料庫,并且由于它們在設計上和傳統的NoSQL資料庫相比有很大的不同,是以被統稱為“NoSQL”系列資料庫。總的來說,在設計上,它們非常關注對資料高并發地讀寫和對海量資料的存儲等,與關系型資料庫相比,它們在架構和資料模型方量面做了“減法”,而在擴充和并發等方面做了“加法”。現在主流的NoSQL資料庫有BigTable、HBase、Cassandra、SimpleDB、CouchDB、MongoDB和Redis等。接下來,将關注NoSQL資料庫到底存在哪些優缺點。

優缺點

在優勢方面,主要展現在下面這三點: 

1. 簡單的擴充:典型例子是Cassandra,由于其架構是類似于經典的P2P,是以能通過輕松地添加新的節點來擴充這個叢集; 

2. 快速的讀寫:主要例子有Redis,由于其邏輯簡單,而且純記憶體操作,使得其性能非常出色,單節點每秒可以處理超過10萬次讀寫操作; 

3. 低廉的成本:這是大多數分布式資料庫共有的特點,因為主要都是開源軟體,沒有昂貴的License成本; 

4. 

但瑕不掩瑜,NoSQL資料庫還存在着很多的不足,常見主要有下面這幾個: 

1. 不提供對SQL的支援:如果不支援SQL這樣的工業标準,将會對使用者産生一定的學習和應用遷移成本; 

2. 支援的特性不夠豐富:現有産品所提供的功能都比較有限,大多數NoSQL資料庫都不支援事務,也不像MS SQL Server和Oracle那樣能提供各種附加功能,比如BI和報表等; 

3. 現有産品的不夠成熟:大多數産品都還處于初創期,和關系型資料庫幾十年的完善不可同日而語; 

上面NoSQL産品的優缺點都是些比較共通的,在實際情況下,每個産品都會根據自己所遵從的資料模型和CAP理念而有所不同,接下來,将給大家介紹NoSQL兩個最重要的概念:資料模型和CAP理念,并在本文最後,對主流的NoSQL資料庫進行分類。

Naresh Kumar是位軟體工程師與熱情的部落客,對于程式設計與新事物擁有極大的興趣,非常樂于與其他開發者和程式員分享技術上的研究成果。近日,Naresh撰文比較了NoSQL與RDBMS,并詳細介紹了他們各自的特點與适用的場景。

NoSQL并不是關系型資料庫管理系統,本文将會介紹NoSQL資料庫與關系型資料庫之間的差别,同時還會讨論在何種場景下應該使用NoSQL,何種場景下不應該使用。由于NoSQL還是個相對較新的技術,是以它還面臨着很多挑戰。

時至今日,網際網路上有數以億計的使用者。大資料與雲計算已經成為很多主要的網際網路應用都在使用或是準備使用的技術,這是因為網際網路使用者每天都在不斷增長,資料也變得越來越複雜,而且有很多非結構化的資料存在,這是很難通過傳統的關系型資料庫管理系統來處理的。NoSQL技術則能比較好地解決這個問題,它主要用于非結構化的大資料與雲計算上。從這個角度來看,NoSQL是一種全新的資料庫思維方式。

為何要使用NoSQL資料庫?

1.NoSQL具有靈活的資料模型,可以處理非結構化/半結構化的大資料

現在,我們可以通過Facebook、D&B等第三方輕松獲得與通路資料,如個人使用者資訊、地理位置資料、社交圖譜、使用者産生的内容、機器日志資料以及傳感器生成的資料等。對這些資料的使用正在快速改變着通信、購物、廣告、娛樂以及關系管理的特質。沒有使用這些資料的應用很快就會被使用者所遺忘。開發者希望使用非常靈活的資料庫,能夠輕松容納新的資料類型,并且不會被第三方資料提供商内容結構的變化所累。很多新資料都是非結構化或是半結構化的,是以開發者還需要能夠高效存儲這種資料的資料庫。但遺憾的是,關系型資料庫所使用的定義嚴格、基于模式的方式是無法快速容納新的資料類型的,對于非結構化或是半結構化的資料更是無能為力。NoSQL提供的資料模型則能很好地滿足這種需求。很多應用都會從這種非結構化資料模型中獲益,比如說CRM、ERP、BPM等等,他們可以通過這種靈活性存儲資料而無需修改表或是建立更多的列。這些資料庫也非常适合于建立原型或是快速應用,因為這種靈活性使得新特性的開發變得非常容易。

2.NoSQL很容易實作可伸縮性(向上擴充與水準擴充)

如果有很多使用者在頻繁且并發地使用你的應用,那麼你就需要考慮可伸縮的資料庫技術而非傳統的RDBMS了。對于關系型技術來說,很多應用開發者會發現動态的可伸縮性是難以實作的,這時就應該考慮切換到NoSQL資料庫上。對于雲應用來說,關系型資料庫一開始是普遍的選擇。然而,在使用過程中卻遇到了越來越多的問題,原因就在于他們是中心化的,向上擴充而非水準擴充的。這使得他們不适合于那些需要簡單且動态可伸縮性的應用。NoSQL資料庫從一開始就是分布式、水準擴充的,是以非常适合于網際網路應用分布式的特性。

在三層網際網路架構的Web/應用層上,多年來向上擴充已經成為預設的擴充方式了。随着應用使用人數的激增,我們需要添加更多的伺服器,性能則是通過負載均衡來實作的,這時的代價與使用者數量成線性比例關系。在NoSQL資料庫之前,資料庫層的預設擴充方式就是向上擴充。為了支援更多的并發使用者以及存儲更多的資料,你需要越來越好的伺服器,更好的CPU、更多的記憶體、更大的磁盤來維護所有表。然而,好的伺服器意味着更加複雜、私有、并且也更加昂貴。這與Web/應用層所使用的便宜的硬體形成了鮮明的對比。

3.動态模式

關系型資料庫需要在添加資料前先定義好模式。比如說,你需要存儲客戶的電話号碼、姓名、位址、城市與州等資訊,SQL資料庫需要提前知曉你要存的是什麼。這對于靈活開發模式來說是場災難,因為每次完成新特性時,資料庫的模式通常都需要改變。是以,如果在開發過程中想将客戶喜歡的條目加到資料庫中,那就得向表中添加這一列才行,然後要做的就是将整個資料庫遷移到新的模式上。

4.自動分片

由于是結構化的,關系型資料庫通常會垂直擴充,單台伺服器要持有整個資料庫來確定可靠性與資料的持續可用性。這樣做的代價就是非常昂貴、擴充受到限制,并且資料庫基礎設施會成為失敗點。這個問題的解決方案就是水準擴充,添加伺服器而不是為單台伺服器增加更多的能力。NoSQL資料庫通常都支援自動分片,這意味着他們本質上就會自動在多台伺服器上分發資料,應用甚至都不知道這些事情。資料與查詢負載會自動在多台伺服器上做到平衡,當某台伺服器當機時,它能快速且透明地被替換掉。

5.複制

大多數NoSQL資料庫也支援自動複制,這意味着你可以獲得高可用性與災備恢複功能。從開發者的角度來看,存儲環境本質上是虛拟化的。

NoSQL資料庫面臨的挑戰

1.成熟度

RDBMS系統由來已久。NoSQL擁護者們會說RDBMS的高齡是其衰退的标志,不過對于大多數CIO來說,RDBMS的成熟讓人放心。對于大多數情況來說,RDBMS系統是穩定且功能豐富的。相比較而言,大多數NoSQL資料庫則還有很多特性有待實作。

2.支援

企業需要的是安心,如果關鍵系統出現了故障,他們可以獲得即時的支援。所有RDBMS廠商都在不遺餘力地提供良好的企業支援。與之相反,大多數NoSQL系統都是開源項目,雖然每種資料庫都有那麼幾家公司提供支援,不過這些公司大多都是小的初創公司,沒有全球支援資源,也沒有Oracle、微軟或是IBM那種令人放心的公信力。

3.分析與商業智能

NoSQL資料庫在Web 2.0應用時代開始出現。是以,大多數特性都是面向這些應用的需要的。然而,應用中的資料對于業務來說是有價值的,這種價值遠遠超出了Web應用那種CRUD。企業資料庫中的業務資訊可以幫助改進效率并提升競争力,商業智能對于大中型企業來說是個非常關鍵的IT問題。

4.管理

NoSQL的設計目标是提供零管理的解決方案,不過當今的現實卻離這個目标還相去甚遠。現在的NoSQL需要很多技巧才能用好,并且需要不少人力、物力來維護。

5.專業

全球有很多開發者,每個業務部門都會有熟悉RDBMS概念與程式設計的人。相反,幾乎每個NoSQL開發者都處于學習模式。這種狀況會随着時間的流逝而發生改觀。但現在,找到一個有經驗的RDBMS程式員或是管理者要比NoSQL專家容易多了。

結論

NoSQL資料庫正在成為資料庫領域的重要力量。如果使用恰當,那麼它會帶來很多好處。然而,企業應該非常小心并注意到這些資料庫的限制與問題。

NoSQL這兩年越來越熱,尤其是大型網際網路公司非常熱衷這門技術。根據筆者的經驗,并不是任何場景,NoSQL都要優于關系型資料庫。下面我們來具體聊聊,什麼時候使用NoSQL比較給力:

1) 資料庫表schema經常變化 

比如線上商城,維護産品的屬性經常要增加字段,這就意味着ORMapping層的代碼和配置要改,如果該表的資料量過百萬,新增字段會帶來額外開銷(重建索引等)。NoSQL應用在這種場景,可以極大提升DB的可伸縮性,開發人員可以将更多的精力放在業務層。

2)資料庫表字段是複雜資料類型

對于複雜資料類型,比如SQL Sever提供了可擴充性的支援,像xml類型的字段。很多用過的同學應該知道,該字段不管是查詢還是更改,效率非常一般。主要原因是是DB層對xml字段很難建高效索引,應用層又要做從字元流到dom的解析轉換。NoSQL以json方式存儲,提供了原生态的支援,在效率友善遠遠高于傳統關系型資料庫。

3)高并發資料庫請求

此類應用常見于web2.0的網站,很多應用對于資料一緻性要求很低,而關系型資料庫的事務以及大表join反而成了”性能殺手”。在高并發情況下,sql與no-sql的性能對比由于環境和角度不同一直是存在争議的,并不是說在任何場景,no-sql總是會比sql快。有篇article和大家分享下,http://artur.ejsmont.org/blog/content/insert-performance-comparison-of-nosql-vs-sql-servers

4)海量資料的分布式存儲

海量資料的存儲如果選用大型商用資料,如Oracle,那麼整個解決方案的成本是非常高的,要花很多錢在軟硬體上。NoSQL分布式存儲,可以部署在廉價的硬體上,是一個成本效益非常高的解決方案。Mongo的auto-sharding已經運用到了生産環境。http://www.mongodb.org/display/DOCS/Sharding

并不是說NoSQL可以解決一切問題,像ERP系統、BI系統,在大部分情況還是推薦使用傳統關系型資料庫。主要的原因是此類系統的業務模型複雜,使用NoSQL将導緻系統的維護成本增加。

為什麼要使用NoSQL

NoSQL概念 

随着web2.0的快速發展,非關系型、分布式資料存儲得到了快速的發展,它們不保證關系資料的ACID特性。NoSQL概念在2009年被提了出來。NoSQL最常見的解釋是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一詞最早于1998年被用于一個輕量級的關系資料庫的名字。)

NoSQL被我們用得最多的當數key-value存儲,當然還有其他的文檔型的、列存儲、圖型資料庫、xml資料庫等。在NoSQL概念提出之前,這些資料庫就被用于各種系統當中,但是卻很少用于web網際網路應用。比如cdb、qdbm、bdb資料庫。

傳統關系資料庫的瓶頸 

傳統的關系資料庫具有不錯的性能,高穩定型,久經曆史考驗,而且使用簡單,功能強大,同時也積累了大量的成功案例。在網際網路領域,MySQL成為了絕對靠前的王者,毫不誇張的說,MySQL為網際網路的發展做出了卓越的貢獻。

在90年代,一個網站的通路量一般都不大,用單個資料庫完全可以輕松應付。在那個時候,更多的都是靜态網頁,動态互動類型的網站不多。

到了最近10年,網站開始快速發展。火爆的論壇、部落格、sns、微網誌逐漸引領web領域的潮流。在初期,論壇的流量其實也不大,如果你接觸網絡比較早,你可能還記得那個時候還有文本型存儲的論壇程式,可以想象一般的論壇的流量有多大。

Memcached+MySQL 

後來,随着通路量的上升,幾乎大部分使用MySQL架構的網站在資料庫上都開始出現了性能問題,web程式不再僅僅專注在功能上,同時也在追求性能。程式員們開始大量的使用緩存技術來緩解資料庫的壓力,優化資料庫的結構和索引。開始比較流行的是通過檔案緩存來緩解資料庫壓力,但是當通路量繼續增大的時候,多台web機器通過檔案緩存不能共享,大量的小檔案緩存也帶了了比較高的IO壓力。在這個時候,Memcached就自然的成為一個非常時尚的技術産品。

Memcached作為一個獨立的分布式的緩存伺服器,為多個web伺服器提供了一個共享的高性能緩存服務,在Memcached伺服器上,又發展了根據hash算法來進行多台Memcached緩存服務的擴充,然後又出現了一緻性hash來解決增加或減少緩存伺服器導緻重新hash帶來的大量緩存失效的弊端。當時,如果你去面試,你說你有Memcached經驗,肯定會加分的。

Mysql主從讀寫分離 

由于資料庫的寫入壓力增加,Memcached隻能緩解資料庫的讀取壓力。讀寫集中在一個資料庫上讓資料庫不堪重負,大部分網站開始使用主從複制技術來達到讀寫分離,以提高讀寫性能和讀庫的可擴充性。Mysql的master-slave模式成為這個時候的網站标配了。

分表分庫 

随着web2.0的繼續高速發展,在Memcached的高速緩存,MySQL的主從複制,讀寫分離的基礎之上,這時MySQL主庫的寫壓力開始出現瓶頸,而資料量的持續猛增,由于MyISAM使用表鎖,在高并發下會出現嚴重的鎖問題,大量的高并發MySQL應用開始使用InnoDB引擎代替MyISAM。同時,開始流行使用分表分庫來緩解寫壓力和資料增長的擴充問題。這個時候,分表分庫成了一個熱門技術,是面試的熱門問題也是業界讨論的熱門技術問題。也就在這個時候,MySQL推出了還不太穩定的表分區,這也給技術實力一般的公司帶來了希望。雖然MySQL推出了MySQL Cluster叢集,但是由于在網際網路幾乎沒有成功案例,性能也不能滿足網際網路的要求,隻是在高可靠性上提供了非常大的保證。

MySQL的擴充性瓶頸 

在網際網路,大部分的MySQL都應該是IO密集型的,事實上,如果你的MySQL是個CPU密集型的話,那麼很可能你的MySQL設計得有性能問題,需要優化了。大資料量高并發環境下的MySQL應用開發越來越複雜,也越來越具有技術挑戰性。分表分庫的規則把握都是需要經驗的。雖然有像淘寶這樣技術實力強大的公司開發了透明的中間件層來屏蔽開發者的複雜性,但是避免不了整個架構的複雜性。分庫分表的子庫到一定階段又面臨擴充問題。還有就是需求的變更,可能又需要一種新的分庫方式。

MySQL資料庫也經常存儲一些大文本字段,導緻資料庫表非常的大,在做資料庫恢複的時候就導緻非常的慢,不容易快速恢複資料庫。比如1000萬4KB大小的文本就接近40GB的大小,如果能把這些資料從MySQL省去,MySQL将變得非常的小。

關系資料庫很強大,但是它并不能很好的應付所有的應用場景。MySQL的擴充性差(需要複雜的技術來實作),大資料下IO壓力大,表結構更改困難,正是目前使用MySQL的開發人員面臨的問題。

NOSQL的優勢

易擴充 

NoSQL資料庫種類繁多,但是一個共同的特點都是去掉關系資料庫的關系型特性。資料之間無關系,這樣就非常容易擴充。也無形之間,在架構的層面上帶來了可擴充的能力。

大資料量,高性能 

NoSQL資料庫都具有非常高的讀寫性能,尤其在大資料量下,同樣表現優秀。這得益于它的無關系性,資料庫的結構簡單。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,在針對web2.0的互動頻繁的應用,Cache性能不高。而NoSQL的Cache是記錄級的,是一種細粒度的Cache,是以NoSQL在這個層面上來說就要性能高很多了。

靈活的資料模型 

NoSQL無需事先為要存儲的資料建立字段,随時可以存儲自定義的資料格式。而在關系資料庫裡,增删字段是一件非常麻煩的事情。如果是非常大資料量的表,增加字段簡直就是一個噩夢。這點在大資料量的web2.0時代尤其明顯。

高可用 

NoSQL在不太影響性能的情況,就可以友善的實作高可用的架構。比如Cassandra,HBase模型,通過複制模型也能實作高可用。

總結 

NoSQL資料庫的出現,彌補了關系資料(比如MySQL)在某些方面的不足,在某些方面能極大的節省開發成本和維護成本。 

MySQL和NoSQL都有各自的特點和使用的應用場景,兩者的緊密結合将會給web2.0的資料庫發展帶來新的思路。讓關系資料庫關注在關系上,NoSQL關注在存儲上。

關系資料庫還是NoSQL資料庫

上一篇簡單的說明了為什麼要使用NoSQL。接下來我們看下如何把NoSQL引入到我們的項目中,我們到底要不要把NoSQL引入到項目中。

在過去,我們隻需要學習和使用一種資料庫技術,就能做幾乎所有的資料庫應用開發。因為成熟穩定的關系資料庫産品并不是很多,而供你選擇的免費版本就更加少了,是以網際網路領域基本上都選擇了免費的MySQL資料庫。在高速發展的WEB2.0時代,我們發現關系資料庫在性能、擴充性、資料的快速備份和恢複、滿足需求的易用性上并不總是能很好的滿足我們的需要,我們越來越趨向于根據業務場景選擇合适的資料庫,以及進行多種資料庫的融合運用。幾年前的一篇文章《One Size Fits All - An Idea Whose Time Has Come and Gone》就已經闡述了這個觀點。

當我們在讨論是否要使用NoSQL的時候,你還需要了解NoSQL也是分很多種類的,在NoSQL百花齊放的今天,NoSQL的正确選擇比選擇關系資料庫還具有挑戰性。雖然NoSQL的使用很簡單,但是選擇卻是個麻煩事,這也正是很多人在觀望的一個原因。

NoSQL的分類

NoSQL僅僅是一個概念,NoSQL資料庫根據資料的存儲模型和特點分為很多種類。 

關系型資料庫MySql與非關系型資料庫NoSql

以上NoSQL資料庫類型的劃分并不是絕對,隻是從存儲模型上來進行的大體劃分。它們之間沒有絕對的分界,也有交差的情況,比如Tokyo Cabinet / Tyrant的Table類型存儲,就可以了解為是文檔型存儲,Berkeley DB XML資料庫是基于Berkeley DB之上開發的。

NoSQL還是關系資料庫 

雖然09年出現了比較激進的文章《關系資料庫已死》,但是我們心裡都清楚,關系資料庫其實還活得好好的,你還不能不用關系資料庫。但是也說明了一個事實,關系資料庫在處理WEB2.0資料的時候,的确已經出現了瓶頸。

那麼我們到底是用NoSQL還是關系資料庫呢?我想我們沒有必要來進行一個絕對的回答。我們需要根據我們的應用場景來決定我們到底用什麼。

如果關系資料庫在你的應用場景中,完全能夠很好的工作,而你又是非常善于使用和維護關系資料庫的,那麼我覺得你完全沒有必要遷移到NoSQL上面,除非你是個喜歡折騰的人。如果你是在金融,電信等以資料為王的關鍵領域,目前使用的是Oracle資料庫來提供高可靠性的,除非遇到特别大的瓶頸,不然也别貿然嘗試NoSQL。

然而,在WEB2.0的網站中,關系資料庫大部分都出現了瓶頸。在磁盤IO、資料庫可擴充上都花費了開發人員相當多的精力來優化,比如做分表分庫(database sharding)、主從複制、異構複制等等,然而,這些工作需要的技術能力越來越高,也越來越具有挑戰性。如果你正在經曆這些場合,那麼我覺得你應該嘗試一下NoSQL了。

選擇合适的NoSQL 

如此多類型的NoSQL,而每種類型的NoSQL又有很多,到底選擇什麼類型的NoSQL來作為我們的存儲呢?這并不是一個很好回答的問題,影響我們選擇的因素有很多,而選擇也可能有多種,随着業務場景,需求的變更可能選擇又會變化。我們常常需要根據如下情況考慮:

1.資料結構特點。包括結構化、半結構化、字段是否可能變更、是否有大文本字段、資料字段是否可能變化。

2.寫入特點。包括insert比例、update比例、是否經常更新資料的某一個小字段、原子更新需求。

3.查詢特點。包括查詢的條件、查詢熱點的範圍。比如使用者資訊的查詢,可能就是随機的,而新聞的查詢就是按照時間,越新的越頻繁。

NoSQL和關系資料庫結合 

其實NoSQL資料庫僅僅是關系資料庫在某些方面(性能,擴充)的一個彌補,單從功能上講,NoSQL的幾乎所有的功能,在關系資料庫上都能夠滿足,是以選擇NoSQL的原因并不在功能上。

是以,我們一般會把NoSQL和關系資料庫進行結合使用,各取所長,需要使用關系特性的時候我們使用關系資料庫,需要使用NoSQL特性的時候我們使用NoSQL資料庫,各得其所。

舉個簡單的例子吧,比如使用者評論的存儲,評論大概有主鍵id、評論的對象aid、評論内容content、使用者uid等字段。我們能确定的是評論内容content肯定不會在資料庫中用where content=’’查詢,評論内容也是一個大文本字段。那麼我們可以把 主鍵id、評論對象aid、使用者id存儲在資料庫,評論内容存儲在NoSQL,這樣資料庫就節省了存儲content占用的磁盤空間,進而節省大量IO,對content也更容易做Cache。

//從MySQL中查詢出評論主鍵id清單 commentIds=DB.query(“SELECT id FROM comments where aid=’評論對象id’ LIMIT 0,20”); //根據主鍵id清單,從NoSQL取回評論實體資料 CommentsList=NoSQL.get(commentIds);NoSQL代替MySQL 

在某些應用場合,比如一些配置的關系鍵值映射存儲、使用者名和密碼的存儲、Session會話存儲等等,用NoSQL完全可以替代MySQL存儲。不但具有更高的性能,而且開發也更加友善。

NoSQL作為緩存伺服器 

MySQL+Memcached的架構中,我們處處都要精心設計我們的緩存,包括過期時間的設計、緩存的實時性設計、緩存記憶體大小評估、緩存命中率等等。

NoSQL資料庫一般都具有非常高的性能,在大多數場景下面,你不必再考慮在代碼層為NoSQL建構一層Memcached緩存。NoSQL資料本身在Cache上已經做了相當多的優化工作。

Memcached這類記憶體緩存伺服器緩存的資料大小受限于記憶體大小,如果用NoSQL來代替Memcached來緩存資料庫的話,就可以不再受限于記憶體大小。雖然可能有少量的磁盤IO讀寫,可能比Memcached慢一點,但是完全可以用來緩存資料庫的查詢操作。

規避風險 

由于NoSQL是一個比較新的東西,特别是我們選擇的NoSQL資料庫還不是非常成熟的産品,是以我們可能會遇到未知的風險。為了得到NoSQL的好處,又要考慮規避風險,魚與熊掌如何兼得?

現在業内很多公司的做法就是資料的備份。在往NoSQL裡面存儲資料的時候還會往MySQL裡面存儲一份。NoSQL資料庫本身也需要進行備份(冷備和熱備)。或者可以考慮使用兩種NoSQL資料庫,出現問題後可以進行切換(避免出現digg使用Cassandra的悲劇)。

總結 

本文隻是簡單的從MySQL和NoSQL的角度分析如何選擇,以及進行融合使用。其實在選擇NoSQL的時候,你可能還會碰到關于CAP原則,最終一緻性,BASE思想的考慮。因為使用MySQL架構的時候,你也會碰到上面的問題,是以這裡沒有闡述。