NoSQL,泛指非關系型的數(shù)據庫。隨著互聯(lián)網web2.0網站的興起,傳統(tǒng)的關系數(shù)據庫在應付web2.0網站,特別是超大規(guī)模和高并發(fā)的SNS類型的web2.0純動態(tài)網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數(shù)據庫則由于其本身的特點得到了非常迅速的發(fā)展。NoSQL數(shù)據庫的產生就是為了解決大規(guī)模數(shù)據集合多重數(shù)據種類帶來的挑戰(zhàn),尤其是大數(shù)據應用難題。
成都創(chuàng)新互聯(lián)公司主營仲巴網站建設的網絡公司,主營網站建設方案,成都app開發(fā),仲巴h5微信平臺小程序開發(fā)搭建,仲巴網站營銷推廣歡迎仲巴等地區(qū)企業(yè)咨詢
雖然NoSQL流行語火起來才短短一年的時間,但是不可否認,現(xiàn)在已經開始了第二代運動。盡管早期的堆棧代碼只能算是一種實驗,然而現(xiàn)在的系統(tǒng)已經更加的成熟、穩(wěn)定。不過現(xiàn)在也面臨著一個嚴酷的事實:技術越來越成熟——以至于原來很好的NoSQL數(shù)據存儲不得不進行重寫,也有少數(shù)人認為這就是所謂的2.0版本。這里列出一些比較知名的工具,可以為大數(shù)據建立快速、可擴展的存儲庫。
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,是一項全新的數(shù)據庫革命性運動,早期就有人提出,發(fā)展至2009年趨勢越發(fā)高漲。NoSQL的擁護者們提倡運用非關系型的數(shù)據存儲,相對于鋪天蓋地的關系型數(shù)據庫運用,這一概念無疑是一種全新的思維的注入。
對于NoSQL并沒有一個明確的范圍和定義,但是他們都普遍存在下面一些共同特征:
不需要預定義模式:不需要事先定義數(shù)據模式,預定義表結構。數(shù)據中的每條記錄都可能有不同的屬性和格式。當插入數(shù)據時,并不需要預先定義它們的模式。
無共享架構:相對于將所有數(shù)據存儲的存儲區(qū)域網絡中的全共享架構。NoSQL往往將數(shù)據劃分后存儲在各個本地服務器上。因為從本地磁盤讀取數(shù)據的性能往往好于通過網絡傳輸讀取數(shù)據的性能,從而提高了系統(tǒng)的性能。
彈性可擴展:可以在系統(tǒng)運行的時候,動態(tài)增加或者刪除結點。不需要停機維護,數(shù)據可以自動遷移。
分區(qū):相對于將數(shù)據存放于同一個節(jié)點,NoSQL數(shù)據庫需要將數(shù)據進行分區(qū),將記錄分散在多個節(jié)點上面。并且通常分區(qū)的同時還要做復制。這樣既提高了并行性能,又能保證沒有單點失效的問題。
異步復制:和RAID存儲系統(tǒng)不同的是,NoSQL中的復制,往往是基于日志的異步復制。這樣,數(shù)據就可以盡快地寫入一個節(jié)點,而不會被網絡傳輸引起遲延。缺點是并不總是能保證一致性,這樣的方式在出現(xiàn)故障的時候,可能會丟失少量的數(shù)據。
BASE:相對于事務嚴格的ACID特性,NoSQL數(shù)據庫保證的是BASE特性。BASE是最終一致性和軟事務。
NoSQL數(shù)據庫并沒有一個統(tǒng)一的架構,兩種NoSQL數(shù)據庫之間的不同,甚至遠遠超過兩種關系型數(shù)據庫的不同??梢哉f,NoSQL各有所長,成功的NoSQL必然特別適用于某些場合或者某些應用,在這些場合中會遠遠勝過關系型數(shù)據庫和其他的NoSQL。
什么是NoSQL數(shù)據庫?從名稱“非SQL”或“非關系型”衍生而來,這些數(shù)據庫不使用類似SQL的查詢語言,通常稱為結構化存儲。這些數(shù)據庫自1960年就已經存在,但是直到現(xiàn)在一些大公司(例如Google和Facebook)開始使用它們時,這些數(shù)據庫才流行起來。該數(shù)據庫最明顯的優(yōu)勢是擺脫了一組固定的列、連接和類似SQL的查詢語言的限制。有時,NoSQL這個名稱也可能表示“不僅僅SQL”,來確保它們可能支持SQL。 NoSQL數(shù)據庫使用諸如鍵值、寬列、圖形或文檔之類的數(shù)據結構,并且可以如JSON之類的不同格式存儲。
1、使用冗余,每個人的好友信息都在數(shù)據庫中有存儲,就是你說的記錄一對一關系
2、數(shù)據緩存到內存,數(shù)據訪問很快
3、狀態(tài)信息修改異步,比如一個人登陸了,他的好友不是馬上就知道,中間間隔幾秒也沒有關系
4、數(shù)據可能不放在關系數(shù)據庫中,可能使用nosql數(shù)據庫,比如mongodb,bigtable,cassandra等
5、facebook,twitter就是用類似的思想
NoSQL,指的是非關系型的數(shù)據庫。
NoSQL 是Not Only SQL 的縮寫,意思是“不僅僅是 SQL”,而不是“不使用 SQL”。
NoSQL 的出現(xiàn)可以解決傳統(tǒng)關系型數(shù)據庫所不能解決的問題。
NoSQL,指的是非關系型的數(shù)據庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同于傳統(tǒng)的關系型數(shù)據庫的數(shù)據庫管理系統(tǒng)的統(tǒng)稱。
NoSQL用于超大規(guī)模數(shù)據的存儲。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數(shù)據)。這些類型的數(shù)據存儲不需要固定的模式,無需多余操作就可以橫向擴展。
NoSQL的優(yōu)點/缺點
優(yōu)點:
- 高可擴展性
- 分布式計算
- 低成本
- 架構的靈活性,半結構化數(shù)據
- 沒有復雜的關系
缺點:
- 沒有標準化
- 有限的查詢功能(到目前為止)
- 最終一致是不直觀的程序 (BY三人行慕課)
這次的NoSQL專欄系列將先整體介紹NoSQL,然后介紹如何把NoSQL運用到自己的項目中合適的場景中,還會適當?shù)胤治鲆恍┏晒Π咐M谐晒κ褂肗oSQL經驗的朋友給我提供一些線索和信息。
NoSQL概念隨著web2.0的快速發(fā)展,非關系型、分布式數(shù)據存儲得到了快速的發(fā)展,它們不保證關系數(shù)據的ACID特性。NoSQL概念在2009年被提了出來。NoSQL最常見的解釋是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一詞最早于1998年被用于一個輕量級的關系數(shù)據庫的名字。)
NoSQL被我們用得最多的當數(shù)key-value存儲,當然還有其他的文檔型的、列存儲、圖型數(shù)據庫、xml數(shù)據庫等。在NoSQL概念提出之前,這些數(shù)據庫就被用于各種系統(tǒng)當中,但是卻很少用于web互聯(lián)網應用。比如cdb、qdbm、bdb數(shù)據庫。
傳統(tǒng)關系數(shù)據庫的瓶頸
傳統(tǒng)的關系數(shù)據庫具有不錯的性能,高穩(wěn)定型,久經歷史考驗,而且使用簡單,功能強大,同時也積累了大量的成功案例。在互聯(lián)網領域,MySQL成為了絕對靠前的王者,毫不夸張的說,MySQL為互聯(lián)網的發(fā)展做出了卓越的貢獻。
在90年代,一個網站的訪問量一般都不大,用單個數(shù)據庫完全可以輕松應付。在那個時候,更多的都是靜態(tài)網頁,動態(tài)交互類型的網站不多。
到了最近10年,網站開始快速發(fā)展?;鸨恼搲?、博客、sns、微博逐漸引領web領域的潮流。在初期,論壇的流量其實也不大,如果你接觸網絡比較早,你可能還記得那個時候還有文本型存儲的論壇程序,可以想象一般的論壇的流量有多大。
Memcached+MySQL
后來,隨著訪問量的上升,幾乎大部分使用MySQL架構的網站在數(shù)據庫上都開始出現(xiàn)了性能問題,web程序不再僅僅專注在功能上,同時也在追求性能。程序員們開始大量的使用緩存技術來緩解數(shù)據庫的壓力,優(yōu)化數(shù)據庫的結構和索引。開始比較流行的是通過文件緩存來緩解數(shù)據庫壓力,但是當訪問量繼續(xù)增大的時候,多臺web機器通過文件緩存不能共享,大量的小文件緩存也帶了了比較高的IO壓力。在這個時候,Memcached就自然的成為一個非常時尚的技術產品。
Memcached作為一個獨立的分布式的緩存服務器,為多個web服務器提供了一個共享的高性能緩存服務,在Memcached服務器上,又發(fā)展了根據hash算法來進行多臺Memcached緩存服務的擴展,然后又出現(xiàn)了一致性hash來解決增加或減少緩存服務器導致重新hash帶來的大量緩存失效的弊端。當時,如果你去面試,你說你有Memcached經驗,肯定會加分的。
Mysql主從讀寫分離
由于數(shù)據庫的寫入壓力增加,Memcached只能緩解數(shù)據庫的讀取壓力。讀寫集中在一個數(shù)據庫上讓數(shù)據庫不堪重負,大部分網站開始使用主從復制技術來達到讀寫分離,以提高讀寫性能和讀庫的可擴展性。Mysql的master-slave模式成為這個時候的網站標配了。
分表分庫隨著web2.0的繼續(xù)高速發(fā)展,在Memcached的高速緩存,MySQL的主從復制,讀寫分離的基礎之上,這時MySQL主庫的寫壓力開始出現(xiàn)瓶頸,而數(shù)據量的持續(xù)猛增,由于MyISAM使用表鎖,在高并發(fā)下會出現(xiàn)嚴重的鎖問題,大量的高并發(fā)MySQL應用開始使用InnoDB引擎代替MyISAM。同時,開始流行使用分表分庫來緩解寫壓力和數(shù)據增長的擴展問題。這個時候,分表分庫成了一個熱門技術,是面試的熱門問題也是業(yè)界討論的熱門技術問題。也就在這個時候,MySQL推出了還不太穩(wěn)定的表分區(qū),這也給技術實力一般的公司帶來了希望。雖然MySQL推出了MySQL Cluster集群,但是由于在互聯(lián)網幾乎沒有成功案例,性能也不能滿足互聯(lián)網的要求,只是在高可靠性上提供了非常大的保證。
MySQL的擴展性瓶頸
在互聯(lián)網,大部分的MySQL都應該是IO密集型的,事實上,如果你的MySQL是個CPU密集型的話,那么很可能你的MySQL設計得有性能問題,需要優(yōu)化了。大數(shù)據量高并發(fā)環(huán)境下的MySQL應用開發(fā)越來越復雜,也越來越具有技術挑戰(zhàn)性。分表分庫的規(guī)則把握都是需要經驗的。雖然有像淘寶這樣技術實力強大的公司開發(fā)了透明的中間件層來屏蔽開發(fā)者的復雜性,但是避免不了整個架構的復雜性。分庫分表的子庫到一定階段又面臨擴展問題。還有就是需求的變更,可能又需要一種新的分庫方式。
MySQL數(shù)據庫也經常存儲一些大文本字段,導致數(shù)據庫表非常的大,在做數(shù)據庫恢復的時候就導致非常的慢,不容易快速恢復數(shù)據庫。比如1000萬4KB大小的文本就接近40GB的大小,如果能把這些數(shù)據從MySQL省去,MySQL將變得非常的小。
關系數(shù)據庫很強大,但是它并不能很好的應付所有的應用場景。MySQL的擴展性差(需要復雜的技術來實現(xiàn)),大數(shù)據下IO壓力大,表結構更改困難,正是當前使用MySQL的開發(fā)人員面臨的問題。
NOSQL的優(yōu)勢易擴展NoSQL數(shù)據庫種類繁多,但是一個共同的特點都是去掉關系數(shù)據庫的關系型特性。數(shù)據之間無關系,這樣就非常容易擴展。也無形之間,在架構的層面上帶來了可擴展的能力。
大數(shù)據量,高性能
NoSQL數(shù)據庫都具有非常高的讀寫性能,尤其在大數(shù)據量下,同樣表現(xiàn)優(yōu)秀。這得益于它的無關系性,數(shù)據庫的結構簡單。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,在針對web2.0的交互頻繁的應用,Cache性能不高。而NoSQL的Cache是記錄級的,是一種細粒度的Cache,所以NoSQL在這個層面上來說就要性能高很多了。
靈活的數(shù)據模型
NoSQL無需事先為要存儲的數(shù)據建立字段,隨時可以存儲自定義的數(shù)據格式。而在關系數(shù)據庫里,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據量的表,增加字段簡直就是一個噩夢。這點在大數(shù)據量的web2.0時代尤其明顯。
高可用NoSQL在不太影響性能的情況,就可以方便的實現(xiàn)高可用的架構。比如Cassandra,HBase模型,通過復制模型也能實現(xiàn)高可用。
總結NoSQL數(shù)據庫的出現(xiàn),彌補了關系數(shù)據(比如MySQL)在某些方面的不足,在某些方面能極大的節(jié)省開發(fā)成本和維護成本。
MySQL和NoSQL都有各自的特點和使用的應用場景,兩者的緊密結合將會給web2.0的數(shù)據庫發(fā)展帶來新的思路。