影像數據庫調研

參考Paul Graham比較各種編程語言的方法,我們比較各種數據庫的特點如下:

Oracle: 我們需要企業級數據庫。

MySQL: Oracle不開源。

PostgreSQL: MySQL的功能不夠多。

SQLite: 你可以把我嵌入到任何地方。這樣,4種數據庫夠大家用了。

MongoDB: 為什么我們要用join和模式(schema)?

CouchDB: 為什么我們要有集合(collection)?

Redis: 為什么我們要面向文檔?

Memcached: 為什么我們要用硬盤?

Neo4j: SQL缺乏足夠的關系。

Bigtable: MongoDB的對web的擴展性不管好。

Hbase: Bigtable不開源。

Cassandra: Bigtable不是Facebook開發的。

Riak: Cassandra不是用Erlang語言編寫的。

OrientDB: 讓我們把所有東西都放到同一個數據庫里!

?

下面看看各種數據庫的特點,或許會更清楚其中的幽默~

?

一、滿足極高讀寫性能需求的Kye-Value數據庫:Redis,Tokyo Cabinet,levelDB

Redis
Redis是一個很新的項目,剛剛發布了1.0版本。Redis本質上是一個Key-Value類型的內存數據庫,很像memcached,整個 數據庫統統加載在內存當中進行操作,定期通過異步操作把數據庫數據flush到硬盤上進行保存。因為是純內存操作,Redis的性能非常出色,每秒可以處 理超過10萬次讀寫操作,是我知道的性能最快的Key-Value DB。

Redis的出色之處不僅僅是性能,Redis最大的魅力是支持保存List鏈表和Set集合的數據結構,而且還支持對List進行各種操作,例 如從List兩端push和pop數據,取List區間,排序等等,對Set支持各種集合的并集交集操作,此外單個value的最大限制是1GB,不像 memcached只能保存1MB的數據,因此Redis可以用來實現很多有用的功能,比方說用他的List來做FIFO雙向鏈表,實現一個輕量級的高性 能消息隊列服務,用他的Set可以做高性能的tag系統等等。另外Redis也可以對存入的Key-Value設置expire時間,因此也可以被當作一 個功能加強版的memcached來用。

levelDB:LevelDB是Google開源出的一個Key/Value存儲引擎,它采用C++編寫的,支持高并發訪問和寫入,特別適合對于高寫入業務環境。影像數據庫讀次數遠大于寫。

sqlLite:多個進程線程可以訪問同一個數據。可以并行的滿足多個讀訪問。但是只能有一個進行寫訪問;否則寫訪問失敗并帶有一個錯誤代碼(也可以在可配置的超時過期之后自動的重試)。缺點:采用文件鎖機制,限制了讀寫并行執行。

FastDb: 是高效的內存數據庫系統,具備實時能力及便利的C++接口。

缺點:FastDB不支持client-server架構因而所有使用FastDB的應 用程序必須運行在同一主機上。對每一 個使用數據庫的應用數據庫文件被影射到虛擬內存空間中,因而它受物理內存空間大小的限制。

Hibari :(在日語中意思為“云雀”)是一個專為高可靠性和大數據存儲的數據庫引擎,可用于云計算環境中,例如 webmail、SNS 和其他要求T/P級數據存儲的環境中。Hibari 支持 Java, C/C++, Python, Ruby, 和 Erlang 語言的客戶端。

Hibari 并不是一個關系數據庫,主要是通過 key-value 的方法進行數據存儲。

主要特點:

  • A Hibari cluster is a distributed system.
  • A Hibari cluster is linearly scalable.
  • A Hibari cluster is highly available.
  • All updates are durable.
  • All updates are strongly consistent.
  • All client operations are lockless.
  • A Hibari cluster’s performance is excellent.
  • Multiple client access protocols are available.
  • Data is repaired automatically after a server failure.
  • Cluster configuration can be changed at any time.
  • Data is automatically rebalanced.
  • Heterogeneous hardware support is easy.
  • Micro-transactions simplify creation of robust client applications.
  • Per-table configurable performance options are available

二、 滿足海量存儲需求和訪問的面向文檔的數據庫:MongoDB,CouchDB

1、MongoDB
MongoDB是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。他支持的數據結構非常松散,是 類似json的bjson格式,因此可以存儲比較復雜的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語 言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。

Mongo主要解決的是海量數據的訪問效率問題,根據官方的文檔,當數據量達到50GB以上的時候,Mongo的數據庫訪問速度是MySQL的 10倍以上。Mongo的并發讀寫效率不是特別出色,根據官方提供的性能測試表明,大約每秒可以處理0.5萬-1.5次讀寫請求。對于Mongo的并發讀 寫性能,我(robbin)也打算有空的時候好好測試一下。

因為Mongo主要是支持海量數據存儲的,所以Mongo還自帶了一個出色的分布式文件系統GridFS,可以支持海量的數據存儲,但我也看到有些評論認為GridFS性能不佳,這一點還是有待親自做點測試來驗證了。

最后由于Mongo可以支持復雜的數據結構,而且帶有強大的數據查詢功能,因此非常受到歡迎,很多項目都考慮用MongoDB來替代MySQL來實現不是 特別復雜的Web應用,比方說why we migrated from MySQL to MongoDB就是一個真實的從MySQL遷移到MongoDB的案例,由于數據量實在太大,所以遷移到了Mongo上面,數據查詢的速度得到了非常顯著 的提升。

MongoDB也有一個ruby的項目MongoMapper,是模仿Merb的DataMapper編寫的MongoDB的接口,使用起來非常簡單,幾乎和DataMapper一模一樣,功能非常強大易用。

2、CouchDB
CouchDB現在是一個非常有名氣的項目,似乎不用多介紹了。但是我卻對CouchDB沒有什么興趣,主要是因為CouchDB僅僅提供了基于 HTTP REST的接口,因此CouchDB單純從并發讀寫性能來說,是非常糟糕的,這讓我立刻拋棄了對CouchDB的興趣。

三、滿足高可擴展性和可用性的面向分布式計算的數據庫:Cassandra,Voldemort

面向scale能力的數據庫其實主要解決的問題領域和上述兩類數據庫還不太一樣,它首先必須是一個分布式的數據庫系統,由分布在不同節點上面的數 據庫共同構成一個數據庫服務系統,并且根據這種分布式架構來提供online的,具有彈性的可擴展能力,例如可以不停機的添加更多數據節點,刪除數據節點 等等。因此像Cassandra常常被看成是一個開源版本的Google BigTable的替代品。Cassandra和Voldemort都是用Java開發的:

1、Cassandra
Cassandra項目是Facebook在2008年開源出來的,隨后Facebook自己使用Cassandra的另外一個不開源的分支,而 開源出來的Cassandra主要被Amazon的Dynamite團隊來維護,并且Cassandra被認為是Dynamite2.0版本。目前除了 Facebook之外,twitter和digg.com都在使用Cassandra。

Cassandra的主要特點就是它不是一個數據庫,而是由一堆數據庫節點共同構成的一個分布式網絡服務,對Cassandra的一個寫操作,會 被復制到其他節點上去,對Cassandra的讀操作,也會被路由到某個節點上面去讀取。對于一個Cassandra群集來說,擴展性能是比較簡單的事 情,只管在群集里面添加節點就可以了。我看到有文章說Facebook的Cassandra群集有超過100臺服務器構成的數據庫群集。

Cassandra也支持比較豐富的數據結構和功能強大的查詢語言,和MongoDB比較類似,查詢功能比MongoDB稍弱一些,twitter的平臺 架構部門領導Evan Weaver寫了一篇文章介紹Cassandra:http://blog.evanweaver.com/articles/2009/07/06 /up-and-running-with-cassandra/,有非常詳細的介紹。

Cassandra以單個節點來衡量,其節點的并發讀寫性能不是特別好,有文章說評測下來Cassandra每秒大約不到1萬次讀寫請求,我也看 到一些對這個問題進行質疑的評論,但是評價Cassandra單個節點的性能是沒有意義的,真實的分布式數據庫訪問系統必然是n多個節點構成的系統,其并 發性能取決于整個系統的節點數量,路由效率,而不僅僅是單節點的并發負載能力。

2、Voldemort
Voldemort是個和Cassandra類似的面向解決scale問題的分布式數據庫系統,Cassandra來自于Facebook這個 SNS網站,而Voldemort則來自于Linkedin這個SNS網站。說起來SNS網站為我們貢獻了n多的NoSQL數據庫,例如 Cassandar,Voldemort,Tokyo Cabinet,Flare等等。Voldemort的資料不是很多,因此我沒有特別仔細去鉆研,Voldemort官方給出Voldemort的并發讀 寫性能也很不錯,每秒超過了1.5萬次讀寫。

從Facebook開發Cassandra,Linkedin開發Voldemort,我們也可以大致看出國外大型SNS網站對于分布式數據庫, 特別是對數據庫的scale能力方面的需求是多么殷切。前面我(robbin)提到,web應用的架構當中,web層和app層相對來說都很容易橫向擴 展,唯有數據庫是單點的,極難scale,現在Facebook和Linkedin在非關系型數據庫的分布式方面探索了一條很好的方向,這也是為什么現在 Cassandra這么熱門的主要原因。

?

?

轉載于:https://www.cnblogs.com/bigbigtree/p/3141770.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376602.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376602.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376602.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux進程間通信快速入門【三】:信號量(XSI、POSIX以及PV原語)

文章目錄XSIsemgetsemop、semtimedopsemctl基于共享內存demo修改XSI信號量的限制PV原語PV控制并發進程數POSIX信號量使用posix命名信號量使用posix匿名信號量參考在前兩篇文章中我們使用的racingdemo都沒有對臨界區代碼進行加鎖,這里我們介紹以下信號量的使用。Linu…

QTableWidget的使用詳細介紹和美工總結(轉)

基本外觀設置 FriendTable->setFrameShape(QFrame::NoFrame); //設置邊框 FriendTable->setHorizontalHeaderLabels(HeadList); 設置表頭 FriendTable->setSelectionMode(QAbstractItemView::SingleSelection); 設置選擇的模式為單選擇 FriendTable->setSelect…

Android programming on Mac 之安裝Eclipse

1.安裝包在此鏈接下載&#xff1a; http://developer.android.com/sdk/index.html google GoAgent翻墻不好用&#xff0c;更新了host文件也不行&#xff0c;整了半天&#xff0c;還是一怒之下續簽了vpn賬號。早知如此&#xff0c;何必折騰。~~~~(>_<)~~~~ 更新文件時…

c++關于虛表的一些筆記

文章目錄1、虛函數表指針2、多態構成的條件3、重載、重寫、重定義 三者區別4、繼承與虛函數5、單繼承中的虛函數表無虛函數覆蓋有虛函數覆蓋6、單繼承中的虛函數表無虛函數覆蓋有虛函數覆蓋參考看《深度探索c對象模型》的時候對虛表有了點疑惑&#xff0c;正好網上有些文章解除…

4、在Shell程序中的使用變量

學習目標變量的賦值變量的訪問變量的輸入 12-4-1 變量的賦值在Shell編程中&#xff0c;所有的變量名都由字符串組成&#xff0c;并且不需要對變量進行聲明。要賦值給一個變量&#xff0c;其格式如下&#xff1a;變量名值。注意&#xff1a;等號()前后沒有空格例如&#xff1a; …

C語言技巧:把單一元素的數組放在末尾,struct可以擁有可變大小的數組

《C 對象模型》第19頁有這樣一句話 C程序員的巧計有時候卻成為c程序員的陷阱。例如把單一元素的數組放在一個struct的末尾&#xff0c;于是每個struct objects可以擁有可變數組的數組&#xff1a; struct mumble {/* stuff */char pc[1]; };//從文件或標準輸入裝置中取得一個…

探討C++ 變量生命周期、棧分配方式、類內存布局、Debug和Release程序的區別(二)...

看此文&#xff0c;務必需要先了解本文討論的背景&#xff0c;不多說&#xff0c;給出鏈接&#xff1a; 探討C 變量生命周期、棧分配方式、類內存布局、Debug和Release程序的區別&#xff08;一&#xff09; 本文會以此問題作為討論的實例&#xff0c;來具體討論以下四個問題&a…

后臺系統可擴展性學習筆記(一)概要

文章目錄系統大致架構可擴展性負載均衡器與會話保持引入冗余增強系統可用性緩存減輕數據庫壓力異步處理參考系統大致架構 當一個用戶請求從客戶端出發&#xff0c;經過網絡傳輸&#xff0c;達到 Web 服務層&#xff0c;接著進入應用層&#xff0c;最后抵達數據層&#xff0c;它…

poj 3728(LCA + dp)

題目鏈接&#xff1a;http://poj.org/problem?id3728 思路&#xff1a;題目的意思是求樹上a -> b的路徑上的最大收益&#xff08;在最小值買入&#xff0c;在最大值賣出&#xff09;。 我們假設路徑a - > b 之間的LCA(a, b) f, 并且另up[a]表示a - > f之間的最大收益…

成功之路

1、每天都要有進步&#xff0c;都要有新知識的收獲。 2、工作認真負責&#xff0c;高效的完成&#xff0c;多總結。 3、自己多練習一些感興趣的東西&#xff0c;實踐&#xff01;&#xff01;&#xff01; 4、寫博客。 5、百度、騰訊、阿里是目標&#xff0c;差距還很大&#x…

后臺系統可擴展性學習筆記(二)權衡取舍

文章目錄性能與可擴展性延遲與吞吐量可用性與一致性一致性模式可用性模式可用性衡量參考系統設計中也面臨許多權衡取舍&#xff1a;性能與可擴展性延遲與吞吐量可用性與一致性 性能與可擴展性 可擴展&#xff0c;意味著服務能以加資源的方式成比例地提升性能&#xff0c;性能…

iOS中使用子線程的完整方法

第一步&#xff1a;開啟子線程 //開啟子線程到網絡上獲取數據myFirstThread [[NSThread alloc]initWithTarget:self selector:selector(thread1GetData) object:nil];[myFirstThread setName:"第一個子線程,用于獲取網絡數據"];[myFirstThread start]; 第二步&…

DIV的表單布局

表單布局其實用表格最好了&#xff0c;可是表格的話&#xff0c;無法定位&#xff0c;這個是一個硬傷。 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>表單布局</title> <link rel"stylesheet" …

后臺系統可擴展性學習筆記(三)DNS機制原理

文章目錄DNS概念梳理域名基本概念資源記錄基本概念路由策略DNS 域空間結構實現原理復制機制查詢機制緩存機制參考DNS概念梳理 DNS&#xff08;Domain Name System&#xff09;相當于互聯網的通訊錄&#xff0c;能夠把域名翻譯成 IP 地址。 從技術角度來講&#xff0c;DNS 是個…

后臺系統可擴展性學習筆記(四)CDN機制原理

文章目錄概念梳理CDN拓撲結構CDN內容分發方式架構原理工作原理實現原理概念梳理 CDN&#xff08;Content Delivery Network&#xff0c;內容分發網絡&#xff09;是由分布在不同地理位置的代理服務器及其數據中心組成的網絡&#xff0c;希望在空間距離上為用戶就近提供服務&am…

Javascript 基礎—變量 運算符

經過找工作筆試的洗禮&#xff0c;感覺自己js語法方面掌握的不是很系統&#xff0c;今天來梳理下——變量以及運算符。 基礎篇 和C語言的不同點&#xff1a;是一種弱類型語言&#xff0c;申明變量時不需要指定類型&#xff1b;變量名的命名方法也有不同&#xff1b;簡單類型種類…

后臺系統可擴展性學習筆記(五)負載均衡

文章目錄Load balancer(負載均衡器)請求傳輸拆解DNS 負載均衡客戶端負載均衡OSI 七層模型回顧2 層、3 層負載均衡3/4 層負載均衡7 層負載均衡在 第一節談到了系統的橫向擴展在于從單機擴展到多機&#xff0c;那么面臨的第一個問題就是這些機器如何協同工作&#xff0c;即如何調…

Struts2第一個工程helloStruts極其基本配置

前面已經準備好了Struts-2.3.15&#xff0c;現在就可以直接搭建Struts2的工程了。前面http://blog.csdn.net/huangchnegdada/article/details/9179041有對Struts-2.3.15的準備工作的詳述。 首先打開MyEclispe新建一個Web Project&#xff0c;名字就叫Struts2_0100_Introduction…

[LeetCode]Find Minimum in Rotated Sorted Array

題目描述&#xff1a; Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find the minimum element. You may assume no duplicate exists in the array. 解題方案&#xff1a; 直接貼代碼&…