NoSQL(NoSQL = Not Only SQL ),泛指非關係型的數據庫。隨着互聯網web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲其自己的特色獲得了很是迅速的發展。計算機體系結構在數據存儲方面要求具有龐大的水平擴展性,而NoSQL致力於改變這一現狀。Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型數據庫。Riak是主流NoSQL數據庫之一,採用key-value存儲模式。程序員
簡單來講,NoSQL能夠處理超大規模的數據。可是,目前NoSQL對大型企業來講還不是主流,還有待進一步的發展。web
隨着web2.0的快速發展,非關係型、分佈式數據存儲獲得了快速的發展,它們不保證關係數據的ACID特性。NoSQL概念在2009年被提了出來。NoSQL最多見的解釋是「non-relational」,「Not Only SQL」也被不少人接受(「NoSQL」一詞最先於1998年被用於一個輕量級的關係數據庫的名字)。面試
NoSQL被咱們用得最多的當數key-value存儲,固然還有其餘的文檔型的、列存儲、圖型數據庫、xml數據庫等。在NoSQL概念提出以前,這些數據庫就被用於各類系統當中,可是卻不多用於web互聯網應用。好比cdb、qdbm、bdb數據庫。算法
傳統的關係數據庫具備不錯的性能,高穩定型,久經歷史考驗,並且使用簡單,功能強大,同時也積累了大量的成功案例。在互聯網領域,MySQL成爲了絕對靠前的王者,絕不誇張的說,MySQL爲互聯網的發展作出了卓越的貢獻。sql
在90年代,一個網站的訪問量通常都不大,用單個數據庫徹底能夠輕鬆應付。在那個時候,更多的都是靜態網頁,動態交互類型的網站很少。到了最近10年,網站開始快速發展。火爆的論壇、博客、sns、微博逐漸引領web領域的潮流。在初期,論壇的流量其實也不大,若是你接觸網絡比較早,你可能還記得那個時候還有文本型存儲的論壇程序,能夠想象通常的論壇的流量有多大。數據庫
後來,隨着訪問量的上升,幾乎大部分使用MySQL架構的網站在數據庫上都開始出現了性能問題,web程序再也不僅僅專一在功能上,同時也在追求性能。程序員們開始大量的使用緩存技術來緩解數據庫的壓力,優化數據庫的結構和索引。開始比較流行的是經過文件緩存來緩解數據庫壓力,可是當訪問量繼續增大的時候,多臺web機器經過文件緩存不能共享,大量的小文件緩存也帶了了比較高的IO壓力。在這個時候,Memcached就天然的成爲一個很是時尚的技術產品。緩存
Memcached做爲一個獨立的分佈式的緩存服務器,爲多個web服務器提供了一個共享的高性能緩存服務,在Memcached服務器上,又發展了根據hash算法來進行多臺Memcached緩存服務的擴展,而後又出現了一致性hash來解決增長或減小緩存服務器致使從新hash帶來的大量緩存失效的弊端。當時,若是你去面試,你說你有Memcached經驗,確定會加分的。服務器
因爲數據庫的寫入壓力增長,Memcached只能緩解數據庫的讀取壓力。讀寫集中在一個數據庫上讓數據庫不堪重負,大部分網站開始使用主從複製技術來達到讀寫分離,以提升讀寫性能和讀庫的可擴展性。Mysql的master-slave模式成爲這個時候的網站標配了。網絡
隨着web2.0的繼續高速發展,在Memcached的高速緩存,MySQL的主從複製,讀寫分離的基礎之上,這時MySQL主庫的寫壓力開始出現瓶頸,而數據量的持續猛增,因爲MyISAM使用表鎖,在高併發下會出現嚴重的鎖問題,大量的高併發MySQL應用開始使用InnoDB引擎代替MyISAM。同時,開始流行使用分表分庫來緩解寫壓力和數據增加的擴展問題。這個時候,分表分庫成了一個熱門技術,是面試的熱門問題也是業界討論的熱門技術問題。也就在這個時候,MySQL推出了還不太穩定的表分區,這也給技術實力通常的公司帶來了但願。雖然MySQL推出了MySQL Cluster集羣,可是因爲在互聯網幾乎沒有成功案例,性能也不能知足互聯網的要求,只是在高可靠性上提供了很是大的保證。架構
在互聯網,大部分的MySQL都應該是IO密集型的,事實上,若是你的MySQL是個CPU密集型的話,那麼極可能你的MySQL設計得有性能問題,須要優化了。大數據量高併發環境下的MySQL應用開發愈來愈複雜,也愈來愈具備技術挑戰性。分表分庫的規則把握都是須要經驗的。雖然有像淘寶這樣技術實力強大的公司開發了透明的中間件層來屏蔽開發者的複雜性,可是避免不了整個架構的複雜性。分庫分表的子庫到必定階段又面臨擴展問題。還有就是需求的變動,可能又須要一種新的分庫方式。
MySQL數據庫也常常存儲一些大文本字段,致使數據庫表很是的大,在作數據庫恢復的時候就致使很是的慢,不容易快速恢復數據庫。好比1000萬4KB大小的文本就接近40GB的大小,若是能把這些數據從MySQL省去,MySQL將變得很是的小。關係數據庫很強大,可是它並不能很好的應付全部的應用場景。MySQL的擴展性差(須要複雜的技術來實現),大數據下IO壓力大,表結構更改困難,正是當前使用MySQL的開發人員面臨的問題。
總結
參考閱讀
NoSQL:http://nosql-database.org/
NoSQL在wiki上的介紹:http://en.wikipedia.org/wiki/NoSQL
NoSQL相關博客:http://nosql.mypopescu.com/
NoSQL相關博客:http://blog.nosqlfan.com/
新浪微博NoSQL微羣:http://q.t.sina.com.cn/127870
本文參考《NoSQL開篇——爲何要使用NoSQL》