CouchDB
CouchDB's Futon Administration Interface, User database | |
Original author(s) | Damien Katz, Jan Lehnardt, Noah Slater, Christopher Lenz, J. Chris Anderson, Paul Davis, Adam Kocoloski, Jason Davies, Benoît Chesneau, Filipe Manana, Robert Newson |
---|---|
Developer(s) | Apache Software Foundation |
Initial release | 2005 |
Stable release |
2.0.0
/ September 20, 2016 |
Preview release | |
Repository |
github |
Development status | Active |
Written in | Erlang |
Operating system | Cross-platform |
Type | Document-oriented database |
License | Apache License 2.0 |
Website |
couchdb |
Apache CouchDB is open source database software that focuses on ease of use and having an architecture that "completely embraces the Web".[2] It has a document-oriented NoSQL database architecture and is implemented in the concurrency-oriented language Erlang; it uses JSON to store data, JavaScript as its query language using MapReduce, and HTTP for an API.[2]
CouchDB was first released in 2005 and later became an Apache Software Foundation project in 2008.
Unlike a relational database, a CouchDB database does not store data and relationships in tables. Instead, each database is a collection of independent documents. Each document maintains its own data and self-contained schema. An application may access multiple databases, such as one stored on a user's mobile phone and another on a server. Document metadata contains revision information, making it possible to merge any differences that may have occurred while the databases were disconnected.
CouchDB implements a form of multiversion concurrency control (MVCC) so it does not lock the database file during writes. Conflicts are left to the application to resolve. Resolving a conflict generally involves first merging data into one of the documents, then deleting the stale one.[3]
Other features include document-level ACID semantics with eventual consistency, (incremental) MapReduce, and (incremental) replication. One of CouchDB's distinguishing features is multi-master replication, which allows it to scale across machines to build high performance systems. A built-in Web application called Futon helps with administration.
History
Couch is an acronym for cluster of unreliable commodity hardware.[4] The CouchDB project was created in April 2005 by Damien Katz, former Lotus Notes developer at IBM. He self-funded the project for almost two years and released it as an open source project under the GNU General Public License.
In February 2008, it became an Apache Incubator project and was offered under the Apache License instead.[5] A few months after, it graduated to a top-level project.[6] This led to the first stable version being released in July 2010.[7]
In early 2012, Katz left the project to focus on Couchbase Server.[8]
Since Katz's departure, the Apache CouchDB project has continued, releasing 1.2 in April 2012 and 1.3 in April 2013. In July 2013, the CouchDB community merged the codebase for BigCouch, Cloudant's clustered version of CouchDB, into the Apache project. The BigCouch clustering framework is prepared to be included in an upcoming release of Apache CouchDB.[9]
Native clustering is supported at version 2.0.0. And the new Mango Query Server provides a simple JSON-based way to perform CouchDB queries without JavaScript or MapReduce.
Main features
- ACID Semantics
- CouchDB provides ACID semantics.[10] It does this by implementing a form of Multi-Version Concurrency Control, meaning that CouchDB can handle a high volume of concurrent readers and writers without conflict.
- Built for Offline
- CouchDB can replicate to devices (like smartphones) that can go offline and handle data sync for you when the device is back online.
- Distributed Architecture with Replication
- CouchDB was designed with bi-direction replication (or synchronization) and off-line operation in mind. That means multiple replicas can have their own copies of the same data, modify it, and then sync those changes at a later time.
- Document Storage
- CouchDB stores data as "documents", as one or more field/value pairs expressed as JSON. Field values can be simple things like strings, numbers, or dates; but ordered lists and associative arrays can also be used. Every document in a CouchDB database has a unique id and there is no required document schema.
- Eventual Consistency
- CouchDB guarantees eventual consistency to be able to provide both availability and partition tolerance.
- Map/Reduce Views and Indexes
- The stored data is structured using views. In CouchDB, each view is constructed by a JavaScript function that acts as the Map half of a map/reduce operation. The function takes a document and transforms it into a single value that it returns. CouchDB can index views and keep those indexes updated as documents are added, removed, or updated.
- HTTP API
- All items have a unique URI that gets exposed via HTTP. It uses the HTTP methods POST, GET, PUT and DELETE for the four basic CRUD (Create, Read, Update, Delete) operations on all resources.
CouchDB also offers a built-in administration interface accessible via Web called Futon.[11]
Use cases and production deployments
Replication and synchronization capabilities of CouchDB make it ideal for using it in mobile devices, where network connection is not guaranteed, and the application must keep on working offline.
CouchDB is well suited for applications with accumulating, occasionally changing data, on which pre-defined queries are to be run and where versioning is important (CRM, CMS systems, by example). Master-master replication is an especially interesting feature, allowing easy multi-site deployments.[12]
Users
Users of CouchDB include:
- Amadeus IT Group, for some of their back-end systems.
- Credit Suisse, for internal use at commodities department for their marketplace framework.[13]
- Meebo, for their social platform (Web and applications). Meebo was acquired by Google and most products were shut down on July 12, 2012.[14]
- npm, for their package registry.[15]
- Sophos, for some of their back-end systems.
- The BBC, for its dynamic content platforms.[16]
- Canonical began using it in 2009 for its synchronization service "Ubuntu One",[17] but stopped using it in November 2011.[18]
- AirFi for their portable Inflight Entertainment platform.[19]
- CANAL+ for international on-demand platform at CANAL+ Overseas.
Data manipulation: documents and views
CouchDB manages a collection of JSON documents. The documents are organised via views. Views are defined with aggregate functions and filters are computed in parallel, much like MapReduce.
Views are generally stored in the database and their indexes updated continuously. CouchDB supports a view system using external socket servers and a JSON-based protocol.[20] As a consequence, view servers have been developed in a variety of languages (JavaScript is the default, but there are also PHP, Ruby, Python and Erlang).
Accessing data via HTTP
Applications interact with CouchDB via HTTP. The following demonstrates a few examples using cURL, a command-line utility. These examples assume that CouchDB is running on localhost (127.0.0.1) on port 5984.
Action | Request | Response |
---|---|---|
Accessing server information | curl http://127.0.0.1:5984/
|
{
"couchdb": "Welcome",
"version":"1.1.0"
}
|
Creating a database named wiki | curl -X PUT http://127.0.0.1:5984/wiki
|
{"ok": true}
|
Attempting to create a second database named 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."
}
|
Retrieve information about the wiki database | 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
}
|
Delete the database wiki | curl -X DELETE http://127.0.0.1:5984/wiki
|
{"ok": true}
|
Create a document, asking CouchDB to supply a 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"
}
|
Open source components
CouchDB includes a number of other open source projects as part of its default package.
Component | Description | License |
---|---|---|
Erlang | Erlang is a general-purpose concurrent programming language and runtime system. The sequential subset of Erlang is a functional language, with strict evaluation, single assignment, and dynamic typing. | Modified MPL 1.0, Apache License 2.0 (Release 18.0 and later) |
ICU | International Components for Unicode (ICU) is an open source project of mature C/C++ and Java libraries for Unicode support, software internationalization and software globalization. ICU is widely portable to many operating systems and environments. | MIT License |
jQuery | jQuery is a lightweight cross-browser JavaScript library that emphasizes interaction between JavaScript and HTML. | Dual license: GPL and MIT |
OpenSSL | OpenSSL is an open source implementation of the SSL and TLS protocols. The core library (written in the C programming language) implements the basic cryptographic functions and provides various utility functions. | Apache-like unique |
SpiderMonkey | SpiderMonkey is a code name for the first ever JavaScript engine, written by Brendan Eich at Netscape Communications, later released as open source and now maintained by the Mozilla Foundation. | MPL |
See also
- Apache Cassandra
- BigCouch
- Cloudant
- Couchbase Server
- Document-oriented database
- LYCE (software bundle)
- Mnesia
- Oracle NoSQL Database
- OrientDB
- XML database
References
- ↑ "CouchDB 2.0 Release Candidate 4", email on developer mailing list
- 1 2 Apache Software Foundation. "Apache CouchDB". Retrieved 15 April 2012.
- ↑ Smith, Jason. "What is the CouchDB replication protocol? Is it like Git?". StackOverflow. Stack Exchange. Retrieved 14 April 2012.
- ↑ "Exploring CouchDB". Developer Works. IBM. March 31, 2009. Retrieved September 30, 2016.
- ↑ Apache mailing list announcement on mail-archives.apache.org
- ↑ Re: Proposed Resolution: Establish CouchDB TLP on mail-archives.apache.org
- ↑ "CouchDB NoSQL Database Ready for Production Use", article from PC World of July 2010
- ↑ Katz, Damien. "The future of CouchDB". Retrieved 15 April 2012.
- ↑ Slater, Noah. "Welcome BigCouch". Retrieved 25 July 2013.
- ↑ CouchDB, Technical Overview Archived October 20, 2011, at the Wayback Machine.
- ↑ "Welcome to Futon" from "CouchDB The Definitive Guide"
- ↑ Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase comparison from Kristóf Kovács
- ↑ "CouchDB in the wild" article of the product's Web, a list of software projects and websites using CouchDB
- ↑ Cutler, Kim-Mai (9 June 2012). "Meebo Gets The Classic Google Acq-hire Treatment: Most Products To Shut Down Soon". TechCrunch. AOL Inc. Retrieved 7 January 2016.
- ↑ "npm-registry-couchapp". GitHub. npm. 17 June 2015. Retrieved 7 January 2016.
- ↑ CouchDB at the BBC as a fault tolerant, scalable, multi-data center key-value store
- ↑ Email from Elliot Murphy (Canonical) to the CouchDB-Devel list
- ↑ Canonical Drops CouchDB From Ubuntu One (Slashdot)
- ↑ AirFi has CouchDB as its job requirments
- ↑ View Server Documentation on wiki.apache.org
Bibliography
- Anderson, J. Chris; Slater, Noah; Lehnardt, Jan (November 15, 2009), CouchDB: The Definitive Guide (1st ed.), O'Reilly Media, p. 300, ISBN 0-596-15816-5
- Lennon, Joe (December 15, 2009), Beginning CouchDB (1st ed.), Apress, p. 300, ISBN 1-4302-7237-6
- Holt, Bradley (March 7, 2011), Writing and Querying MapReduce Views in CouchDB (1st ed.), O'Reilly Media, p. 76, ISBN 1-4493-0312-9
- Holt, Bradley (April 11, 2011), Scaling CouchDB (1st ed.), O'Reilly Media, p. 72, ISBN 1-4493-0343-9
- Brown, MC (October 31, 2011), Getting Started with CouchDB (1st ed.), O'Reilly Media, p. 50, ISBN 1-4493-0755-8
- Thompson, Mick (August 2, 2011), Getting Started with GEO, CouchDB, and Node.js (1st ed.), O'Reilly Media, p. 64, ISBN 1-4493-0752-3
External links
- Official website
- CouchDB: The Definitive Guide
- Complete HTTP API Reference
- Simple PHP5 library to communicate with CouchDB
- Asynchronous CouchDB client for Java
- Asynchronous CouchDB client for Scala
- Lehnardt, Jan (2008). "Couch DB at 10,000 feet". Erlang eXchange 2008. Retrieved 15 April 2012.
- Lenhardt, Jan (2009). "CouchDB for Erlang Developers". Erlang Factory London 2009. Retrieved 15 April 2012.
- Katz, Damien (January 2009). "CouchDB and Me". RubyFringe. InfoQ. Retrieved 15 April 2012.