關於NoSQL非關係型的資料庫詳解
NoSQL概念
NoSQL,泛指非關係型的資料庫。隨著互聯網web2.0網站的興起,傳統的關係資料庫在應付web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的資料庫則由於其本身的特點得到了非常迅速的發展。
NoSQL被我們用得最多的當數key-value存儲,當然還有其他的文檔型的、列存儲、圖型資料庫、xml資料庫等。在NoSQL概念提出之前,這些資料庫就被用於各種系統當中,但是卻很少用於web互聯網應用。比如cdb、qdbm、bdb資料庫。
NoSQL誕生的原因
隨著互聯網的不斷發展,各種類型的應用層出不窮,所以導致在這個雲計算的時代,對技術提出了更多的需求,主要體現在下面這四個方面:
1. 低延遲的讀寫速度:應用快速地反應能極大地提升用戶的滿意度;
2. 支撐海量的數據和流量:對於搜索這樣大型應用而言,需要利用PB級別的數據和能應對百萬級的流量;
3. 大規模集群的管理:系統管理員希望分散式應用能更簡單的部署和管理;
目前世界上主流的存儲系統大部分還是採用了關係型資料庫,其主要有一下優點:
1.事務處理—保持數據的一致性;
2.由於以標準化為前提,數據更新的開銷很小(相同的欄位基本上只有一處);
3.可以進行Join等複雜查詢。
雖然關係型資料庫已經在業界的數據存儲方面佔據不可動搖的地位,但是由於其天生的幾個限制,使其很難滿足上面這幾個需求:
1. 擴展困難:由於存在類似Join這樣多表查詢機制,使得資料庫在擴展方面很艱難;
2. 讀寫慢:這種情況主要發生在數據量達到一定規模時由於關係型資料庫的系統邏輯非常複雜,使得其非常容易發生死鎖等的並發問題,所以導致其讀寫速度下滑非常嚴重;
3. 成本高:企業級資料庫的License價格很驚人,並且隨著系統的規模,而不斷上升;
4. 有限的支撐容量:現有關係型解決方案還無法支撐Google這樣海量的數據存儲;
業界為了解決上面提到的幾個需求,推出了多款新類型的資料庫,並且由於它們在設計上和傳統的NoSQL資料庫相比有很大的不同,所以被統稱為「NoSQL」系列資料庫。總的來說,在設計上,它們非常關注對數據高並發地讀寫和對海量數據的存儲等,與關係型資料庫相比,它們在架構和數據模型方量面做了「減法」,而在擴展和並發等方面做了「加法」。現在主流的NoSQL資料庫有BigTable、HBase、Cassandra、SimpleDB、CouchDB、MongoDB和Redis等。接下來,將關注NoSQL資料庫到底存在哪些優缺點。
傳統關係資料庫的瓶頸
傳統的關係資料庫具有不錯的性能,高穩定型,久經歷史考驗,而且使用簡單,功能強大,同時也積累了大量的成功案例。在互聯網領域,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關注在存儲上。


TAG:PHP編程 |