couchdb

简介: couchdb                  CouchDB是用Erlang开发的面向文档的数据库系统,CouchDB一种半结构化面向文档的分布式,高容错的数据库系统,其提供RESTFul HTTP/JSON接口,所以它一直倍受用户的青睐。

couchdb

 
 
 
 

 

       CouchDB是用Erlang开发的面向文档的数据库系统,CouchDB一种半结构化面向文档的分布式,高容错的数据库系统,其提供RESTFul HTTP/JSON接口,所以它一直倍受用户的青睐。

 

1简介

CouchDB是用Erlang开发的面向文档的数据库系统,最近刚刚发布了1.0版本。CouchDB不是一个传统的关系数据库,而是面向文档的数据库,其数据存储方式有点类似lucene的index文件格式,CouchDB最大的意义在于它是一个面向web应用的新一代存储系统,事实上,CouchDB的口号就是:下一代的Web应用存储系统。

2特性

RESTFul API:HTTP GET/PUT/POST/DELETE + JSON

基于文档存储,数据之间没有关系范式要求

每个数据库对应单个个文件(以JSON保存),Hot backup

MVCC(Multi-Version-Concurrency-Control),读写均不锁定数据库

用户自定义View

内建备份机制

支持附件

使用Erlang开发(更多的特性)

应用场景

在我们的生活中,有很多document,比如信件,账单,笔记等,他们只是简单的信息,没有关系的需求,我们可能仅仅需要存储这些数据。这样的情况下,CouchDB应该是很好的选择。当然其他使用关系型数据库的环境,也可以使用CouchDB来解决。

特色

在某些偶尔连接网络的应用中,我们可以用CouchDB暂存数据,随后进行同步。也可以在Cloud环境中,作为分布式的数据存储。CouchDB提供给予HTTP的API,这样所有的常见语言都可以使用CouchDB。

使用CouchDB,意味着我们不需要在像使用RMDBS一样,在设计应用前首先设计负责数据Table。我们的开发更加快速,灵活。

3实现

在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,以及其他各种系统相关的信息。

4结构

数据库文件的后缀为.couch,由Header和Body组成。

Header

包含两个完全相同的Header信息,每个Header的Size为2048

Header中前4字节为magic code:$g, $m, $k, 0

随后为header的payload,通过term_to_binary(db_header_record)产生

接下来是填充padding

最后是16字节的摘要信息(md5(payload+padding)产生)

Header总长度为:单个Header * 2 = 2048

Body

由两个B+Tree组成,其中一个B+Tree根据Document id进行组织,另一个B+Tree以 seqnum(CouchDB内部使用的序号,用来指示最新Revision的文档)为 key。

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。

CouchDB所有的更新操作(包括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,可能会导致你的硬盘空间耗尽,一定注意哦!

5ACID

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文件。

6View 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

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变量不同这里有两种情况:

1. 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)

2. rereduce为true

key为null

values为array,element为前一次reduce返回的结果

比如reduce(null, [intermediate1,intermediate2,intermediate3], true)

很多时候,我们一次调用reduce就可以生成最终结果,我们会忽略rereduce参数。[1]

目录
相关文章
|
网络协议 Unix Linux
十几个免费好用的抓包工具
十几个免费好用的抓包工具
|
监控 Java Docker
从零开始,用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合
从零开始,用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合
2312 0
|
10月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
2160 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
前端开发
前端基础(五)_CSS文本文字属性、背景颜色属性
本文详细介绍了CSS中关于文本和背景颜色的样式属性。包括字体大小、字体族、字体加粗、字体样式、文本行高、`font`属性、文本颜色、文本对齐方式、文本装饰线、首行缩进等文本属性,以及背景颜色、背景图片、背景重复、背景位置等背景属性。文章通过示例代码展示了这些属性的具体应用和效果。
509 3
前端基础(五)_CSS文本文字属性、背景颜色属性
|
弹性计算 固态存储 数据可视化
阿里云服务器价格表(收费标准报价)
阿里云ECS云服务器价格是用户关心的,新手站长来说说阿里云服务器官方报价及优惠折扣后的价格,详细如下: 阿里云服务器价格组成 新手站长先介绍云服务器官方报价(包括按量付费和包年包月的价格),然后再分享优惠活动中云服务器优惠价格。
50538 0
|
域名解析 网络协议 数据安全/隐私保护
DNS解析问题之授权RAM子账号管理指定域名如何解决
DNS解析是指将人类可读的域名转换成机器可读的IP地址的过程,它是互联网访问中不可或缺的一环;本合集将介绍DNS解析的机制、类型和相关问题的解决策略,以确保域名解析的准确性和高效性。
745 1
|
关系型数据库 Linux 网络安全
Linux | 安装openGauss数据库【极简版】
Linux | 安装openGauss数据库【极简版】
|
存储 弹性计算 分布式计算
阿里云海外地域云服务器最新优惠价格表及收费标准(2023更新)
阿里云海外地域云服务器优惠价格更新,2核4G配置3171.04元1年起;2核8G配置3905.83元1年起;2核16G配置9010.16元1年起,本文详细为大家介绍了阿里云海外地域云服务器的最新优惠价格及收费标准,以供参考。
阿里云海外地域云服务器最新优惠价格表及收费标准(2023更新)
|
关系型数据库 MySQL 数据库
从零开始搭建自己的NextCloud个人云盘
本文介绍了从零开始搭建自己的NextCloud个人云盘,包括场景介绍、目标读者、环境准备、操作步骤和方案验证5大方面。
17326 1
从零开始搭建自己的NextCloud个人云盘