阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

开发者 Hasen 谈为什么选择 CouchDB

  • 2012-09-06
  • 本文字数:2385 字

    阅读完需:约 8 分钟

Hasen 是一名熟知分布式技术、Go 语言的开发者,他最近在自己的博客上发布了一篇文章,谈到为什么要选择 CouchDB 作为自己的数据库。

我一直痛恨 SQL,所以我总是对 NoSQL 运动充满兴趣。

我知道 2 个基于 JSON 的 NoSQL 数据库:MongoDB 和 CouchDB。

我曾试着学习 MongoDB,当时我也在学习 NodeJS——巨大的错误,浪费我很多时间。不管怎么说,MongoDB 的 API 不错,但是我不喜欢它的查询语言, 跟 SQL 差不多,拖沓、冗长、僵化难懂。最后我实在没法用 MongoDB 做出什么像样的东西,因为我试着用它跟 Node 一起,可我在 NodeJS 上门的体验实在不怎么样。究其原因,是因为 NodeJS 的设计,因此我没用起来 MongoDB 不是 MongoDB 的问题,而是 NodeJS 的问题。

学习 CouchDB,也是因为 Hasen 的一个舍友跟他提起的,他从看 CouchDB 的官方手册开始: http://guide.couchdb.org/

打动 Hasen 的,是 CouchDB 的如下特性:

首先,它是纯 JSON 文档存储。也就是说所有的文档都是 JSON,而且可以有任意数量的字段,你也可以随意向现有文档中加入新字段。没有 schema,因此不需要管理迁移问题。

其次,它的“视图”系统。CouchDB 中的视图可以创建第二索引,而且是执行查询的惟一方式(不是通过文档的 _id 来加载它)。视图基本上是 map 函数的缓存结果。

举个例子,比如你在一个所有者和一堆物品之间有多对一的关系,每件物品都会在一个字段中保存所有者 id。该如何按照所有者查询物品列表?你可以创建一个视图,匹配 owner_id 和 item_id,使用 owner_id 查询该试图。这也就是说,对于任何查询,都要先创建一个视图。不能像 SQL 数据库或是 MongoDB 那样随意查询。这可能有好有坏,要看你的心情。我个人认为挺好的,因为这让索引变得简单。

我在传统 SQL 数据库中见到不少如下问题:有时候,一个极其庞杂的查询成为瓶颈,对性能产生极坏影响。有时候你需要抽丝剥茧,看看问题到底在哪里;有时候,你会发现是查询写得太烂了;有时候,你只要往某个表中加个索引即可。

这种悲剧我可不想碰见。

因此,视图系统的好处在于:强迫你把查询变简单,而且易于分析。

第三,CouchDB 的架构在某种意义上是“分布式”的,与 git 的分布方式很类似。当然,总要从一个数据库示例开始,但是如果要加入其他数据库节点,CouchDB 的设计让自己很容易做到分布式。

像 Git,是因为所有节点都是“master”节点,没有“slave”节点;跟 Git 一样,没有哪个 repo 比其他 ripo 更重要。

同步是由一个节点向其他节点推送变化完成的,这很类似于 Git 的 repo 推送、拉取变更的过程。在 CouchDB 中,这种推送叫“复制(replication)”。它会把所有的“新”文档和现有文档的“新版本”推送出去。CouchDB 中有修订版本概念。改变一个文档,CouchDB 会在内部增加一个新的修订版本保存起来,不删除或覆盖已有修订版本。不过,CouchDB 不保证任何旧文档会一直保存,它们被看成“垃圾”并会在以后回收。

不过,这种分布式特性有其代价:数据在不同节点间不一定总是一致的,可能有些节点数据过期,但如果经常复制,可以确保数据节点的最终一致性。

从整体上看,我不认为这是个大问题,而是一个特性,任何基于 web 服务的底层架构设计都应该以其为基础。

Hasen 指出:web 服务和应用都面临扩展性方面的问题,而且即使是一些简单的交互多媒体页面,也会让服务器承受很大压力。他接下来对比了单机视频游戏和 Web 服务在这方面的不同:

首先,web 开发人员多使用动态解释语言,比如 Python 和 Ruby,这些语言的设计目的不是为了运行高性能服务。

其次,视频游戏一次只需要处理一个大型复杂任务。而在 web 服务中,需要把一个相对简单的任务同时做几十万遍,而且是在一个机器上。当然,这么做很愚蠢,要加入更多机器节点,把负载分到这些节点上,各个节点之间不需要通信,每个节点可以处理分配给自己的任务。做不到这几点,就不是分布系统了。

不过,目前的数据库都不是我们应该需要的数据库:只有一个 master,这就是瓶颈。即使只需要向一个 master 数据库写入,可以从其他节点读,仍然有瓶颈。

Hasen 认为这不是正确的分布式做法,要想解决每秒处理几十万个简单的页面请求,架构上必须做到水平扩展:应该可以加入更多节点,而且每个节点都可以自行决策。

如果你只有一个 master 节点,你的分布式就做得有问题。

即使你必须保证 user-id 的全局唯一性,也可以以分布式方式实现。

Hasen 对 Riak 也很欣赏,认为 Riak 的分布式实现很简单,也容易掌握。不过他还是选择了 CouchDB:

对我来说,Riak 的问题是它没有 CouchDB 那样的“视图”。Riak 中可以做 map-reduce 类似操作,但是太影响性能了,在 CouchDB 中,视图是预先计算好的 map-reduce 查询,而且效率很高。

Riak 超出 CouchDB 的,是 Riak 内置集群支持。在 CouchDB 中,没有。……虽然这可能是 Riak 相对 CouchDB 的短处,但是我还是认为视图的好处超过这一点。

而且,还有 BigCouch 项目,它的分布式实现非常出色。

因此,如果要扩展到几十万用户,我可以选用 BigCouch。也许将来 BigCouch 会合并到 CouchDB 中。我也可以自己实现集群和分布式。

Hasen 的文章最初发表后,有人留言指出 MongoDB 也支持水平扩展,是以自动分片(automatic sharding)方式。

对此,Hasen 的回复是:

使用 CouchDB,你也可以分片或是分区。实际上,使用 CouchDB 更简单,因为用了一致性哈希。在 Couch 中做分区的问题是:如果查询一个视图,必须查询所有的分区。考虑到我上面说的“每个节点必须在本地自己完成计算”,这听起来不怎么样。

不过,要记住复制功能。你可以在北美有一个分布集群,在欧洲、亚洲各有一个分区集群。这些集群可以在任何时候保证互相复制。因此,视图查询在每个集群内部的本地化的,这正是分布式精神之所在。

在我目前看来,MongoDB 还做不到这一点。

InfoQ 的读者们,你们是否有 MongoDB 和 CouchDB 的使用经验?对于 Hasen 的观点,你们同意吗?

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2012-09-06 22:514939
用户头像

发布了 479 篇内容, 共 152.4 次阅读, 收获喜欢 47 次。

关注

评论

发布
暂无评论
发现更多内容

阿里P8手抄本惨遭泄露,并出现病毒式传播,致28人斩获大厂offer

Java架构师迁哥

“京东商城”亿级高并发秒杀系统到底是怎么设计的?自己做该如何下手?

Java架构师迁哥

接任务时一定要锁定需求啊!(转自小明同学)

BinTools图尔兹

数据库 dba 国产数据库 运维开发

Redis学习之Redis概述及原理、基本操作及持久化

Linux服务器开发

redis 分布式 后端 中间件 Linux服务器开发

MindSpore教程免费学,还有入门奖品

Geek_6cdeb6

人工智能 机器学习 深度学习 自我提升 羊毛

构筑智能制造时代“四重护城河”,联想中国开创产业新格局

科技大数据

免费分享JDBC与MyBatis的优秀图书

Java入门到架构

Java

2021年,BAT接连入局!“低代码”为何能备受资本追捧?

优秀

低代码

32岁的我裸辞了,八年Java老鸟,只因薪水被应届生倒挂,在闭关三个月后拿到阿里Offer,定级P7!

Java架构师迁哥

2021百度云智峰会|DataPipeline携手百度赋能实时数据资产构建与应用

DataPipeline数见科技

大数据 数据融合 数据管理

半年摸爬滚打,我是如何从小白进阶渗透测试工程师

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞分析

图的应用——拓扑排序

若尘

数据结构 拓扑排序

爆款阿里P5到P7晋升之路,九大源码文档助我超神果然努力幸运并存

Java BAT

【架构实战营】第 7 模块作业

swordman

架构实战营

一周信创舆情观察(6.28~7.4)

统小信uos

越学越有趣:『手把手带你学NLP』系列项目07 ——机器翻译的那些事儿

百度大脑

机器学习 nlp

DataPipeline实时数据融合平台V3.0里程碑版发布!澎湃新动能

DataPipeline数见科技

大数据 数据融合 数据管理

用好“实时数据管理”助推器,旭辉集团加快数字化转型步伐

DataPipeline数见科技

大数据 数据融合 数据管理

Hightopo可视化入局“智慧工厂”,助力企业改革创新

一只数据鲸鱼

数据可视化 绿色工业 3D数据可视化 高炉炼铁 智慧工业

正式发布!中国首个LF Edge捐赠项目Baetyl 2.2发布

百度开发者中心

物联网 开源技术

技术干货 | 录屏采集实现教程 —— Android端

ZEGO即构

大前端 音视频 录屏采集 Android端

我是如何从设计师转到软件行业的? | 可怜巴巴的程序猿

Python研究所

随笔 话题讨论

5分钟学会本地Pypi源搭建

Python研究所

Python

北鲲云超算平台——让科技更好地服务于用户

北鲲云

TDengine JDBC整合Druid

山石道人

涛思数据 tdengine Druid Spring MVC taos-jdbc

一图读懂DataPipeline实时数据融合平台V3.0

DataPipeline数见科技

大数据 数据融合 数据管理

“用友 • 华为云杯”第三届企业云服务开发者大赛

ToB行业头条

开发者 低代码 用友

再获权威认可!DataPipeline实时数据融合平台通过信通院大数据产品能力评测

DataPipeline数见科技

大数据 数据融合 数据管理

云南智慧公安研判分析系统搭建,重点人员研判分析平台

Mobileye智慧出行再加码,中国市场生态建设取得新进展

E科讯

聊聊事务与分布式系统-从零讲到通透

刘绍

sql 分布式 事务 2PC XA

开发者Hasen谈为什么选择CouchDB_语言 & 开发_郑柯_InfoQ精选文章