CouchDB

  • github.com/apache/couchdb
編輯維基數據鏈接编程语言Erlang操作系统跨平台类型面向文檔的數據庫许可协议Apache许可证网站couchdb.apache.org/ 编辑维基数据

Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web数据库"[2]。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的面向文档的NoSQL数据库。其中一个显著的功能就是多主复制。CouchDB的第一个版本发布在2005年,在2008年成为了Apache的项目。

不同于关系型数据库,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的企业示例:

  • Ubuntu,在2009年开始使用其作为同步服务“Ubuntu One”[5] 但是在2011年停止使用[6]
  • BBC,用在其动态内容平台[7]
  • Credit Suisse,用在其内部的商品部门的市场框架[8]
  • Meebo,用在其社交平台(web和应用程序),Meebo在2012年7月12日被Google收购同时被关闭。

数据操作

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. ^ Release 3.3.3. 2023年12月4日 [2023年12月19日]. 
  2. ^ Apache软件基金会. Apache CouchDB. [15 April 2012]. (原始内容存档于2011-02-20). 
  3. ^ Smith, Jason. What is the CouchDB replication protocol? Is it like Git?. StackOverflow. Stack Exchange. [14 April 2012]. (原始内容存档于2019-09-24). 
  4. ^ Exploring CouchDB (页面存档备份,存于互联网档案馆), article from IBM Developer Works
  5. ^ Email from Elliot Murphy (Canonical) (页面存档备份,存于互联网档案馆) to the CouchDB-Devel list
  6. ^ Canonical Drops CouchDB From Ubuntu One (Slashdot). [2013-08-16]. (原始内容存档于2013-09-26). 
  7. ^ CouchDB at the BBC as a fault tolerant, scalable, multi-data center key-value store. [2013-08-16]. (原始内容存档于2013-11-03). 
  8. ^ "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). 
鍵值存儲
最終一致性鍵值存儲
  • Cassandra
  • Dynamo英语Dynamo
  • Riak英语Riak
  • Hibari英语Hibari
  • Virtuoso英语Virtuoso
  • Voldemort英语Voldemort_(distributed_data_store)
內存鍵值存儲
  • Memcached
  • Redis
  • Oracle Coherence英语Oracle Coherence
  • NCache英语NCache
  • Hazelcast英语Hazelcast
  • Tuple space英语Tuple space
  • Velocity英语Velocity_(memory_cache)
持久化鍵值存儲
  • BigTable
  • LevelDB
  • Tokyo Cabinet英语Tokyo Cabinet
  • Tarantool
  • TreapDB英语TreapDB
  • Tuple space英语Tuple space
文檔存儲
  • MongoDB
  • CouchDB
  • SimpleDB
  • Terrastore
  • BaseX英语BaseX
  • Clusterpoint英语Clusterpoint
  • Riak英语Riak
  • No2DB
圖存儲
  • FlockDB英语FlockDB
  • DEX
  • Neo4J英语Neo4J
  • AllegroGraph英语AllegroGraph
  • InfiniteGraph英语InfiniteGraph
  • OrientDB英语OrientDB
  • Pregel
NoSQL理論
列表级条目 NoSQL數據庫比較
顶级项目
  • Abdera英语Apache Abdera
  • Accumulo英语Apache Accumulo
  • ActiveMQ
  • Ambari英语Apache Ambari
  • Ant
  • Aries英语Apache Aries
  • Apache Arrow
  • Apache HTTP Server
  • APR
  • Avro
  • Axis
  • Axis2
  • Beam
  • Bloodhound英语Apache Bloodhound
  • Apache Brooklyn英语Apache Brooklyn
  • Buildr英语Apache Buildr
  • Calcite英语Apache Calcite
  • Camel
  • Cassandra
  • Cayenne英语Apache Cayenne
  • Chemistry英语Apache Chemistry
  • CloudStack英语Apache CloudStack
  • Cocoon英语Apache Cocoon
  • Continuum英语Apache Continuum
  • Cordova
  • CouchDB
  • cTAKES英语cTAKES
  • CXF
  • Deltacloud英语Deltacloud
  • Derby
  • Directory英语Apache Directory Server
  • Drill英语Apache Drill
  • Empire-db英语Apache Empire-db
  • ECharts
  • Felix英语Apache Felix
  • Flex
  • Flink
  • Flume英语Apache Flume
  • Forrest英语Apache Forrest
  • Geronimo英语Apache Geronimo
  • Gora英语Apache Gora
  • Gump英语Apache Gump
  • Hadoop
  • Hama英语Apache Hama
  • HBase
  • Hive
  • Jackrabbit英语Apache Jackrabbit
  • James英语Apache James
  • JMeter英语Apache JMeter
  • Kafka
  • Karaf英语Apache Karaf
  • Kylin英语Apache Kylin
  • Lucene
  • Lenya英语Apache Lenya
  • Mahout英语Apache Mahout
  • Marmotta英语Apache Marmotta
  • Maven
  • MINA英语Apache MINA
  • mod_perl英语mod_perl
  • MyFaces英语Apache MyFaces
  • Nutch英语Apache Nutch
  • ODE英语Apache ODE
  • OFBiz英语Apache OFBiz
  • Oozie英语Oozie
  • OpenEJB英语Apache OpenEJB
  • OpenJPA英语Apache OpenJPA
  • OpenNLP
  • OpenOffice
  • PDFBox英语Apache PDFBox
  • Phoenix英语Apache Phoenix
  • POI
  • Pig英语Pig (programming tool)
  • Pivot英语Apache Pivot
  • Qpid英语Apache Qpid
  • River英语Apache River
  • Roller英语Apache Roller
  • RocketMQ
  • Samza英语Apache Samza
  • ServiceMix英语Apache ServiceMix
  • Shindig英语Apache Shindig
  • Shiro
  • Sling英语Apache Sling
  • Spark
  • Stanbol英语Apache Stanbol
  • Storm
  • SpamAssassin
  • Sqoop
  • Apache C++标准库英语stdcxx
  • Struts
  • Struts 2
  • Subversion
  • Tapestry
  • Thrift
  • Tiles英语Apache Tiles
  • Tika英语Apache Tika
  • Tomcat
  • Trafficserver
  • Turbine
  • Tuscany
  • UIMA
  • Velocity
  • Wave
  • Wicket
  • Wink英语Apache Wink
  • Xalan英语Xalan
  • Xerces英语Xerces
  • XMLBeans英语XMLBeans
  • ZooKeeper
ASF logo
Commons项目
  • Apache Commons Logging英语Apache Commons Logging
  • BCEL英语Byte Code Engineering Library
  • BSF英语Bean Scripting Framework
  • Commons Daemon英语Commons Daemon
  • Jelly英语Apache Jelly
Lucene项目
  • Lucene Java
  • Lucene.Net英语Lucene.Net
  • Nutch英语Nutch
  • Solr
Hadoop项目
其他项目
  • Batik
  • Chainsaw英语Chainsaw (log file viewer)
  • FOP
  • Log4j
  • XAP英语Apache XAP
  • Log4Net
  • Ivy英语Apache Ivy
孵化器项目
  • XAP英语Apache XAP
  • Samza英语Apache Samza
  • Storm
Apache Attic
  • AxKit英语AxKit
  • Beehive英语Apache Beehive
  • Click英语Apache Click
  • Apache BlueSky英语BlueSky Open Platform
  • Cactus英语Jakarta Cactus
  • Jakarta
  • Excalibur英语Apache Excalibur
  • Harmony
  • HiveMind英语Apache HiveMind
  • Lenya英语Apache Lenya
  • Slide英语Jakarta Slide
  • Shale英语Apache Shale
  • Shindig英语Apache Shindig
  • stdcxx英语Apache C++ Standard Library
  • iBATIS
  • XMLBeans英语XMLBeans
许可证标准
  • 分类 分类
  • 共享资源页面 维基共享