CouchDB
Apache CouchDB是一個開源資料庫,專注於易用性和成為"完全擁抱web的資料庫"[2]。它是一個使用JSON作為儲存格式,JavaScript作為查詢語言,MapReduce和HTTP作為API的文件導向的NoSQL資料庫。其中一個顯著的功能就是多主複製。CouchDB的第一個版本釋出在2005年,在2008年成為了Apache的專案。
原作者 | Damien Katz, Jan Lehnardt, Noah Slater, Christopher Lenz, J. Chris Anderson, Paul Davis, Adam Kocoloski, Jason Davies, Benoît Chesneau, Filipe Manana, Robert Newson |
---|---|
開發者 | Apache軟件基金會 |
首次釋出 | 2005 |
目前版本 | 3.4.2[1](2024年10月20日,38天前) |
原始碼庫 | |
程式語言 | Erlang |
作業系統 | 跨平台 |
類型 | 面向文件的數據庫 |
特許條款 | Apache特許條款 |
網站 | couchdb |
不同於關係型資料庫,CouchDB沒有將數據和關係儲存在表格里。替代的,每個資料庫是一個獨立的文件集合。每一個文件維護其自己獨立的數據和自包涵的schema。一個應用程式可能會訪問多個資料庫,比如其中一個位於用戶的手機上,另一個位於在遠端的伺服器上。文件的元數據包含版本資訊,讓其能夠合併可能因為資料庫連結遺失導致的任何差異。
CouchDB實現了一個多版本並行控制(MVCC)形式,用來避免在資料庫寫操作的時候對檔案進行加鎖。衝突留給應用程式去解決。解決一個衝突的通用操作的是首先合併數據到其中一個文件,然後刪除舊的數據[3]。
其他功能包括文件級別的ACID語意和最終一致性,MapReduce,複製(Replication)。它還支援通過一個做Futon的內建web應用程式來進行資料庫管理。
歷史
CouchDB(Couch是 cluster of unreliable commodity hardware的首字母縮寫)[4]是前IBM的Lotus Notes開發者Damien Katz建立於2005年的一個專案。Damien Katz將其定義為「面向大規模可延伸對象資料庫的儲存系統」。他對該資料庫的目標是讓其成為互聯網的資料庫,其從底層的設計就支援部署web應用程式。他自己通過將近兩年的時間建立了該專案同時將其作為開源專案在GNU General Public License下釋出。
在2008年2月,其成為Apache Incubator專案,同時其特許條款變更為Apache License。幾個月後,其升級為頂級專案。這促使了其第一個穩定版在2010年7月釋出。
在2012年初期,Damien Katz離開了專案專注於Couchbase Server。不過該專案還在繼續進行中,在2012年4月釋出了1.2版本,2013年4月釋出了1.3版本。
主要功能
- 文件儲存
- CouchDB將數據儲存為「文件」,其為用JSON表示的有一個或者多個欄位/值的對。欄位的值可以是簡單的東西比如字串,數字,或者時間;但是陣列和字典同樣也可以使用。CouchDB中的每一個文件有一個唯一的id但是沒有必須的文件schema。
- ACID語意
- CouchDB提供了ACID語意,其通過多版本並行控制的形式來實現,意味着CouchDB能夠處理大量的並行讀寫而不會產生衝突。
- Map/Reduce 視圖 和 索引
- 儲存的數據通過視圖進行組裝。在CouchDB中,每一個視圖都是由作為map/reduce操作中的Map部分的JavaScript函數構成。該函數接受一個文件並且將其轉換為一個單獨的值來返回。CouchDB能夠對視圖進行索引,同時在文件新增,修改,刪除的時候對這些索引進行更新。
- 支援複製的分散式架構
- CouchDB的設計基於支援雙向的複製(同步)和離線操作。這意味着多個複製能夠對同一數據有其自己的拷貝,可以進行修改,之後將這些變更進行同步。
- REST API
- 所有的數據都有一個唯一的通過HTTP暴露出來的URI。REST使用HTTP方法 POST,GET,PUT和DELETE來操作對應的四個基本CRUD(Create,Read,Update,Delete)操作來操作所有的資源。
- 最終一致性
- CouchDB保證最終一致性,使其能夠同時提供可用性和分割容忍。
- 離線支援
- CoucbDB能夠同步複製到可能會離線的終端裝置(比如智能電話),同時當設置再次線上時處理數據同步。
CouchDB內建了一個的叫做Futon的通過web訪問的管理介面。
使用案例、產品部署
CouchDB的複製和同步強大功能讓其能夠使用在無法保證網絡連結但是應用程式必須繼續在離線模式工作的流動裝置。
使用CouchDB的企業
一些使用CouchDB的企業範例:
數據操作
CoucbDB管理JSON文件的集合。文件通過視圖進行組織。視圖通過Aggregate函數進行定義,過濾查詢的時候平行計算,類似MapReduce。
通過HTTP訪問數據
應用程式通過HTTP與CouchDB進行互動。下面是一些通過cURL進行演示的範例。這些範例假設CouchDB執行在本地localhost(127.0.0.1)的5984埠。
Action | Request | Response |
---|---|---|
取得伺服器基本資訊 | curl http://127.0.0.1:5984/
|
{
"couchdb": "Welcome",
"version":"1.1.0"
}
|
建立一個名為wiki的資料庫 | curl -X PUT http://127.0.0.1:5984/wiki
|
{"ok": true}
|
嘗試建立第一個名為 wiki的資料庫 | curl -X PUT http://127.0.0.1:5984/wiki
|
{
"error":"file_exists",
"reason":"The database could not be created, the file already exists."
}
|
取得關於wiki資料庫的資訊 | curl http://127.0.0.1:5984/wiki
|
{
"db_name": "wiki",
"doc_count": 0,
"doc_del_count": 0,
"update_seq": 0,
"purge_seq": 0,
"compact_running": false,
"disk_size": 79,
"instance_start_time": "1272453873691070",
"disk_format_version": 5
}
|
刪除資料庫 wiki | curl -X DELETE http://127.0.0.1:5984/wiki
|
{"ok": true}
|
建立一個文件,請求CoudbDB來生成一個document id | curl -X POST -H "Content-Type: application/json" --data \
'{ "text" : "Wikipedia on CouchDB", "rating": 5 }' \
http://127.0.0.1:5984/wiki
|
{
"ok": true,
"id": "123BAC",
"rev": "946B7D1C"
}
|
開源組件
CouchDB包含了一些其他的開源專案作為其自己的內建包。
元件 | 描述 | 特許條款 |
---|---|---|
SpiderMonkey | SpiderMonkey是一個JavaScript引擎。 | Mozilla公眾特許條款 |
jQuery | jQuery是一個輕量級的瀏覽器函式庫。 | GNU通用公眾特許條款和MIT特許條款 |
ICU | ICU是成熟的開源專案。 | MIT特許條款 |
OpenSSL | OpenSSL是一個開源協定。實現了基本的密碼功能,並提供各種實用功能。 | Apache特許條款 |
Erlang | Erlang是一種通用的並行程式語言和執行系統。Erlang的連續子集是函數式語言,與嚴格評測,單分配和動態型別。 | Mozilla公眾特許條款 |
其他
參考文獻
- ^ 1.0 1.1 Release 3.4.2. 2024年10月20日 [2024年10月21日].
- ^ Apache軟件基金會. Apache CouchDB. [15 April 2012]. (原始內容存檔於2011-02-20).
- ^ Smith, Jason. What is the CouchDB replication protocol? Is it like Git?. StackOverflow. Stack Exchange. [14 April 2012]. (原始內容存檔於2019-09-24).
- ^ Exploring CouchDB (頁面存檔備份,存於互聯網檔案館), article from IBM Developer Works
- ^ Email from Elliot Murphy (Canonical) (頁面存檔備份,存於互聯網檔案館) to the CouchDB-Devel list
- ^ Canonical Drops CouchDB From Ubuntu One (Slashdot). [2013-08-16]. (原始內容存檔於2013-09-26).
- ^ CouchDB at the BBC as a fault tolerant, scalable, multi-data center key-value store. [2013-08-16]. (原始內容存檔於2013-11-03).
- ^ "CouchDB in the wild" (頁面存檔備份,存於互聯網檔案館) article of the product's web, a list of software projects and websites using CouchDB
外部連結
- 官方網站
- CouchDB: The Definitive Guide
- CouchDB articles on NoSQLDatabases.com
- CouchDB news and articles on myNoSQL(頁面存檔備份,存於互聯網檔案館)
- Scaling CouchDB(頁面存檔備份,存於互聯網檔案館)
- Complete HTTP API Reference
- Simple PHP5 library to communicate with CouchDB(頁面存檔備份,存於互聯網檔案館)
- Asynchronous CouchDB client for Java(頁面存檔備份,存於互聯網檔案館)
- Asynchronous CouchDB client for Scala(頁面存檔備份,存於互聯網檔案館)
- 3 CouchDB Case Studies(頁面存檔備份,存於互聯網檔案館)
- CouchDB for access log aggregation and analysis
- Lehnardt, Jan. Couch DB at 10,000 feet. Erlang eXchange 2008. 2008 [15 April 2012]. (原始內容存檔於2012-11-09).
- Lenhardt, Jan. CouchDB for Erlang Developers. Erlang Factory London 2009. 2009 [15 April 2012]. (原始內容存檔於2011-06-19).
- Katz, Damien. CouchDB and Me. RubyFringe. InfoQ. January 2009 [15 April 2012]. (原始內容存檔於2011-04-27).