为什么你不应该使用 MongoDB

本文转载自: http://www.oschina.net/translate/why-you-should-never-use-mongodb (只作转载, 不代表本站和博主同意文中观点或证实文中信息)

免责声明:我不构建数据库引擎,但搭建Web应用。每年我大约跑4-6个不同项目,所以我搭建了不少Web应用。我经历过有不同需求及不同的数据存储需求的应用。我部署过你听说过或没听说过的的大部分数据存储。

我也有几次做出了错误的选择。这是一个关于其中一次的故事——原本我们为什么选择它,我们是如何发现它不合适,以及我们如何修复的。这一切都发生在一个开放源码的名为Diaspora的项目中。

 

Diaspora项目

Diaspora 是一个有着悠久历史的分布式社交网络。早在2010年初,纽约大学四名大学生创建了一个Kickstarter视频,目的是募集10000美元,耗费一个夏天来构建一个替代Facebook的分布式项目。他们将它发送给朋友和家人,并希望有最好的结果。

但他们触到了痛处。当时正好有另一起关于Facebook的隐私丑闻,当尘埃落定,回到他们的Kickstarter项目时,他们已经从6400个不同的人那里筹集了超过200000美元,而同时这个软件项目,却连一行代码都还没有写出来。

Diaspora是第一个大大超越其目标的Kickstarter项目。其结局是,他们的项目新闻被刊登于纽约时报——但它变成了一个丑闻,因为团队照片的背景黑板上面有一个肮脏的笑话,直到最终印刷都没有人注意到这一点。这可是刊登在纽约时报!这个事件的余波实际上是我第一次听说到这个项目。

 

他们在Kickstarter上成功的结果,是离开学校,来到San Francisco开始写代码。他们最后在我的办公室工作。那时我在Pivotal实验室工作,他们的一个哥哥也在那工作,所以Pivotal给他们提供了免费的办公空间、网络,当然,装有啤酒的冰箱。我白天和官方客户工作,下班后和他们一起玩,周末贡献代码。

他们最后在Pivotal待了两年多的时间。虽然只是在第一个暑假的结尾,他们已经有了一个最小化的,但已经可以使用(在某种意义上说)的一个分布式社交网络,以Ruby on Rails实现,后端用MongoDB。

这里有很多流行词汇,让我们把它分解来看。

 

“分布式社交网络”

如果你看过《社交网络》,你就知道了所有你需要知道的关于Facebook的事。它是个web应用,它在一个单逻辑服务器上运行,它可以让你与朋友保持联系。一旦你登录,Diaspora的界面在结构上与Facebook很相似:

Diaspora用户界面的截图

在中间有个信息流,显示你所有朋友发布的信息,在边上有一些其他随机的基本没人关注过的东西。Diaspora和Facebook主要的技术差异在于对终端用户的不可见性:它是“分布的”部分。

 

Diaspora的基础设施并不在一个单独的网络地址上。有几百个独立的Diaspora服务器。代码是开源的,所以如果你愿意,你可以建立自己的服务器。各个服务器,被称作一个pod,有它自己的数据库和自己的用户集合,并可以与其他拥有各自数据库和用户集的Diaspora pod进行交互操作。

不同规模的Pod互相交流,而没有一个中央枢纽。

 

每个pod通过基于HTTP的API与其它pod通信。一旦你在一个pod上创建了一个帐号,它其实相当无聊,除非你关注一些其他人。你可以在你的pod上关注其他用户,而且你也可以关注其它pod上的用户。当你关注的人在另一个pod上发布一个更新时,将会发生这些事情:

  1. 该更新会进入作者的pod的数据库。
  2. 你的pod会通过API收到通知。
  3. 该更新被存入你的pod的数据库。
  4. 你可以看看近期活动,将会发现这个发布与你关注的其他人的发布混在一起。

评论按同样的方式运作。在任何单一的发布中,一些评论的评论人可能来自与发布作者相同的pod,而还有一些可能来自其他的pod。任何有权查看这个发布的人将会看到所有的评论,就像你期待的,好像每个人都在一个单一的逻辑服务器上一样。

 

谁关心?

这个架构有技术上和法律上的优势。技术上的主要优势在于容错机制

这是每个办公室都应该有的一个重要的容错系统。

如果pod中的任意一个宕机,这不会引起其他的也宕机。系统的生存,甚至期望,网络的分割。对于这,有一些有趣的政治上的暗示——例如,如果你在一个关闭了外接网络而无法访问Facebook和Twitter的国家,你的pod依旧会在本地运行,并和你所在国家内的其他人相连接,即使无法访问外部。

 

主要的法律优势是服务器的独立性。每个pod都是一个法律独立的实体,由其创建所在地的法律所掌管。每个pod也设置自己的服务条款。对于其中的大多数,你可以在不放弃对内容权限的条件下发布内容,这与Facebook不同。Diaspora是一个免费的软件,其意义在于“免费”和“自由”,而且大多数运行pod的人非常在意这种事情。

所以这就是这个系统的架构。我们再来从一个单一的pod看看这个架构。

 

这是一个 Rails 应用

每个pod都是一个Ruby on Rails应用,后端有一个数据库,最初是MongoDB。从某种程度来说,这个代码库是一个‘典型’的Rails应用——它同时具有一个可视化与可编程的UI,一些Ruby代码,以及一个数据库。但在其他方面,它决不是典型的。

一个 Diaspora pod的内部结构

视觉UI显然就是网站用户与Diaspora交互的方式。这个API被各种Diaspora移动客户端使用——这一部分相当典型——但同时它也被用于"federation"(联邦),这也是描述pod之间通讯的技术名词。(我有一次问过这与罗慕伦人的相似点在哪里,结果得到一堆白眼,擦。)所以说这个系统的分布式特性,给代码库增加了典型应用中所不存在的中间层。

当然,MongoDB是一种数据存储的典型选择。而绝大多数的Rails应用程序是由PostgreSQL(近来不常见)或MySQL所支持。

所以代码部分就是这样。我们再来考虑一下我们存储的是什么样的数据。

(译注:罗慕伦帝国是科幻系列《星际旅行》中虚构的外星帝国,2158年,罗慕伦帝国与当时的地球联邦发生了一场核战争。这场战争同时威胁到了其他的一些种族,并最终促使了星际联邦的建立。2160年罗慕伦人被打败,后与星际联邦签订合约并划定中立区。)

 

我不认为单词的意思是你认为的意思

“社交数据”是关于我们朋友、他们朋友和他们活动的网络信息。从概念上来看,我们确实认为它是一个网络——一个以我们为中心,朋友围绕在我们身边的无向网络。

所有照片来自rubyfriends.com。感谢Matt Rogers、Steve Klabnik、Nell Shamrell、Katrina Owen、Sam Livingston-Grey、Josh Susser、Akshay Khole、Pradyumna Dandwate和Hephzibah Watharkar对#rubyfriends的贡献!

当我们存储社交数据时,我们存储的是那个图的拓扑结构,和那些随着边移动的活动信息。

时间: 2024-10-21 02:17:20

为什么你不应该使用 MongoDB的相关文章

ubuntu安装mongodb

参考:http://blog.csdn.net/zhushh/article/details/52451441 1.导入软件源的公钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 2.为mongodb创建软件源list文件 ubuntu12.04 echo "deb http://repo.mongodb.org/apt/ubuntu precise/mongodb-org/3.2 multi

mongodb 安装、windows服务、创建用户

http://www.cnblogs.com/best/p/6212807.html 打开MongoDB的安装目录如“C:\Program Files\MongoDB\Server\3.4\bin”,并在此目录下新建一个mongo.config文件,文件内容如下: ##数据库目录## dbpath=C:\data\db ##日志输出文件## logpath=C:\data\log\db.log 使用cmd进入命令行 使用cd切换目录到安装目录下,如:cd  C:\Program Files\Mo

MongoDB 学习笔记之 WriteConcern

WriteConcern: 转载:MongoDB WriteConcern(写关注)机制 http://www.ywnds.com/?p=3688&viewuser=40 MongoDB部署模式 MongoDB的部署模式有三种:第一种是单机模式(开发测试):第二种是高可用复制集:第三种是可扩展分片集群.如下图所示. 知道了MongoDB几种常用的部署模式之后,接下来我们看看每种部署模式的写操作过程. MongoDB单点写操作 从上图可以看出,其中primary是MongoDB的一个实例,里面有两

MongoDB副本集

简介 mongodb复制(replication)是将数据同步在多个服务器的过程.主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致.复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并保证数据的安全性.复制还允许您从硬件故障和服务中断中恢复数据. 而副本集(replica set)是从mongodb 1.6 提供的新功能,比复制功能要强大一些并增加了故障自动切换和自动修复成员节点,

mongodb 学习

该命令如果数据库不存在,将创建一个新的数据库, 否则将返回现有的数据库.如果想创建一个数据库名称为 <mydb>, 那么 use DATABASE 语句应该如下: >use mydb switched to db mydb=============================================================================要检查当前选择的数据库使用命令 db >db mydb============================

MongoDB之update

Update操作只作用于集合中存在的文档.MongoDB提供了如下方法来更新集合中的文档: db.collection.update() db.collection.updateOne() New in version 3.2 db.collection.updateMany() New in version 3.2 db.collection.replaceOne() New in version 3. 你可以通过指定criteria或者filter来指定你想更新的文档: update函数执行

MongoDB 数据分发

在MongoDB(版本 3.2.9)中,数据的分发是指将collection的数据拆分成块(chunk),分布到不同的分片(shard)上,数据分发主要有2种方式:基于数据块(chunk)数量的均衡分发和基于片键范围(range)的定向分发.MongoDB内置均衡器(balancer),用于拆分块和移动块,自动实现数据块在不同shard上的均匀分布.balancer只保证每个shard上的chunk数量大致相同,不保证每个shard上的doc数量大致相同. 一,数据按照chunk数量进行均衡分发

MongoDB 搭建分片集群

在MongoDB(版本 3.2.9)中,分片是指将collection分散存储到不同的Server中,每个Server只存储collection的一部分,服务分片的所有服务器组成分片集群.分片集群(Sharded Clustered)的服务器分为三中类型:Router(mongos),Config Server 和 Shard(Replica Set 或 Standalone mongod).使用分片集群,不需要使用强大的计算机,就能存储更多的数据,处理更大的负载.分布式数据库系统的设计目的是:

MongoDB 维护Replica Set

在每个MongoDB(版本 3.2.9) Instance中,都有一个本地数据库(local),用于存储 Replication 进程的信息和本地数据.local 数据库的特性是:位于local数据库中的数据和集合不会被 Replication 进程复制到其他MongoDB instance上.如果实例上有些collection 和 data不计划被复制到其他MongoDB Instance,可以将这些collection 和 data 存储在local 数据库中. MongoDB shell提

MongoDB 分片管理

在MongoDB(版本 3.2.9)中,分片集群(sharded cluster)是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片(shard)上,每个分片只保存数据集的一部分,MongoDB保证各个分片之间不会有重复的数据,所有分片保存的数据之和就是完整的数据集.分片集群将数据集分布式存储,能够将负载分摊到多个分片上,每个分片只负责读写一部分数据,充分利用了各个shard的系统资源,提高数据库系统的吞吐量. 数据集被拆分成数据块(chunk),每个数据块包含多个doc,数