MongoDB技术发展

MongoDB技术发展简介

2007 年,MongoDB 公司的前身 10gen 正式成立,2009 年 2 月开源数据库 MongoDB 1.0 正式面世,以开源的方式进入市场接受考验。时至今日,MongoDB 已经从一个在数据库领域籍籍无名的 “小透明”,变成了话题度和热度都很高的 “流量” 数据库。

2009 年 2 月,MongoDB 数据库首次在数据库领域亮相,打破了关系型数据库一统天下的局面;

2014 年 12 月, MongoDB 收购了 WiredTiger 存储引擎,大幅提升了 MongoDB 的写入性能;

2016 年, MongoDB 推出 Atlas,在 AWS、 Azure 和 GCP 上的 MongoDB 托管服务;

2018 年 6 月, MongoDB 推出 ACID 事务支持,成为第一个支持强事务的 NoSQL 数据库;

2018 年 11 月,MongoDB 将其开源授权修改为 SSPL;

10 年间,MongoDB 的每一次创新几乎都引起了业界的讨论。当然除了好消息,MongoDB 也有一些其它的声音传出,例如 2017 年广为人知的 “MongoDB 赎金” 事件,因默认不需要用户名密码登录的设置,屡次发生的企业数据泄露事件。

MongoDB技术发展

众所周知,数据库是所有软件中除了操作系统之外最复杂的软件。按照 DB-Engines.com , 一个专门跟踪数据库流行程度并每月发布数据库排名的一个网站的统计,排名前 5 的数据库分别为 Oracle, MySQL, SQLServer, PostgreSQL 和 MongoDB。

从一个名不经传的科技创业公司,到今天可以说是家喻户晓的知名数据库厂商;从一个籍籍无名的小透明数据库,到现在成长为各大公司争相采用的数据库产品,MongoDB 到底经历了怎样的发展历程?

技术发展重要节点及事件

文档数据库鼻祖的诞生

2007 年, 10gen 创始人 Eliot 和 Dwight 在寻找一个能够支持他们的云计算平台的海量数据库。不奇怪,当时成熟的数据库基本上都是基于单机架构的传统关系型数据库如 Oracle, MS SQLServer 等。即便 Oracle 支持一些集群部署,其扩展性也仅限于 2 到 4 台服务器的范围。在没有很好的解决方案的情况下,10gen 的创始人决定自己研发一个数据存储服务,能够把开发者使用的程序对象数据存到一个类似于数据库的地方,并提供非常易用的 API 让开发者可以对数据进行常见的增删改查操作。

为了最大程度方便开发者,Eliot 决定使用 JSON 作为数据格式来存储。JSON 的数据在英文中被称之为 JSON Document,这也是文档数据库名字的由来。 事实上证明这个基于 JSON 的选择,成就了一家伟大的新型数据库公司。

MongoDB自动分片

2010 年 8 月, 10gen 发布了 MongoDB 1.6,第四个大版本。这个版本最大的一个功能就是 Sharding,自动分片。在关系型数据库中,当数据量达到一定程度,单个节点服务器资源充分饱和无法保证及时的服务响应时间时,通常会采用分区分表的数据库优化方案。但是这些方案都是侵入式的,很多时候意味着应用程序需要做较大的改动,来配合数据库端的改动。

而 MongoDB 的自动分片,可以在一个集群的几个分片服务器内自动进行数据的分布和均衡。在尽可能把数据均匀的分布到多个存储节点的同时,为应用开发者提供无缝的体验。开发者无须关心数据的具体位置,程序也不需要因为分片与否而进行修改。采用分片技术,开发者可以很容易使用数十甚至数百个节点。早期的用户如百度就是基于这种分片技术,为 3 亿多用户、3000 亿条数据量的百度云盘文件元数据管理提供有效的集群解决方案。

MongoDB支持存储引擎

2014 年 12 月,MongoDB 收购了 Keith Bostic 和 Michael Cahil 的 WiredTiger 存储引擎团队,并将其集成到 3.0 版本中,成为一个新的存储引擎。

在此之前,MongoDB 在存储层使用的是操作系统自带的 MMAP API 进行数据落盘持久化工作。从功能实现角度,使用 MMAP 使得早期团队可以集中注意力在 MongoDB 的 API、查询、索引计划、数据同步等上层逻辑。但是随着 MongoDB 使用场景的增多以及数据量的增加,MMAP 在大量写入场景下的性能瓶颈日益凸显,同时也成为了早期很多性能槽点的根源之一。

WiredTiger 的引入是 MongoDB 走向一个成熟数据库的最重要的里程碑。在性能上,WiredTiger 较之老版本的 MongoDB 提升了 7-10 倍,有效地解决了之前 MMAP 在大量写入下的性能瓶颈。

值得一提的是,Bostic 和 Cahil 在之前曾把他们的前一代产品 BerkerlyDB 卖给了 Oracle。Oracle 随后推出以 BerkerlyDB 为核心的 Oracle NoSQL 数据库。Oracle NoSQL 基本上是一个未被人听说过的产品。从这一点上似乎证明了,对广大开发者来说,首先要有一个易用的数据库,然后才是一个高性能的数据库。

MongoDB支持Join

2015 年 12 月,在发布的 3.2 版本中,在 MongoDB 的聚合框架(Aggregation)中增加了一个不起眼的操作符: $lookup。 这个看上去虽小,但是意义巨大的功能意味着第一次作为一个 NoSQL 数据库,MongoDB 终于开始支持了关系型数据库的核心功能:关联。从 3.2 开始,你可以一次同时查询多个 MongoDB 的集合(表),不用像以前那样,如果有多表查询需要在代码中发起多个数据库查询,然后在内存中进行手工关联。

MongoDB成功上市纳斯达克

2017 年 10 月,MongoDB 成功在纳斯达克敲钟,成为 26 年来第一家以数据库产品为主要业务的上市公司。一年多后再看,MongoDB 的股价蹭蹭蹭的升了 4 倍多。如果我们和 Cloudera / Hortonworks 比较,两家以 Hadoop 产品为主要业务的大数据科技公司,两家现在加起来的市值,尚不如一个 MongoDB。这是为什么?

最大的原因就是基于 Hadoop 产品的目标场景是大数据分析,首先用大量低成本存储聚集所有企业内外部数据,然后用 MapReduce 技术来对客户进行画像,贴标,或者制作一些统计报表。虽然这些场景确有价值,较之于 MongoDB 驱动的操作型场景,如新型手机应用,游戏,物联网,数字化银行等,无疑 MongoDB 支撑的是直接面向客户的,更加有业务价值的应用。

MongoDB赎金事件

随着 MongoDB 的用户数量持续快速增长,日渐成为企业的标准数据库,MongoDB 的负面事件也不断。2017 年网络上流传最多的就是所谓的赎金事件。黑客们侵入用户的 MongoDB 数据库,把数据全部删掉,然后留下一条消息,要求用户用比特币支付价值几千美元的赎金,才将数据库数据恢复。

究其根底, 这个其实和很多 MongoDB 数据泄露,如后来的 58 同城 2 亿份简历事件,具有同样的技术原因:MongoDB,为了最大程度上方便程序员快速开发应用,默认方式下不需要设置用户名密码登录。这样一来,很多粗心的程序员,特别是创业公司,往往在系统正式上线时候也没有启用鉴权。就譬如你买了一套房子却没有使用门锁一样。只要稍具一些安全常识,就可以妥善防范数据在公网上泄露

MongoDB支持ACID多行多表强事务

2018 年 6 月,MongoDB 推出 4.0 版本。和 3 年前有点类似,本来要发布 2.8 版本的,结果因为引入 WiredTiger 存储引擎,版本改成了 3.0。 按原计划本该发布 3.8 的,但是由于引入了千呼万唤始出来的多文档 ACID 强事务机制,MongoDB 决定版本改为 4.0.

ACID 事务机制已经是关系型数据库如 Oracle, SQLServer,PostgreSQL 的标配。之前 MongoDB 对事务的支持仅限于单文档内。如果你在开发一个电商应用,在一笔交易内要完成插入订单,扣库存,推送到消息队列等操作,原先的 MongoDB 版本无法保证这几个步骤的原子性,也没有出错情况下的回滚机制。 因为这个功能的缺失,很多开发者或架构师会在交易性的业务中有意避开 MongoDB。而随着 4.0 的发布,MongoDB 终于可以挺起胸昂起背,向世界宣布 MongoDB 正式成为第一阶层操作型数据库,可以用来支撑几乎所有的业务场景。

SSPL开源协议

2018 年末 MongoDB 又一次被推上风口浪尖。这一次是 MongoDB 在 10 月份发布了其修改版开源协议:从 AGPL 到 SSPL。对于大多数开发者来说,他们可能都不清楚他们一直以来用的 AGPL 到底是什么样的一个开源协议。简单一点来说,对于 AGPL,如果不去修改 MongoDB 的源码,用户基本上就是在符合开源协议的情况下使用 MongoDB。但是一旦涉及到源码的改动,比如说很多云厂商在推出 MongoDB 服务的时候,为了满足自己环境、性能、场景及管理的需求,几乎无法避免不去修改源码。这样情况下,按照 AGPL,云厂商必须对外公布你的改动,以及相关联的软件。但是 AGPL 里面对于这一部分有一些比较模糊的地方,以至于很多云厂商并没有按照游戏规则来进行开源。在这样的情况下,MongoDB 推出了基于 AGPL 上的修改版:SSPL。

对于绝大绝大部分的开发者或企业,SSPL 和 AGPL 没有任何区别。只有那些在公有云上提供 MongoDB 托管服务 (MongoDB as a Service) 的公有云厂商会在 SSPL 协议下受到影响:要么和 MongoDB 达成商业合作采用商业协议,要么开源其所有云管理解决方案。

当然,MongoDB 不是唯一的一家开源软件公司针对云厂商改变开源协议。MongoDB 之前有 Redis,之后有 Kafka,都在类似的背景下作了开源协议修改。目前看来,开源社区似乎并不太喜欢这种商业化的运作,但是开发者可以记住:MongoDB 技术本身并无过错,还是以前的那个开源的 MongoDB,还是可以在你的应用中帮你解决切实的数据管理问题。

MongoDB社区发展

MongoDB 的成功,很大程度上是开发者社区起了非常关键的作用。MongoDB 则从一开始就全力以赴支持了开源社区,上到 CTO,下至开发工程师,大家在社区里,论坛上,邮件组里热心的为用户提供技术支持,吸取用户的反馈。