别再用 MongoDB 了!

oschina
 oschina
发布于 2015年07月26日
收藏 84

Sven Slootweg (joepie91)是一名黑客,同时也是CrytoCC的创建者,现在提供Node.js代码评审服务。近日,他在个人博客上发表了一篇博文《为什么你应该永远、永远、永远不要再使用MongoDB》。在文中,他列举了如下理由:

  • 丢失数据(见12);

  • 默认忽略错误,假设每次写入都是成功的,在32位系统上,这可能会导致数据无声无息地丢失;

  • 即使是在MongoDB宣传的适用场景下,其性能依然不高(见34);

  • 几乎在所有的应用场景下,开发者都会被迫养成使用隐式模式的坏习惯(见4);

  • 存在锁问题(见4);

  • 对安全问题响应很慢(见5);

  • 不符合ACID(见6);

  • 扩展和维护困难;

  • JSON存储也不是MongoDB独有的功能,PostgreSQL、CouchDB也支持(见78)。

joepie91认为,MongoDB不仅存在诸多问题,而且并无突出之处。如果项目涉及用户账户或者两条记录之间存在某种关系,那么就应该使用关系型数据库,而不是文档存储;如果项目在使用Mongoose, 那么也应该使用关系型数据库,因为Mongoose只是使用文档存储模拟了有模式的关系型数据库。因此,大多数情况实际上需要的都是一个关系型数据库。在 这些情况下,PostgreSQL是个不错的可选方案。开发者可以使用查询构建器或ORM来简化使用过程,比如,在Node.js中,可以选用KnexBookshelfSequelizeWaterline。即使真得需要一个文档存储,那么也有比MongoDB更好的选项。 另外,他也不认为MongoDB适合于创建原型,因为如果生产环境使用不同的数据库,则还需要重写所有的代码。总之,MongoDB并没有什么适用场景。 它在技术上比不上其它可选方案,并没有提供真正有用的独有的特性,而且开发人员也无法确保数据一致性和安全。最后,joepie91指出,流行度并不等同 于质量,只能说明产品有一个不错的市场团队:

永远不要因为“其他人那样做”就使用一个数据库,对于一个特定的数据库,要自己研究它的优点和不足。

joepie91的观点在Hack News上得到了广泛的赞同。网友karmakaze也认为,有了PostgreSQL 9.4,就没有任何理由要使用MongoDB了(JSONB比BSON更合用),另外还可以使用CouchDB。对于MongoDB的具体限制,网友giaour建议阅读aphyr的系列文章Call Me Maybe,并指出,虽然存在已知的变通方案,但那大大降低了MongoDB的开发体验。网友Animats认为,如果站点的流量比维基小,那么使用某种关系型数据库就可以了。网友PebblesHD有类似的观点:

作为一个规模较小的部署……,只安装一个基本的MySQL有什么问题吗?在我们的内部维基上,我们每天的访问量已经超过了2万次……

但是也有一些不同的声音。例如,网友threeseed就表示,MongoDB仍然是最容易安装和使用的数据库之一。对此,joepie91回复如下:

以错误的方式做事,想不容易都难——MongoDB恰好就是那么做的。它不需要设置身份验证或表模式,因此才看上去“易于安装”。但实际上,为了节省10分钟,你正在浪费几个小时的时间。因为稍后,你将会遇到入侵(没有身份验证)或数据破坏……

Shodan报道也佐证了joepie91的这一说法,互联网上有将近3万个MongoDB实例没有启用任何的身份验证。这个问题随处可见,而且已经存在多年。

网友toyg则评论说:

我最近首次使用了MongoDB,是在一个内部项目里。我认为,没有模式确实显著了提升了开发速度……现在项目已经成熟,回过头来,我可以看到 为什么关系型数据库会更合适,但如果我从开始就使用RDBMS,那么我可能无法这么快地完成迁移。虽然切换到真正的RDBMS意味着要修改三两个类,但变 化不大。所以,我不同意MongoDB不适合原型开发的说法。

joepie91对“修改三两个类,但变化不大”的说法提出了质疑,因为根据自己从事代码审查的经验,迁移到不同的数据库通常需要大量的工作。至于切换速度,joepie91指出,在一个有回滚机制的系统中,可能会更快。

然而,在有些情况下,开发者并没有其它选择。例如,有网友就提出,Meteor就使用而且只能使用MongoDB。而由于同Hadoop的合作伙伴关系,MongoDB同Hadoop有很好的集成,因此,它在大数据分析领域非常流行。

另外,来自SourceGear的软件开发人员Eric Sink在读过的joepie91文章之后表示

(他所列举的内容)部分(也许全部)确有其事。事实上,现在,就假设他所写的都是正确的。我这里不是要说作者是错的。更确切地说,我这里想指出的是,这种博文只能让我了解很少有关MongoDB的知识,但却让我感受到了写这篇博文的人的许多情感。

他觉得,不能因为那些问题就彻底地否定MongoDB,毕竟:

MongoDB是顶级的NoSQL供应商。每天,成千上万的企业用它为数以百万计的用户提供服务。像所有有大量用户的新生软件一样,它有漏洞和缺陷。但它正稳步改善。任何有关技术缺陷的讨论,如果无助于解决问题,那么很大程度上只能是一种情绪的宣泄。

稿源:InfoQ

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:别再用 MongoDB 了!
加载中

精彩评论

netkiller-
netkiller-
用什么都无所谓,拿着微薄的工资,用最熟悉的技术,尽快干完活,下班回家带孩子。
我15年工作经历,不亦乐乎的使用各种技术实现相同的功能。用户注册,登陆,用户中心,内容管理,电商平台。

累了,烦了,不想再搞什么新技术了,当我回头看看15年,一事无成。
如果你还没有自己段产品,自己段团队,真的是失败的职业生涯规划。
劝各位,回头是岸:)
struct
struct
那么问题就来了,芒果TV还能看吗?

最新评论(80

snowingximen
snowingximen

引用来自“netkiller-”的评论

用什么都无所谓,拿着微薄的工资,用最熟悉的技术,尽快干完活,下班回家带孩子。
我15年工作经历,不亦乐乎的使用各种技术实现相同的功能。用户注册,登陆,用户中心,内容管理,电商平台。

累了,烦了,不想再搞什么新技术了,当我回头看看15年,一事无成。
如果你还没有自己段产品,自己段团队,真的是失败的职业生涯规划。
劝各位,回头是岸:)
是要有自己的东西:bowtie:
极客教程
极客教程
他扯他的犊子,我继续用我的mongoDB,河水不犯井水。哈哈
雷兽

引用来自“LongRaindy”的评论

他扯他的犊子,我继续用我的mongoDB,河水不犯井水。

引用来自“咚往咚来”的评论

小规模用可以,大规模绝对是个坑

引用来自“LongRaindy”的评论

谢谢提醒。我司6个项目,最大一个项目每天处理3亿条数据,所有数据分析和报表生成也是基于MongoDB来做,坑也碰到过,但是不能因为坑就否定一个方案。

引用来自“咚往咚来”的评论

做报表没有问题,但如果实时性的数据放到mongodb,当数据量很大的时候,坑就出来了。副本集同步数据延迟严重,从库连接与读取缓慢,同步阻塞等问题有可能你就很容易遇到了。上面这些基于mongo2.4,再高版本有没有改善不清楚。

引用来自“LongRaindy”的评论

类似的问题都遇到过,但可以通过一些手段来避开这些问题,达到一个稳定状态。用3.0版本做过大量的压测,基本没发现什么坑。

引用来自“咚往咚来”的评论

同步数据,在腾讯云CPU使用率100%有遇到过?

引用来自“LongRaindy”的评论

没有用过云平台。。。。。
敢用mongodb的好像越来越少了 哈哈哈
雷兽

引用来自“LongRaindy”的评论

他扯他的犊子,我继续用我的mongoDB,河水不犯井水。

引用来自“咚往咚来”的评论

小规模用可以,大规模绝对是个坑

引用来自“LongRaindy”的评论

谢谢提醒。我司6个项目,最大一个项目每天处理3亿条数据,所有数据分析和报表生成也是基于MongoDB来做,坑也碰到过,但是不能因为坑就否定一个方案。

引用来自“咚往咚来”的评论

做报表没有问题,但如果实时性的数据放到mongodb,当数据量很大的时候,坑就出来了。副本集同步数据延迟严重,从库连接与读取缓慢,同步阻塞等问题有可能你就很容易遇到了。上面这些基于mongo2.4,再高版本有没有改善不清楚。

引用来自“LongRaindy”的评论

类似的问题都遇到过,但可以通过一些手段来避开这些问题,达到一个稳定状态。用3.0版本做过大量的压测,基本没发现什么坑。

引用来自“咚往咚来”的评论

同步数据,在腾讯云CPU使用率100%有遇到过?

引用来自“LongRaindy”的评论

没有用过云平台。。。。。
很有兴趣问问仁兄是什么项目。。。。。
optcommit5
optcommit5
mongodb本身也在逐渐完善
n
newHank
自从用了mongodb,我发现回不到sql的怀抱了。可能层次还不够,没遇到很严重的问题
rxso2v1llm
rxso2v1llm
有问题不好好解决 在这写这种枪文有什么意义
javadeveloper
javadeveloper

引用来自“neo-chen”的评论

用什么都无所谓,拿着微薄的工资,用最熟悉的技术,尽快干完活,下班回家带孩子。
我15年工作经历,不亦乐乎的使用各种技术实现相同的功能。用户注册,登陆,用户中心,内容管理,电商平台。

累了,烦了,不想再搞什么新技术了,当我回头看看15年,一事无成。
如果你还没有自己段产品,自己段团队,真的是失败的职业生涯规划。
劝各位,回头是岸:)

引用来自“担山赶月”的评论

顶...
同意你的观点,加上或许有自己的技术拿手活也行。
้๊
้๊
呵呵
wangyan9110
wangyan9110
这篇文章就是一个问题列表,没讲清楚什么场景下出现这样的问题,没有拿出实测数据,没有说服力
返回顶部
顶部