非常榮幸能受邀在InfoQ開辟這樣一個關于NoSQL的專欄,InfoQ是我非常尊重的一家技術媒體,同時我也希望借助InfoQ,在國內(nèi)推動NoSQL的發(fā)展,希望跟我一樣有興趣的朋友加入進來。這次的NoSQL專欄系列將先整體介紹NoSQL,然后介紹如何把NoSQL運用到自己的項目中合適的場景中,還會適當?shù)胤治鲆恍┏晒Π咐?,希望有成功使用NoSQL經(jīng)驗的朋友給我提供一些線索和信息。 NoSQL概念隨著web2.0的快速發(fā)展,非關系型、分布式數(shù)據(jù)存儲得到了快速的發(fā)展,它們不保證關系數(shù)據(jù)的ACID特性。NoSQL概念在2009年被提了出來。NoSQL最常見的解釋是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一詞最早于1998年被用于一個輕量級的關系數(shù)據(jù)庫的名字。) NoSQL被我們用得最多的當數(shù)key-value存儲,當然還有其他的文檔型的、列存儲、圖型數(shù)據(jù)庫、xml數(shù)據(jù)庫等。在NoSQL概念提出之前,這些數(shù)據(jù)庫就被用于各種系統(tǒng)當中,但是卻很少用于web互聯(lián)網(wǎng)應用。比如cdb、qdbm、bdb數(shù)據(jù)庫。 傳統(tǒng)關系數(shù)據(jù)庫的瓶頸 傳統(tǒng)的關系數(shù)據(jù)庫具有不錯的性能,高穩(wěn)定型,久經(jīng)歷史考驗,而且使用簡單,功能強大,同時也積累了大量的成功案例。在互聯(lián)網(wǎng)領域,MySQL成為了絕對靠前的王者,毫不夸張的說,MySQL為互聯(lián)網(wǎng)的發(fā)展做出了卓越的貢獻。 在90年代,一個網(wǎng)站的訪問量一般都不大,用單個數(shù)據(jù)庫完全可以輕松應付。在那個時候,更多的都是靜態(tài)網(wǎng)頁,動態(tài)交互類型的網(wǎng)站不多。 到了最近10年,網(wǎng)站開始快速發(fā)展。火爆的論壇、博客、sns、微博逐漸引領web領域的潮流。在初期,論壇的流量其實也不大,如果你接觸網(wǎng)絡比較早,你可能還記得那個時候還有文本型存儲的論壇程序,可以想象一般的論壇的流量有多大。 Memcached+MySQL 后來,隨著訪問量的上升,幾乎大部分使用MySQL架構的網(wǎng)站在數(shù)據(jù)庫上都開始出現(xiàn)了性能問題,web程序不再僅僅專注在功能上,同時也在追求性能。程序員們開始大量的使用緩存技術來緩解數(shù)據(jù)庫的壓力,優(yōu)化數(shù)據(jù)庫的結構和索引。開始比較流行的是通過文件緩存來緩解數(shù)據(jù)庫壓力,但是當訪問量繼續(xù)增大的時候,多臺web機器通過文件緩存不能共享,大量的小文件緩存也帶了了比較高的IO壓力。在這個時候,Memcached就自然的成為一個非常時尚的技術產(chǎn)品。 Memcached作為一個獨立的分布式的緩存服務器,為多個web服務器提供了一個共享的高性能緩存服務,在Memcached服務器上,又發(fā)展了根據(jù)hash算法來進行多臺Memcached緩存服務的擴展,然后又出現(xiàn)了一致性hash來解決增加或減少緩存服務器導致重新hash帶來的大量緩存失效的弊端。當時,如果你去面試,你說你有Memcached經(jīng)驗,肯定會加分的。 Mysql主從讀寫分離 由于數(shù)據(jù)庫的寫入壓力增加,Memcached只能緩解數(shù)據(jù)庫的讀取壓力。讀寫集中在一個數(shù)據(jù)庫上讓數(shù)據(jù)庫不堪重負,大部分網(wǎng)站開始使用主從復制技術來達到讀寫分離,以提高讀寫性能和讀庫的可擴展性。Mysql的master-slave模式成為這個時候的網(wǎng)站標配了。 分表分庫隨著web2.0的繼續(xù)高速發(fā)展,在Memcached的高速緩存,MySQL的主從復制,讀寫分離的基礎之上,這時MySQL主庫的寫壓力開始出現(xiàn)瓶頸,而數(shù)據(jù)量的持續(xù)猛增,由于MyISAM使用表鎖,在高并發(fā)下會出現(xiàn)嚴重的鎖問題,大量的高并發(fā)MySQL應用開始使用InnoDB引擎代替MyISAM。同時,開始流行使用分表分庫來緩解寫壓力和數(shù)據(jù)增長的擴展問題。這個時候,分表分庫成了一個熱門技術,是面試的熱門問題也是業(yè)界討論的熱門技術問題。也就在這個時候,MySQL推出了還不太穩(wěn)定的表分區(qū),這也給技術實力一般的公司帶來了希望。雖然MySQL推出了MySQL Cluster集群,但是由于在互聯(lián)網(wǎng)幾乎沒有成功案例,性能也不能滿足互聯(lián)網(wǎng)的要求,只是在高可靠性上提供了非常大的保證。 MySQL的擴展性瓶頸 在互聯(lián)網(wǎng),大部分的MySQL都應該是IO密集型的,事實上,如果你的MySQL是個CPU密集型的話,那么很可能你的MySQL設計得有性能問題,需要優(yōu)化了。大數(shù)據(jù)量高并發(fā)環(huán)境下的MySQL應用開發(fā)越來越復雜,也越來越具有技術挑戰(zhàn)性。分表分庫的規(guī)則把握都是需要經(jīng)驗的。雖然有像淘寶這樣技術實力強大的公司開發(fā)了透明的中間件層來屏蔽開發(fā)者的復雜性,但是避免不了整個架構的復雜性。分庫分表的子庫到一定階段又面臨擴展問題。還有就是需求的變更,可能又需要一種新的分庫方式。 MySQL數(shù)據(jù)庫也經(jīng)常存儲一些大文本字段,導致數(shù)據(jù)庫表非常的大,在做數(shù)據(jù)庫恢復的時候就導致非常的慢,不容易快速恢復數(shù)據(jù)庫。比如1000萬4KB大小的文本就接近40GB的大小,如果能把這些數(shù)據(jù)從MySQL省去,MySQL將變得非常的小。 關系數(shù)據(jù)庫很強大,但是它并不能很好的應付所有的應用場景。MySQL的擴展性差(需要復雜的技術來實現(xiàn)),大數(shù)據(jù)下IO壓力大,表結構更改困難,正是當前使用MySQL的開發(fā)人員面臨的問題。 NOSQL的優(yōu)勢易擴展NoSQL數(shù)據(jù)庫種類繁多,但是一個共同的特點都是去掉關系數(shù)據(jù)庫的關系型特性。數(shù)據(jù)之間無關系,這樣就非常容易擴展。也無形之間,在架構的層面上帶來了可擴展的能力。 大數(shù)據(jù)量,高性能 NoSQL數(shù)據(jù)庫都具有非常高的讀寫性能,尤其在大數(shù)據(jù)量下,同樣表現(xiàn)優(yōu)秀。這得益于它的無關系性,數(shù)據(jù)庫的結構簡單。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,在針對web2.0的交互頻繁的應用,Cache性能不高。而NoSQL的Cache是記錄級的,是一種細粒度的Cache,所以NoSQL在這個層面上來說就要性能高很多了。 靈活的數(shù)據(jù)模型 NoSQL無需事先為要存儲的數(shù)據(jù)建立字段,隨時可以存儲自定義的數(shù)據(jù)格式。而在關系數(shù)據(jù)庫里,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表,增加字段簡直就是一個噩夢。這點在大數(shù)據(jù)量的web2.0時代尤其明顯。 高可用NoSQL在不太影響性能的情況,就可以方便的實現(xiàn)高可用的架構。比如Cassandra,HBase模型,通過復制模型也能實現(xiàn)高可用。 總結NoSQL數(shù)據(jù)庫的出現(xiàn),彌補了關系數(shù)據(jù)(比如MySQL)在某些方面的不足,在某些方面能極大的節(jié)省開發(fā)成本和維護成本。 MySQL和NoSQL都有各自的特點和使用的應用場景,兩者的緊密結合將會給web2.0的數(shù)據(jù)庫發(fā)展帶來新的思路。讓關系數(shù)據(jù)庫關注在關系上,NoSQL關注在存儲上。
創(chuàng)新互聯(lián)成立以來不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術為基點,以客戶需求中心、市場為導向”的快速反應體系。對公司的主營項目,如中高端企業(yè)網(wǎng)站企劃 / 設計、行業(yè) / 企業(yè)門戶設計推廣、行業(yè)門戶平臺運營、成都app軟件開發(fā)、手機網(wǎng)站制作設計、微信網(wǎng)站制作、軟件開發(fā)、托管服務器等實行標準化操作,讓客戶可以直觀的預知到從創(chuàng)新互聯(lián)可以獲得的服務效果。
互聯(lián)網(wǎng)公司常用的基本集中在以下幾種,每種只舉一個比較常見或者應用比較成功的例子吧。
1. In-Memory KV Store : Redis
in memory key-value store,同時提供了更加豐富的數(shù)據(jù)結構和運算的能力,成功用法是替代memcached,通過checkpoint和commit log提供了快速的宕機恢復,同時支持replication提供讀可擴展和高可用。
2. Disk-Based KV Store: Leveldb
真正基于磁盤的key-value storage, 模型單一簡單,數(shù)據(jù)量不受限于內(nèi)存大小,數(shù)據(jù)落盤高可靠,Google的幾位大神出品的精品,LSM模型天然寫優(yōu)化,順序?qū)懕P的方式對于新硬件ssd再適合不過了,不足是僅提供了一個庫,需要自己封裝server端。
3. Document Store: Mongodb
分布式nosql,具備了區(qū)別mysql的最大亮點:可擴展性。mongodb 最新引人的莫過于提供了sql接口,是目前nosql里最像mysql的,只是沒有ACID的特性,發(fā)展很快,支持了索引等特性,上手容易,對于數(shù)據(jù)量遠超內(nèi)存限制的場景來說,還需要慎重。
4. Column Table Store: HBase
這個富二代似乎不用贅述了,最大的優(yōu)勢是開源,對于普通的scan和基于行的get等基本查詢,性能完全不是問題,只是只提供裸的api,易用性上是短板,可擴展性方面是最強的,其次坐上了Hadoop的快車,社區(qū)發(fā)展很快,各種基于其上的開源產(chǎn)品不少,來解決諸如join、聚集運算等復雜查詢。
像MongoDB, Cassandra, HBase, DynamoDB, 和
Riak這些NoSQL缺乏傳統(tǒng)的原子事務機制,所謂原子事務機制是可以保證一系列寫操作要么全部完成,要么全部不會完成,不會發(fā)生只完成一系列中一兩個
寫操作;因為數(shù)據(jù)庫不提供這種事務機制支持,開發(fā)者需要自己編寫代碼來確保一系列寫操作的事務機制,比較復雜和測試。
這些NoSQL數(shù)據(jù)庫不提供事務機制原因在于其分布式特點,一系列寫操作中訪問的數(shù)據(jù)可能位于不同的分區(qū)服務器,這樣的事務就變成分布式事務,在分
布式事務中實現(xiàn)原子性需要彼此協(xié)調(diào),而協(xié)調(diào)是耗費時間的,每臺機器在一個大事務過程中必須依次確認,這就需要一種協(xié)議確保一個事務中沒有任何一臺機器寫操
作失敗。
這種協(xié)調(diào)是昂貴的,會增加延遲時間,關鍵問題是,當協(xié)調(diào)沒有完成時,其他操作是不能讀取事務中寫操作結果的,這是因為事務的all-or-
nothing原理導致,萬一協(xié)調(diào)過程發(fā)現(xiàn)某個寫操作不能完成,那么需要將其他寫操作成功的進行回滾。針對分布式事務的分布式協(xié)調(diào)對整體數(shù)據(jù)庫性能有嚴重
影響,不只是吞吐量還包括延遲時間,這樣大部分NoSQL數(shù)據(jù)庫因為性能問題就選擇不提供分布式事務。
MongoDB, Riak, HBase, 和 Cassandra提供基于單一鍵的事務,這是因為所有信息都和一個鍵key有關,這個鍵是存儲在單個服務器上,這樣基于單鍵的事務不會帶來復雜的分布式協(xié)調(diào)。
那么看來擴展性性能和分布式事務是一對矛盾,總要有取舍?實際上是不完全是,現(xiàn)在完全有可能提供高擴展的性能同時提供分布式原子事務。
FIT是這樣一個在分布式系統(tǒng)提供原子事務的策略,在fairness公平性, isolation隔離性, 和throughput吞吐量(簡稱FIT)可以權衡。
一個支持分布式事務的可伸縮分布式系統(tǒng)能夠完成這三個屬性中兩個,公平是事務之間不會相互影響造成延遲;隔離性提供一種幻覺好像整個數(shù)據(jù)庫只有它自
己一個事務,隔離性保證當任何同時發(fā)生的事務發(fā)生沖突時,能夠保證彼此能看到彼此的寫操作結果,因此減輕了程序員為避免事務讀寫沖突的強邏輯推理要求;吞
吐量是指每單元時間數(shù)據(jù)庫能夠并發(fā)處理多少事務。
FIT是如下進行權衡:
保證公平性fairness 和隔離性isolation, 但是犧牲吞吐量
保證公平性fairness和吞吐量, 犧牲隔離性isolation
保證隔離性isolation和吞吐量throughput, 但是犧牲公平性fairness.
犧牲公平性:放棄公平性,數(shù)據(jù)庫能有更多機會降低分布式事務的成本,主要成本是分布式協(xié)調(diào)帶來的,也就是說,不需要在每個事務過程內(nèi)對每個機器都依
次確認事務完成,這樣排隊式的確認commit事務是很浪費時間的,放棄公平性,意味著可以在事務外面進行協(xié)調(diào),這樣就只是增加了協(xié)調(diào)時間,不會增加互相
沖突事務因為彼此沖突而不能運行所耽擱的時間,當系統(tǒng)不需要公平性時,需要根據(jù)事務的優(yōu)先級或延遲等標準進行指定先后執(zhí)行順序,這樣就能夠獲得很好的吞吐
量。
G-Store是一種放棄公平性的 Isolation-Throughput
的分布式key-value存儲,支持多鍵事務(multi-key transactions),MongoDB 和
HBase在鍵key在同樣分區(qū)上也支持多鍵事務,但是不支持跨分區(qū)的事務。
總之:傳統(tǒng)分布式事務性能不佳的原因是確保原子性(分布式協(xié)調(diào))和隔離性同時重疊,創(chuàng)建一個高吞吐量分布式事務的關鍵是分離這兩種關注,這種分離原
子性和隔離性的視角將導致兩種類型的系統(tǒng),第一種選擇是弱隔離性能讓沖突事務并行執(zhí)行和確認提交;第二個選擇重新排序原子性和隔離性機制保證它們不會某個
時間重疊,這是一種放棄公平的事務執(zhí)行,所謂放棄公平就是不再同時照顧原子性和隔離性了,有所傾斜,放棄高標準道德要求就會帶來高自由高效率。
nosql數(shù)據(jù)庫的四種類型如下:
1.key-value鍵值存儲數(shù)據(jù)庫:
相關產(chǎn)品: Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached.
主要應用: 內(nèi)容緩存,處理大量數(shù)據(jù)的高負載訪問,也用于系統(tǒng)日志。
優(yōu)點:查找速度快,大量操作時性能高。
2.列存儲數(shù)據(jù)庫:
相關產(chǎn)品: BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS.
主要應用: 分布式數(shù)據(jù)的儲存與管理。
優(yōu)點:查找速度快,可擴展性強,容易進行分布式擴展。
缺點:功能相對局限。
3.文檔型數(shù)據(jù)庫
相關產(chǎn)品:MongoDB、CouchDB、ThruDB、CloudKit、Perservere、Jackrabbit.
主要應用: web應用,管理面向文檔的數(shù)據(jù)或者類似的半結構化數(shù)據(jù)。
優(yōu)點:數(shù)據(jù)結構靈活,表結構可變,復雜性低。
缺點:查詢效率低,且缺乏統(tǒng)一的查詢語言。
4.Graph圖形數(shù)據(jù)庫
相關產(chǎn)品: Neo4J、OrientDB、InfoGrid、GraphDB.
主要應用: 復雜,互連接,低結構化的圖結構場合, 專注構建關系圖譜。
優(yōu)點: 利用圖結構相關算法, 可用于構建復雜的關系圖譜。
缺點: 復雜度高。
提及數(shù)據(jù)庫類型,人們先想到的是SQL,不過隨著大規(guī)模數(shù)據(jù)集合多重數(shù)據(jù)種類帶來的挑戰(zhàn),NoSQL應運而生。專業(yè)人士分析,隨著云計算、物聯(lián)網(wǎng)以及大數(shù)據(jù)的進一步發(fā)展,NewSQL將成為未來數(shù)據(jù)庫的主角。
SQL
SQL是Structured Query Language(結構化查詢語言)的縮寫,是傳統(tǒng)的關系型數(shù)據(jù)庫、數(shù)據(jù)庫領域主流模型,經(jīng)典應用在金融和電信行業(yè),確保數(shù)據(jù)庫的數(shù)據(jù)不會出錯和丟失。而SQL是專為數(shù)據(jù)庫而建立的操作命令集,是一種功能齊全的數(shù)據(jù)庫語言。SQL功能強大、簡單易學、使用方便,已經(jīng)成為了數(shù)據(jù)庫操作的基礎,并且現(xiàn)在幾乎所有的數(shù)據(jù)庫均支持SQL。
NoSQL
NoSQL泛指非關系型的數(shù)據(jù)庫,它的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重數(shù)據(jù)種類帶來的挑戰(zhàn),尤其是大數(shù)據(jù)應用難題。NoSQL的強項是特別適合處理大量分布式數(shù)據(jù),與傳統(tǒng)的關系型數(shù)據(jù)庫相比,NoSQL數(shù)據(jù)庫為軟件開發(fā)人員及其他用戶提供了更快的速度和更高的靈活性。目前在市場上有超過24個開源和商業(yè)NoSQL數(shù)據(jù)庫。
NewSQL
NewSQL是指一類新式的關系型數(shù)據(jù)庫系統(tǒng),針對OLTP(讀-寫)工作負載,追求提供和NoSQL系統(tǒng)相同的擴展性能,且仍然保持ACID和SQL等特性。對企業(yè)而言,使用NewSQL不僅免去傳統(tǒng)數(shù)據(jù)倉庫的ETL過程,降低存儲成本的同時極大的縮短數(shù)據(jù)分析的延遲,使得實時分析決策系統(tǒng)成為可能。
MySQL
優(yōu)點:
體積小、速度快、總體擁有成本低,開源;
支持多種操作系統(tǒng);
是開源數(shù)據(jù)庫,提供的接口支持多種語言連接操作 ;
SqlServer
優(yōu)點:
易用性、適合分布式組織的可伸縮性、用于決策支持的數(shù)據(jù)倉庫功能、與許多其他服務器軟件緊密關聯(lián)的集成性、良好的性價比等;
Oracle
優(yōu)點:
開放性: Oracle 能所有主流平臺上運行(包括 windows)完全支持所有工業(yè)標準采用完全開放策略使客戶選擇適合解決方案對開發(fā)商全力支持。
可伸縮性,并行性:oracle 并行服務器通過使組結點共享同簇工作來擴展windownt能力提供高用性和高伸縮性簇解決方案windowsNT能滿足需要用戶把數(shù)據(jù)庫移UNIXOracle并行服務器對各種UNIX平臺集群機制都有著相當高集成度。
以上我的回答希望對你有所幫助