- 浏览: 337682 次
- 性别:
- 来自: 北京
最新评论
-
perfect_control:
真的很详细,一些东西很容易被我忽略掉了
使用fprof进行性能分析 -
leeyisoft:
http://www.erlangqa.com/ 怎么变成 “ ...
Erlang问答网站,欢迎各位提出问题,解答问题。 -
simsunny22:
4年之后我才看到 慢慢的干货
Erlang服务器内存耗尽bug跟踪过程 -
爱死我:
...
使用etop查看系统中进程信息 -
宋兵甲:
在跑这个服务的时候,每秒建立一个客户端连接,连续建立10000 ...
自己写一个tcp 通用服务器
概述
CouchDB,大家或多或少都听说过。它到底有什么特性,适合哪些应用场景,和我们常用的关系型数据库有什么区别? 这些问题,可能我们心里都不是非常清楚。在以前的Blog中(PS,不是在javaeye哦),我提及了几次CouchDB,但是仅仅 限于编译,安装这些浮在水面上的工作。今天抽出时间把最近关于CouchDB的一些了解整理一下。
CouchDB是什么
CouchDB一种半结构化面向文档的分布式,高容错的数据库系统,其提供RESTFul HTTP/JSON接口。其拥有MVCC特性,用户可以通过自定义Map/Reduce函数生成对应的View。
在CouchDB中,数据是以JSON字符的方式存储在文件中。
特性
- RESTFul API:HTTP GET/PUT/POST/DELETE + JSON
- 基于文档存储,数据之间没有关系范式要求
- 每个数据库对应单个个文件(以JSON保存),Hot backup
- MVCC(Multi-Version-Concurrency-Control),读写均不锁定数据库
- 用户自定义View
- 内建备份机制
- 支持附件
- 使用Erlang开发(更多的特性)
应用场景 在我们的生活中,有很多document,比如信件,账单,笔记等,他们只是简单的信息,没有关系的需求,我们可能仅仅需要存储这些数据。 这样的情况下,CouchDB应该是很好的选择。当然其他使用关系型数据库的环境,也可以使用CouchDB来解决。
根据CouchDB的特性,在某些偶 尔连接网络的应用中,我们可以用CouchDB暂存数据,随后进行同步。也可以在Cloud环境中,作为分布式的数据存储。CouchDB提供给予 HTTP的API,这样所有的常见语言都可以使用CouchDB。
使用CouchDB,意味着我们不需要在像使用RMDBS一样,在设计应用前首先设计负责数据Table。我们的开发更加快速,灵活。
实现
在CouchDB中,Database表示一个数据库,每个Database对应一个"Storage"(后缀为.couch)以及多个View Index(用来存储View结果支持query)。
Database Storage中可以存储任意的Document,用户可以在Database中自定义View,方便对数据进行查询, View 默认使用JavaScript进行定义,定义好的相关函数保存在 design document中,而View对应的具体数据是保存在View Index文件中。我们可以通过HTTP API请求Database,Document,View,可以进行简单的Query,以及其他各种系统相关的信息。
Storage File结构
数据库文件的后缀为.couch,由Header和Body组成。
-
fulldocinfo_by_id_btree
使用Document id作为key,常用来根据id来查找对应的document,full_doc_info中包含对应document的所有的Revision信息,通过这些信息,我们可以获取指定Revision的document
-
docinfo_by_seq_btree
使用seq作为key,当document被更新时,对应的seq会增加。 具体的document数据(json格式),以及B+Tree混合存储与这个.couch文件之中。通过B+Tree,我们可以快速的定位到指定的document。
所有的更新操作(包括document的创建,修改和删除)都是以在couch文件尾部追加的方式(即Append方式)进行。我们进行更新时,首 先拷贝原有的数据信息(仅仅针对修改,如果是Create那么就没有copy可言了),随后将其追加到文件的结尾,这个时候就激发B+Tree从leaf 到root的更新过程,更新的Node信息也是采用Append的方式写入到文件的结尾,到达根节点时,我们将根节点信息写入到Header中。这样一次 更新操作涉及1次数据写入,以及LogN次节点更新,所以其复杂度为O(logN)
因此采用追加的方式,所以在数据库运行一段时间后,我们需要对其进行“瘦身”,情理那些旧的Document数据。这个过程成为 Compaction。在Compation的过程,数据库仍然可用,只是请注意,在Compation的时候,是通过遍历DBName.couch文 件,将最新的数据拷贝到一个DBName.compat文件中,因此这个过程可能会耗费很大的存储空间,如果您在系统繁忙(主要是write)的情况下进 行Compation,可能会导致你的硬盘空间耗尽,一定注意哦!
ACID
CouchDB支持ACID特性。Document的更新(add,edit,delete)是顺序进行的,但是Database的read为并发 执行,其不必等待任何其他的read,write的完成。这样的特性与CouchDB存储文件的Append增加方式关系密切。
当CouchDB的文档更新时,为了保证数据的一致性,Commit分为以下两步:
- Document数据和index数据首先写入到disk数据库文件
- 生成两个连续的头信息(4kb),随后写入数据库文件
在上面两个过程中,如果在过程1,发生异常(系统崩溃或断电),那么couch文件的头信息没有发生变化,那么所有Append的数据都会被忽略; 如果在过程2发生异常,此时Header可能会发生损坏,我们验证第一个Header和第二个Header,如果任意一个Header可用,那么数据库文 件可用。如果两个Header都不可用,则对应数据库文件损坏,抛出异常。
一些数据库系统,为了实现 Atomic Commit ,提交数据前,将内容写入到一个rollback log文件,等提交完成后,删除log文件。
View Server
除了存储数据,我们还需要依据我们的要求展现数据,乃至一些统计,因此CouchDB中引入了View的概念。View的引入让CouchDB从一个有趣的文件存储系统,步入了数据库的殿堂。也使CouchDB能够融入到真正的应用环境中。
CouchDB中所有的Document都可以具有自己不同的结构,数据,这和关系型数据库中,严格的表结构,严格的关联完全不同。这样的特点对于数据的备份同步却非常有好处!
View Model
通过用户自定义View,我们可以汇集,统计数据,采用一个类似Map/Reduce的过程。这里的Map将原始的Document进行映射处理,Reduce将Map的中间结果进行重新归并统计,总而生成最终结果。这里和并行计算中的Map/Reduce有些不同。
CouchDB的View针对每个Database,但是其与Database关联性不是很大,View是一些用户自定义函数,处理从数据库的 Document输入,产生中间数据(如果没有reduce过程则为最终数据),然后再通过Reduce处理中间输出,产生最终结果。同样的View可以 使用在不同的Database上。
View存储在design Document中,请注意这里design Document和View Index是不同的。design Document保存的是view的定义,View Index保存的是针对某个Database进行View操作,产生的结果。
JavaScript View Function
CouchDB内部默认使用JavaScript作为View的编写语言,之所以采用Javascript,是和CouchDB面向Web开发相关 的。CouchDB使用Mozilla的spidermonkey作为JavaScript的解析运行平台,为了和Erlang进行交互,其使用c书写了 一个Port程序couchjs,/server/main.js作为View Server服务器。
在启动CouchDB时,通过Command:couchjs main.js即可启动基于JavaScript的View Server。
View中包含两个函数:
(map函数,必须) function(doc) { emit(null, doc); } (reduce函数,可选) function (key, values, rereduce) { return sum(values); }
doc ,为我们数据库对应的Document,因为我们采用JSON格式存储数据,所以Document在 JavaScript中转化为Object。`emit(null, doc)`用来生成map的中间结果,其中第一个参数null表示结果的key,第二个参数为结果的value,上面的例子中我们的结果为:
null, value1 ... null, valueN
function (key, values, rereduce)中,根据rereduce变量不同这里有两种情况:
- rereduce为false
- key为array,element为:[key,id],key为map function产生的key,id为Document对应id
- values为array,elements为map function产生的结果
- 比如 reduce([ [key1,id1], [key2,id2], [key3,id3] ], [value1,value2,value3], false)
- rereduce为true
- key为null
- values为array,element为前一次reduce返回的结果
- 比如reduce(null, [intermediate1,intermediate2,intermediate3], true)
很多时候,我们一次调用reduce就可以生成最终结果,我们会忽略rereduce参数。
评论
但是看了这个文章后我想法又发生了变化。http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/ 我个人对于文档数据库的需求并不高,我需求多的其实是key-value store. 因此除了couchdb之外,其实还有很多更好的选择。
而且couchdb用于生产环境,目前还有以下顾虑:
安全及身份控制
数据访问,比如将来如果有需求转向另外一种方案比如mysql,那数据导出问题多多,也许是不可能的任务。
Tim
貌似这个东西声称自己就是文档型数据库。
我欣赏作者的探索精神,但是感觉他的思维方式有问题。因为这个东西应用方向和使用的场景都同关系型数据库不同,其插入和删除等性能参数方面有差距几乎是一定的。如果要讨论,我倒是希望去探讨一下zodb。
最近也在研究couchDB,同时也想通过src能更理解erlang,引入实践。
很好很强大能否对比一下mnesia和couchdb的差异?
引用CouchDB FAQ中关于为什么不使用Mensia的回答:
* Mnesia每个数据文件有2GB大小限制
* 如果系统发生故障,重新启动时,Mnesia需要一个验证及修复的循过程,如果你的数据库文件很大,那么这个过程相当漫长
* Mensia的备份基于互相连接的分布式节点,而CouchDB可以在离线状态下工作,随后进行数据同步,备份。同样Mensia的很多优秀的特性Couch并不需要。
* Mnesia不是一个通用的数据库系统,其可能更多的应用在配置信息的分布式发布,更新等情景。比如network routers,http proxies, LDAP directories等。这些数据都不会非常大。
综合以上原因,其开发了CouchDB,其更加灵活,通用。
能否对比一下mnesia和couchdb的差异?
发表评论
-
Erlang问答网站,欢迎各位提出问题,解答问题。
2012-03-18 15:07 5323平时收到很多关于Erlang的问题,我都尽量一一解答,可是时间 ... -
Emakefile并行编译
2011-11-17 13:15 7682项目代码越来越多,使用erlang编译也越来越慢。无论是Mak ... -
Erlang服务器内存耗尽bug跟踪过程
2011-10-25 21:44 21917本文描述朋友Erlang服务器内存耗尽bug的解决过程 ... -
inet:getstat/2小用法
2011-04-27 09:32 4603inet:getstat/2的用处 在 ... -
Erlang游戏开发-协议
2011-04-22 16:10 10745Erlang游戏开发-协议 ... -
Gearman Erlang Client
2010-10-17 21:14 3738Gearman Gearman是一个通用的任务调度框架。 ... -
ECUG归来
2010-10-17 21:02 2996今天ECUG V圆满结束了,不知不觉作为讲师已经参加过3次大会 ... -
gen-erl-app快速生成erlang app 框架
2010-04-07 14:22 4017经常需要创建各种erlang app,这个过程一旦掌握,就很繁 ... -
erl-redis发布
2010-03-30 11:44 5809最近几天因为需要,实现了一个redis erlang clie ... -
用Erlang做了很多事
2010-01-19 14:08 5103因为工作及时间关系,最近比较忙碌,没有太多的时间写文章。 ... -
ecug topic - erlang开发实践
2009-11-11 10:04 3777从ecug归来,感觉不错,大家学习探讨的积极性很高哦。 很高 ... -
reltool用户指南
2009-11-02 22:27 6412说明,最近比较忙,没有太多时间更新blog,请各位朋友谅解. ... -
Erlang定时任务server (仿crontab语法)
2009-09-23 18:03 6400好久不写blog了,看到yufeng老大那么活跃,我也“耐不住 ... -
Erlang进程之错?
2009-07-27 15:06 3709前阵子erlang-china关于erla ... -
CNode指南
2009-07-27 14:13 3365好久不发文章,因为工作太忙。这个东西就凑凑数吧。各位见谅。 ... -
Erlang类型及函数声明规格
2009-06-08 22:41 9592Erlang类型及函数声明 ... -
使用etop查看系统中进程信息
2009-05-29 13:57 6200Erlang提供了丰富的开发工具,你认为没有的时候,很可能是你 ... -
创建gen_server组解决单process瓶颈
2009-05-27 17:05 5299并发和顺序是一个令人 ... -
又有人投入Erlang的怀抱了:37Signals Campfire loves Erlang
2009-05-14 23:00 3698就喜欢看这样的东西... This is so juicy ... -
list random shuffle实现
2009-05-07 13:41 4370在项目中需要对list进行随机shuffle,但是在erlan ...
相关推荐
《PyPI与CouchDB2:深入理解Python数据库接口及CouchDB2.1.8.2版本》 PyPI(Python Package Index)是Python开发者的重要资源库,它提供了丰富的Python软件包,使得开发者能够方便地下载、安装和分享代码。在PyPI中...
总的来说,couchdb-session-0.1.tar.gz是Python开发者用于在CouchDB中实现会话管理的一个工具,通过PyPI提供的服务,我们可以便捷地下载、安装和使用这个库,提升我们的开发效率。在实际项目中,了解和掌握这样的库...
通过阅读`go-couchdb-master`压缩包中的源代码,你可以更详细地了解库的内部实现,包括各个函数的工作原理和它们如何包装HTTP请求。此外,查看库的文档和示例代码也是学习如何使用`Go-couchdb`的好方法。 总的来说...
8. 观察者(Observer):了解如何使用观察者模式,实现数据变化的实时通知。 掌握这些知识点,用户将能够有效地利用Apache CouchDB构建高性能、高可用的应用程序。同时,不断关注和学习新的版本更新,以充分利用...
【PyPI官网下载 | tornado-couchdb-0.2.5.tar.gz】 PyPI(Python Package Index)是Python开发者发布和获取Python...学习如何将Tornado的异步特性与CouchDB的分布式存储能力结合,是提升Python项目技术栈的关键一步。
CouchDB是一款基于JSON文档的分布式数据库,其核心特性包括强大的文档存储、视图(View)功能以及自动冲突解决机制。通过HTTP协议,CouchDB提供了RESTful API,使得开发者可以轻松地进行读写操作。而couchdb-orm则...
此外,了解CouchDB的最佳实践,如合理设计文档结构、优化视图,也是提升应用性能的关键。 9. **错误处理与日志** 当使用 `laravel-couchdb` 时,需要注意处理可能出现的错误,如网络问题、数据库连接错误等。...
通过阅读《CouchDB权威指南》这本书,读者将能够深入了解CouchDB的原理、功能、优势以及如何在实际项目中有效利用这些特性。无论是初学者还是经验丰富的开发者,都能从中获得宝贵的知识和指导。
CouchDB是一款开源的、基于文档的分布式数据库系统,它采用了JSON作为数据格式,JavaScript作为查询语言,...通过深入学习这个压缩包中的资料,你可以全面了解并掌握CouchDB的各种特性和用法,成为数据库领域的专家。
本书全面覆盖了CouchDB的基本概念、安装配置、数据模型、查询方法、安全性以及高级特性等内容,适合从初学者到高级用户的各个层次读者阅读。 1. **基础概念**:介绍了CouchDB的设计理念、架构特点及与其他NoSQL...
《CouchDB权威指南》是一本全面介绍了CouchDB理论与实践的书籍,对于希望深入了解并掌握这款NoSQL数据库系统的读者来说是非常有价值的资源。通过学习本书,不仅可以掌握CouchDB的基本操作,还能了解到其在实际项目中...
3. 源代码分析:通过分析相关的源代码,可以更直观地了解CouchDB的工作原理,提升解决问题的能力。 4. 数据集:练习使用CouchDB处理不同类型的数据显示其灵活性和效率,例如模拟日志记录、社交网络数据存储等。 ...
CouchDB的核心特性包括分布式文档存储、自动冲突解决、实时同步以及强大的查询功能。 CouchDB的数据模型由“文档”组成,每个文档都是一个JSON对象,包含任意数量的键值对。这些文档可以独立存在,也可以组成数据库...
4. **分布式的特性**: CouchDB支持多节点部署,并且可以通过复制机制实现数据冗余,增强系统的可用性和容错性。 5. **事件最终一致性**: 在分布式环境中,CouchDB通过事件最终一致性模型来解决数据同步问题。 6. **...
总的来说,"Spring-And-Webapps"项目为学习者提供了一个实战平台,不仅可以学习到Spring框架的核心概念和使用方法,还能掌握NoSQL数据库CouchDb的使用,以及如何通过Ektorp实现Java对象与CouchDb的映射。这是一份...
CouchDB,一种基于JSON、JavaScript、RESTful和MapReduce的开源非关系型数据库,因其灵活性和分布式特性,被广泛应用于多个领域。然而,随着项目的发展,数据迁移成为一项必要的任务。此时,`flycouchdb`应运而生,...