NoSQL數據庫的四大家族
NoSQL,泛指非關系型的數據庫,全稱Not Only SQL,意即“不僅僅是SQL”。
NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。在過去幾年,關系型數據庫一直是數據持久化的唯 一選擇,數據工作者考慮的也只是在這些傳統數據庫中做篩選,比如SQL Server、Oracle或者是MySQL。甚至是做一些默認的選擇,比如使用.NET的一般會選擇SQL Server;使用Java的可能會偏向Oracle,Ruby是MySQL,Python則是PostgreSQL或MySQL等等。
原因很簡單:過去很長一段時間內,關系數據庫的健壯性已經在多數應用程序中得到證實。我們可以使用這些傳統數據庫良好的控制并發操作、事務等等。然 而如果傳統的關系型數據庫一直這么可靠,那么還有NoSQL什么事?NoSQL之所以生存并得到發展,是因為它做到了傳統關系型數據庫做不到的事!
我們使用Python、Ruby、Java、.Net等語言編寫應用程序,這些語言有一個共同的特性——面向對象。但是我們使用MySQL、 PostgreSQL、Oracle以及SQL Server,這些數據庫同樣有一個共同的特性——關系型數據庫。這里就牽扯到了“Impedance Mismatch”( 阻抗不匹配)這個術語:存儲結構是面向對象的,但是數據庫卻是關系的,所以在每次存儲或者查詢數據時,我們都需要做轉換。Hibernate這樣的ORM 框架確實可以簡化這個過程,但是在對查詢有高性能需求時,這些ORM框架就捉襟見肘了。
網絡應用程序的規模日漸變大,我們需要儲存更多的數據、服務更多的用戶以及需求更多的計算能力。為了應對這種情形,我們需要不停的擴展。擴展分為兩 類:一種是縱向擴展,即購買更好的機器,更多的磁盤、更多的內存等等;另一種是橫向擴展,即購買更多的機器組成集群。在巨大的規模下,縱向擴展發揮的作用 并不是很大。首先單機器性能提升需要巨額的開銷并且有著性能的上限,在Google和非死book這種規模下,永遠不可能使用一臺機器支撐所有的負 載。鑒于這種情況,我們需要新的數據庫,因為關系數據庫并不能很好的運行在集群上。不錯你也可能會去搭建關系數據庫集群,但是他們使用的是共享存儲,這并 不是我們想要的類型。于是就有了以Google、非死book、Amazon這些試圖處理更多傳輸所引領的NoSQL紀元。
NoSQL數據庫在以下的這幾種情況下比較適用:
1、數據模型比較簡單;
2、需要靈活性更強的IT系統;
3、對數據庫性能要求較高;
4、不需要高度的數據一致性;
5、對于給定key,比較容易映射復雜值的環境。
NoSQL數據庫的四大家族
一、鍵值(Key-Value)數據庫
鍵值數據庫就像在傳統語言中使用的哈希表。你可以通過key來添加、查詢或者刪除數據,鑒于使用主鍵訪問,所以會獲得不錯的性能及擴展性。
鍵值數據庫查找速度快,數據無結構化,通常只被當作字符串或者二進制數據。
適用的場景
儲存用戶信息,比如會話、配置文件、參數、購物車等等。這些信息一般都和ID(鍵)掛鉤,這種情景下鍵值數據庫是個很好的選擇。
不適用場景
1. 取代通過鍵查詢,而是通過值來查詢。Key-Value數據庫中根本沒有通過值查詢的途徑。
2. 需要儲存數據之間的關系。在Key-Value數據庫中不能通過兩個或以上的鍵來關聯數據。
3. 事務的支持。在Key-Value數據庫中故障產生時不可以進行回滾。
產品:Riak、Redis、Memcached、Amazon’s Dynamo、Project Voldemort
-
Riak
Riak是以 Erlang 編寫的一個高度可擴展的分布式數據存儲,Riak的實現是基于Amazon的分布式key/value存儲引擎Dynamo,如圖1所示。
圖1
Riak的設計目標之一就是高可用。Riak支持多節點構建的系統,每次讀寫請求不需要集群內所有節點參與也能勝任。提供一個靈活的 map/reduce 引擎,一個友好的 HTTP/JSON 查詢接口。目前有三種方式可以訪問 Riak:HTTP API(RESTful 界面)、Protocol Buffers 和一個原生 Erlang 界面。提供多個界面使你能夠選擇如何集成應用程序。
riak-java-client 是 Riak 的 Java 客戶端開發類庫,示例代碼:
// create a client IRiakClient riakClient = RiakFactory.pbcClient(); //or RiakFactory.httpClient(); // create a new bucket Bucket myBucket = riakClient.createBucket("myBucket").execute(); // add data to the bucket myBucket.store("key1", "value1").execute(); //fetch it back IRiakObject myData = myBucket.fetch("key1").execute(); // you can specify extra parameters to the store operation using the // fluent builder style API myData = myBucket.store("key1", "value2").returnBody(true).execute(); // delete myBucket.delete("key1").rw(3).execute();
有誰在使用
GitHub,一個開源代碼庫以及版本控制系統,是管理軟件開發以及發現已有代碼的首選方法,在GitHub,用戶可以十分輕易地找到海量的開源代碼。
BestBuy,百思買集團(Best Buy),全球最大家用電器和電子產品零售集團。
-
Redis
Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。Redis支持存儲的value類型包括 string(字符串)、hash(散列)、list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add /remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。Redis數據都是緩存在 內存中,會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
Jedis 是 Redis 官方首選的 Java 客戶端開發包。
有誰在使用
推ter(Redis和Memcached),一家美國社交網絡及微博客服務的網站,是全球互聯網上訪問量最大的十個網站之一。是一個廣受歡迎的社交網絡及微博客服務的網站。
StackOverFlow,是一個與程序相關的IT技術問答網站。用戶可以在網站免費提交問題,瀏覽問題,索引相關內容。是程序員經常光顧的網站之一。
Instagram,是一款支持iOS、Windows Phone、Android平臺的移動應用,允許用戶在任何環境下抓拍下自己的生活記憶,選擇圖片的濾鏡樣式,一鍵分享至Instagram、 非死book、推ter、Flickr、Tumblr、foursquare或者新浪微博平臺上。不僅僅是拍照,作為一款輕量級但十分有趣的 App,Instagram 在移動端融入了很多社會化元素,包括好友關系的建立、回復、分享和收藏等,這是Instagram 作為服務存在而非應用存在最大的價值。
**Flick**r,雅虎旗下圖片分享網站。為一家提供免費及付費數位照片儲存、分享方案之線上服務,也提供網絡社群服務的平臺。其重要特點就是基于社 會網絡的人際關系的拓展與內容的組織。這個網站的功能之強大,已超出了一般的圖片服務,比如圖片服務、聯系人服務、組群服務。
暴雪,大名鼎鼎的游戲公司。
新浪、 街旁 、 知乎 等。
-
Memcached
Memcached 是一個基于一個存儲鍵/值對的高性能的分布式內存對象緩存系統,用于動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。
許多Web 應用程序都將數據保存到RDBMS中,應用服務器從中讀取數據并在瀏覽器中顯示。但隨著數據量的增大,訪問的集中,就會出現RDBMS的負擔加重,數據庫 響應惡化,網站顯示延遲等重大影響。Memcached是高性能的分布式內存緩存服務器。一般的使用目的是通過緩存數據庫查詢結果,減少數據庫的訪問次 數,以提高動態Web 應用的速度、提高擴展性。如圖2所示。
圖2Memcached-Java-Client 是一個memcached Java客戶端API,應用廣泛,運行比較穩定。XMemcached也使用得比較廣泛,而且有較詳細的中文API文檔,具有如下特點:高性 能、支持完整的協議、支持客戶端分布、允許設置節點權重、動態增刪節點、支持JMX、與Spring框架和Hibernate-memcached的集 成、客戶端連接池、可擴展性好等。
有誰在使用
推ter(Redis和Memcached)
油Tube,世界上最大的視頻網站。
Wikipedia,維基百科是一個基于維基技術的多語言百科全書協作計劃,用多種語言編寫的網絡百科全書。
WordPress.com,WordPress是一款個人博客系統,并逐步演化成一款內容管理系統軟件,用戶可以在支持PHP和MySQL數據庫的服務器上架設屬于自己的網站,也可以把 WordPress當作一個內容管理系統(CMS)來使用。
二、面向文檔(Document-Oriented)數據庫
面向文檔數據庫會將數據以文檔的形式儲存。每個文檔都是自包含的數據單元,是一系列數據項的集合。每個數據項都有一個名稱與對應的值,值既可以是簡 單的數據類型,如字符串、數字和日期等;也可以是復雜的類型,如有序列表和關聯對象。數據存儲的最小單位是文檔,同一個表中存儲的文檔屬性可以是不同的, 數據可以使用XML、JSON或者JSONB等多種形式存儲。
數據結構要求不嚴格,表結構可變,不需要像關系型數據庫一樣需要預先定義表結構,但是查詢性能不高,而且缺乏統一的查詢語法。
適用的場景
1. 日志。企業環境下,每個應用程序都有不同的日志信息。Document-Oriented數據庫并沒有固定的模式,所以我們可以使用它儲存不同的信息。
2. 分析。鑒于它的弱模式結構,不改變模式下就可以儲存不同的度量方法及添加新的度量。
不適用場景
在不同的文檔上添加事務。Document-Oriented數據庫并不支持文檔間的事務,如果對這方面有需求則不應該選用這個解決方案。
產品:MongoDB、CouchDB、RavenDB、Terrastore 、OrientDB
-
MongoDB
MongoDB是一個基于分布式文件存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。是一個介于關系數據庫和非關 系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。它支持的數據結構非常松散,是類似json的bson格式,因此可以存儲比較復雜 的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功 能,而且還支持對數據建立索引。
mongoDB對Java支持的驅動包常用的是mongodb-java-driver,另外還有Mopa4j ,全稱是 MOngo Persistence API for Java,它將 POJO 映射到 com.mongodb.DBObject,反之也可以。
有誰在使用
Craiglist上使用MongoDB的存檔數十億條記錄。
FourSquare,基于位置的社交網站,在Amazon EC2的服務器上使用MongoDB分享數據。
Shutterfly,以互聯網為基礎的社會和個人出版服務,使用MongoDB的各種持久性數據存儲的要求。
bit.ly, 一個基于Web的網址縮短服務,使用MongoDB的存儲自己的數據。
spike.com,一個MTV網絡的聯營公司, spike.com使用MongoDB的。
Intuit公司,一個為小企業和個人的軟件和服務提供商,為小型企業使用MongoDB的跟蹤用戶的數據。
sourceforge.net,資源網站查找,創建和發布開源軟件免費,使用MongoDB的后端存儲。
etsy.com,一個購買和出售手工制作物品網站,使用MongoDB。
紐約時報,領先的在線新聞門戶網站之一,使用MongoDB。
CERN,著名的粒子物理研究所,歐洲核子研究中心大型強子對撞機的數據使用MongoDB。
-
CouchDB
CouchDB 是一個開源的面向文檔的數據庫管理系統,它提供以 JSON 作為數據格式的 REST 接口來對其進行操作,并可以通過視圖來操縱文檔的組織和呈現。術語 “Couch” 是 “Cluster Of Unreliable Commodity Hardware” 的首字母縮寫,它反映了 CouchDB 的目標具有高度可伸縮性,提供了高可用性和高可靠性,即使運行在容易出現故障的硬件上也是如此。
CouchDB是分布式的數據庫,它可以把存儲系統分布到n臺物理的節點上面,并且很好的協調和同步節點之間的數據讀寫一致性。這當然也得靠Erlang 無與倫比的并發特性才能做到。對于基于web的大規模應用文檔應用,分布式可以讓它不必像傳統的關系數據庫那樣分庫拆表,在應用代碼層進行大量的改動。
CouchDB是面向文檔的數據庫,存儲半結構化的數據,比較類似lucene的index結構,特別適合存儲文檔,因此很適合CMS,電話本,地址本等應用,在這些應用場合,文檔數據庫要比關系數據庫更加方便,性能更好。
CouchDB支持REST API,可以讓用戶使用JavaScript來操作CouchDB數據庫,也可以用JavaScript編寫查詢語句,我們可以想像一下,用AJAX技術結合CouchDB開發出來的CMS系統會是多么的簡單和方便。
CouchDB 的 JDBC 驅動程序是jcouchdb ,這是一個經過良好測試并且易于使用的Java庫,它會自動地將Java對象序列化、反序列化進CouchDB數據庫。選擇jcouchdb的另一個原因是它和CouchDB自身的API非常相似。 -
RavenDB
RavenDB是基于Windows/.NET平臺的NoSQL數據庫,支持Linq的開源文檔數據庫,旨在Window平臺下提供一個高性能,結構簡單,靈活,可擴展NoSQL存儲。Raven將JSON文檔存在數據庫中。可以使用C#的Linq語法查詢數據。
NBC News,美國國家廣播公司使用了RavenDB。 -
Terrastore
Terrastore 是一個基于Terracotta(一 個業界公認的、快速的分布式集群組件)實現的高性能分布式文檔數據庫。可以動態從運行中的集群添 加/刪除節點,而且不需要停機和修改任何配置。支持通過http協議訪問Terrastore。Terrastore提供了一個基于集合的鍵/值接口來管 理JSON文檔并且不需要預先定義JSON文檔的架構。易于操作,安裝一個完整能夠運行的集群只需幾行命令。 -
OrientDB
OrientDB 是兼具文擋數據庫的靈活性和圖形數據庫管理鏈接 能力的可深層次擴展的文檔-圖形數據庫管理系統。可選無模式、全模式或混合模式下。支持許 多高級特性,諸如ACID事務、快速索引,原生和SQL查詢功能。可以JSON格式導入、導出文檔。若不執行昂貴的JOIN操作的話,如同關系數據庫可在 幾毫秒內可檢索數以百記的鏈接文檔圖。
三、 列存儲(Wide Column Store/Column-Family)數據庫
列存儲數據庫將數據儲存在列族(column family)中,一個列族存儲經常被一起查詢的相關數據。舉個例子,如果我們有一個Person類,我們通常會一起查詢他們的姓名和年齡而不是薪資。這種情況下,姓名和年齡就會被放入一個列族中,而薪資則在另一個列族中。
列存儲查找速度快,可擴展性強,更容易進行分布式擴展,適用于分布式的文件系統。
適用的場景
1. 日志。因為我們可以將數據儲存在不同的列中,每個應用程序可以將信息寫入自己的列族中。
2. 博客平臺。我們儲存每個信息到不同的列族中。舉個例子,標簽可以儲存在一個,類別可以在一個,而文章則在另一個。
不適用場景
1. 如果我們需要ACID事務。Vassandra就不支持事務。
2. 原型設計。如果我們分析Cassandra的數據結構,我們就會發現結構是基于我們期望的數據查詢方式而定。在模型設計之初,我們根本不可能去預測它的查詢方式,而一旦查詢方式改變,我們就必須重新設計列族。
產品:Cassandra、HBase
-
Cassandra
Cassandra是一套開源分布式NoSQL數據庫系統,是一個混合型的非關系的數據庫,以Amazon專有的完全分布式的Dynamo為基礎,結合了 Google BigTable基于列族(Column Family)的數據模型。Cassandra的主要特點就是它不是一個數據庫,而是由一堆數據庫節點共同構成的一個分布式網絡服務,對 Cassandra 的一個寫操作,會被復制到其他節點上去,對Cassandra的讀操作,也會被路由到某個節點上面去讀取。對于一個Cassandra群集來說,擴展性能 是比較簡單的事情,只管在群集里面添加節點就可以了。和其他數據庫比較,有三個突出特點:模式靈活、可擴展性、多數據中心。
使用官方java驅動操作cassandra 非常簡單。
有誰在使用
Ebay,(EBAY,中文電子灣、億貝、易貝)是一個管理可讓全球民眾上網買賣物品的線上拍賣及購物網站。
Instagram,是一款支持iOS、Windows Phone、Android平臺的移動應用,允許用戶在任何環境下抓拍下自己的生活記憶,選擇圖片的濾鏡樣式,一鍵分享至Instagram、 非死book、推ter、Flickr、Tumblr、foursquare或者新浪微博平臺上。
NASA,如雷貫耳,美國國家航空航天局。
推ter,(Cassandra and HBase)全世界都非常流行的社交網絡及微博客服務的網站。
-
HBase
HBase,Hadoop Database,是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集群。HBase是Apache的Hadoop項目的子項目。HBase不同于一般的關系數據庫,它是一個適合于非 結構化數據存儲的數據庫。另一個不同的是HBase基于列的而不是基于行的模式。Apache三劍客:HBase, Cassandra, CouchDB,HBase的前景最為看好,因為它的開發者眾多并且都是頂尖高手。
圖3描述Hadoop EcoSystem中的各層系統。其中,HBase位于結構化存儲層,Hadoop HDFS為HBase提供了高可靠性的底層存儲支持,Hadoop MapReduce為HBase提供了高性能的計算能力,Zookeeper為HBase提供了穩定服務和failover機制。Pig和Hive還為 HBase提供了高層語言支持,使得在HBase上進行數據統計處理變的非常簡單。 Sqoop則為HBase提供了方便的RDBMS數據導入功能,使得傳統數據庫數據向HBase中遷移變的非常方便。
圖3
HBase提供的訪問接口有:
1. Native Java API,最常規和高效的訪問方式,適合Hadoop MapReduce Job并行批處理HBase表數據
2. HBase Shell,HBase的命令行工具,最簡單的接口,適合HBase管理使用
3. Thrift Gateway,利用Thrift序列化技術,支持C++,PHP,Python等多種語言,適合其他異構系統在線訪問HBase表數據
4. REST Gateway,支持REST 風格的Http API訪問HBase, 解除了語言限制
5. Pig,可以使用Pig Latin流式編程語言來操作HBase中的數據,和Hive類似,本質最終也是編譯成MapReduce Job來處理HBase表數據,適合做數據統計
6. Hive,支持HBase,可以使用類似SQL語言來訪問HBase
有誰在使用
推ter,全世界都非常流行的社交網絡及微博客服務的網站。
非死book,美國的一個社交網絡服務網站。
Yahoo!,美國著名的互聯網門戶網站,也是20世紀末互聯網奇跡的創造者之一。其服務包括搜索引擎、電郵、新聞等,業務遍及24個國家和地區,為全球超過5億的獨立用戶提供多元化的網絡服務。同時也是一家全球性的因特網通訊、商貿及媒體公司。
四、 圖(Graph-Oriented)數據庫
圖數據庫允許我們將數據以圖的方式儲存。實體會被作為頂點,而實體之間的關系則會被作為邊。比如我們有三個實體,Steve Jobs、Apple和Next,則會有兩個“Founded by”的邊將Apple和Next連接到Steve Jobs。
主要用于社交網絡,推薦系統等。專注于構建關系圖譜。
適用的場景
1. 在一些關系性強的數據中
2. 推薦引擎。如果我們將數據以圖的形式表現,那么將會非常有益于推薦的制定
不適用場景
不適合的數據模型。圖數據庫的適用范圍很小,因為很少有操作涉及到整個圖。
產品:Neo4J、Infinite Graph、OrientDB
-
Neo4J
Neo4J是一個高性能的,NOSQL圖形數據庫,它將結構化數據存儲在網絡上而不是表中。它是一個嵌入式的、基于磁盤的、具備完全的事務特性的Java 持久化引擎,但是它將結構化數據存儲在網絡(從數學角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數據庫的所有 特性。程序員工作在一個面向對象的、靈活的網絡結構下而不是嚴格、靜態的表中——但是他們可以享受到具備完全的事務特性、企業級的數據庫的所有好處。它的 架構圖如圖4所示。
圖4
neo4j連接java目前主要有嵌入式、jdbc和rest api。
有誰在使用
Adobe,是世界領先數字媒體和在線營銷方案的供應商,Adobe 的客戶包括世界各地的企業、知識工作者、創意人士和設計者、OEM 合作伙伴,以及開發人員。
Cisco,全球領先的網絡解決方案供應商。
T-Mobile,是一家跨國移動電話運營商,是世界上最大的移動電話公司之一。
-
Infinite Graph
InfiniteGraph企業分布式圖形數據庫具有可伸縮性,它還能夠在大量多地存儲的復雜數據中,為大型企業執行實時搜索。通過使用圖算法,它為分析應用程序添加了新的價值,以發現和存儲新的連接和關系。
InfiniteGraph需要作為服務項目加以安裝,這與以MySQL為代表的傳統數據庫頗為相似。InfiniteGraph借鑒了 Objectivity/DB中的面向對象概念,因此其中的每一個節點及邊線都算作一個對象。InfiniteGraph還提供了一套可視化工具用以查看 數據。
InfiniteGraph基于Java實現,它的目標是構建“分布式的圖形數據庫”,已被美國國防部和美國中央情報局所采用。
Redis介紹
目前主流的NoSQL數據庫,基于鍵值的Redis占一席之地,它功能豐富,交互簡單,適用場景多。
Redis,全稱Remote Dictionary Server,遠程字典服務器, Redis是一個開源的、高性能的、基于鍵值對的緩存與存儲系統,通過提供多種鍵值數據類型來適應不同場景下的緩存與存儲需求。它以字典結構存儲數據,并 允許其他應用通過TCP協議讀寫字典中的內容。
Redis數據庫中的數據是保存在內存中的,因此它的性能比基于硬盤存儲的數據庫有明顯的優勢,同時redis提供了對持久化的支持,可以將內存中的數據異步寫入到硬盤中。
即使不采取redis作為應用數據庫,選擇redis作為緩存、隊列系統,也是一個不錯的選擇。
Redis目前支持的鍵值數據類型如下:
字符串類型(string)
散列類型(hash)
列表類型(list)
集合類型(set)
有序集合類型(zset/sorted_set)
一個Redis實例相當于一格書架,書架里有16本字典(獨立數據庫),默認從0開始編號,查找最后一本字典的命令是select 15,通過select number可以自由切換數據庫,這16個庫并非完全隔離,某些命令可以通用,同時redis不支持自定義數據庫名和訪問密碼,所有16個庫的訪問權限是 一致的。區別于oracle的實例,所以不同的應用應該使用不同的redis實例。
來自:http://www.techug.com/nosql