MongoDB简史

2020 年 10 月 09 日

MongoDB简史

说到现代 Web 应用程序开发,不得不提到 MongoDB。如果你是一名全栈程序员,每天都会跟 MERN 打交道,其中 M 指的就是 MongoDB。MongoDB 开源社区版为大量的 Web 应用程序提供支持。从 2007 年开始,MongoDB 走过了漫长的道路。它是 MongoDB 公司的主要产品,这家公司市值已经超过 100 亿美元。与很多产品一样,在线广告是推动 MongoDB 愿景和发展的关键催化剂。MongoDB 的故事很有趣,在本文中,我将带你一起探索 MongoDB 的发展之旅。

开端:大型数据库想法的萌芽

MongoDB 的故事开始于 2007 年。1995 年,Dwight Merriman 和 Kevin O’Connor 创办了著名的在线广告公司 DoubleClick。不久后,Kevin Ryan 也加入了这个团队 (Dwight 和 Kevin 后来共同创办了 5 家公司——Gilt、10gen、Panther Express、ShopWiki 和 Business Insider)。DoubleClick 很快就大获成功,几年之内,它的广告流量达到了每秒 40 万条。当时的关系型数据库技术还没有预料到会有如此大规模的流量。配备如此规模的关系数据库需要大量的资金和硬件资源。因此,Dwight(他是当时的 CTO) 和他的团队开发了自定义数据库实现来扩展 DoubleClick,以应对流量的激增。

2003 年,Eliot Horowitz 在大学毕业之后加入 DoubleClick 的研发部门,成为一名软件工程师。两年后,他离开了 DoubleClick,和 Dwight 一起创办了 ShopWiki。他们都意识到,他们在一次又一次地解决同样的水平伸缩性问题。因此,2007 年,Dwight、Eliot 和 Kevin Ryan 一起创办了一家叫作 10gen 的新公司。10gen 专注于提供一个带有自有应用程序和数据库栈的 PaaS 托管解决方案。10gen 很快引起了风险投资人 Albert Wenger(Union Square Ventures) 的注意,他向 10gen 投资了 150 万美元。以下是 Albert Wenger 在 2008 年写的有关 10gen 投资的文字:

今天,我们很高兴地宣布,我们将为一支特立独行的团队提供支持,也就是 10gen 的一班天才们。他们汇聚了构建互联网规模系统的经验,比如 DART、Panther Express CDN,广泛参与了开源活动,包括 Apache 软件基金会。他们正在为云计算构建一个开源技术栈,包括一个应用服务器和一个数据库,它们都是基于现代硬件能力和构建 Web 站点或服务的经验从头开始开发的。应用服务器最初支持服务器端 JavaScript 和 Ruby(实验性的)。数据库采用了一种有趣的设计来存储对象,这种设计在快速随机访问和高效的集合扫描之间做出了平衡。

Albert 所说的“采用了有趣的设计的数据库”实际上指的就是 MongoDB。从 2007 年到 2009 年,这个新数据库迅速发展。Dwight 第一次提交的 MongoDB 代码可以在这里看到

MongoDB 的核心引擎是用 C++ 开发的。之所以把这个数据库叫作 MongoDB,是因为他们想用它来为一些典型的应用场景 (如内容服务) 提供海量数据的存储服务。最初,这个团队只有 4 名工程师 (包括 Dwight 和 Eliot),并只专注于 MongoDB 数据库。他们的商业理念是通过开源免费下载的方式来发布数据库,并在这个基础上提供商业支持和培训服务。

MongoDB 1.0 于 2009 年 2 月发布。最初的版本提供了一种具有文档模型、索引和基本复制功能的查询语言,还提供了实验版的分片功能,但生产版本的分片集群功能在一年后发布的 1.6 版本中才有。

以下是 Dwight 对于“Mongo 是否适用于高度可伸缩系统”的问题的回答:

在水平伸缩方面,可以使用自动分片功能来构建大型的 MongoDB 集群。现在是 alpha 版,但如果你的项目才刚刚启动,那么当你需要它的时候,它可能已经生产就绪了。

MongoDB 早期的设计哲学

在早期,MongoDB 的基本设计原则如下:

  • 快速和简单的数据模型,实现更快的编程——支持 CRUD 的文档模型。
  • 使用熟悉的编程语言和格式——JavaScript/JSON。
  • 无模式文档——方便敏捷迭代开发。
  • 为了快速开发和更易于伸缩,只提供必要的功能,没有连接和跨集合的事务。
  • 支持简单的水平伸缩和持久性 / 可用性 (复制 / 分片)。

在 2011 年的一次“NoSQL 以及为什么我们要开发 MongoDB”的 ZendCon 演讲中,Dwight 详细介绍了这些原则。大约在 42 分钟的时候,还出现了一个有关复制和分片之间区别的讨论。随着代码的成熟和 MongoDB 成为主流,这些原则当中有很多都被明显淡化了。最新的 MongoDB(从 4.2 开始)可以在一定程度上支持连接,甚至是支持分布式事务!

什么是 MongoDB?

在详细讲述 MongoDB 的历史和发展历程之前,我们先简单地了解一下 MongoDB!

MongoDB 是一个基于文档的 NoSQL 数据库。它可以在所有主流平台上运行 (Windows、Linux、Mac),并且可以免费下载它的开源版本。MongoDB 将数据实体存储在集合中,存储的每一个数据块都是 JSON 格式。例如,如果一个用户提交了一个在线订单,该订单的全部细节 (订单号、订单项、收获地址等) 将保存在一个 JSON 文档中,然后将其保存到“customer_order”集合中。

MongoDB 还附带了一个控制台客户端,这是一个功能齐全的 JavaScript 环境,你可以用它添加、删除、编辑或查询数据库中的文档数据。

MongoDB 架构

下面是 MongoDB 服务器主要组件的架构视图。

MongoDB 目前为 13 种编程语言提供了驱动程序,包括 Java、Node.JS、Python、PHP 和 Swift。存储引擎 MMAPv1 从 4.2 版本开始就被移除了。加密存储引擎只在商业版中提供。

MongoDB 的美妙之处在于它的开源免费社区版为你提供了这些能力:

  • 一个简单的单机实例就可以满足大多数小型应用程序的需求。
  • 一个多机实例可以为大多数商业应用程序提供持久性 / 高可用性。
  • 一个具有水平伸缩能力的大型集群 (分片集群) 可以处理非常大的数据集和大量的查询。MongoDB 提供了自动化基础设施,用于实现分布式的数据分布和处理。

下面的这些图表演示了各种运行 MongoDB 实例的方式。

单服务器 / 容错设置

对于小型应用程序,单台服务器就足以满足频繁的数据备份需求了。如果需要容错,可以使用副本集。在容错配置中,通常有 3 个或更多的 MongoDB 实例。这些实例当中只有一个作为主实例,如果它发生故障,其他两个辅助实例中的一个将成为主实例。这些实例中的数据都是一样的。

具有水平伸缩能力的分片集群

对于同时要求具备水平伸缩能力和容错能力的大型数据库,需要使用 MongoDB 分片集群。从下图可以看出,一个容错分片集群推荐的最小机器数量是 14 台!每一个容错副本集只处理数据的一个子集,数据分区是由 MongoDB 引擎自动完成的。

在下载最新版本的 MongoDB(4.4) 并解压缩之后,你会发现它只包含以下三个主要文件:

  • mongo——MongoDB Shell,使用基于 JavaScript 的命令与服务器发生交互。
  • mongod——运行 MongoDB 的主文件,可以作为单个数据库实例、分片集群的成员或分片集群的配置服务器运行。
  • mongos——一个路由器应用程序,用在具有水平伸缩能力的数据库服务器集群中。

在 Mac 上,这 3 个可执行文件的总大小约为 150MB。对于任意类型的 MongoDB 部署,都只需要这几个组件!在一个软件膨胀的世界里,这是一种很受欢迎的变革!这种简单和优雅让 MongoDB 变得强大而可靠。

MongoDB 的演化史 (2009 年——2020 年)

MongoDB 1.0 是在 2009 年 2 月发布的,提供了大部分基本的查询功能。MongoDB 1.2 是在 2009 年 12 月发布的,引入了 map-reduce,支持大规模数据处理。在看到 MongoDB 的巨大潜力之后,10gen 公司迅速壮大了团队。MongoDB 1.4(2010 年 3 月) 引入了后台索引创建,MongoDB 1.6(2010 年 8 月) 引入了一些主要特性,比如用于水平伸缩的分片、具备自动故障转移能力的副本集以及对 IPv6 的支持。

到了 2012 年,10gen 有 100 名员工,公司开始提供 24/7 服务。MongoDB 2.2 版本 (2012 年 8 月) 引入了聚合管道,可以将多个数据处理步骤组合成一个操作链。到了 2013 年,10gen 拥有 250 多名员工和 1000 多名客户。为了挖掘商业潜力,10gen 更名为 MongoDB 公司,专注于数据库产品。MongoDB 2.4 版本 (2013 年 3 月) 在 Mongo Shell 中引入了文本搜索和谷歌的 V8 JS 引擎等增强功能。除了 2.4 之外,还发布了 MongoDB 企业版,提供了监控和安全集成等附加功能。

MongoDB 早期版本的一个主要问题是它用来保存和管理磁盘数据的存储引擎相对较弱。于是,MongoDB 公司进行了第一笔收购,收购了 WiredTiger 公司。这家公司有超级稳定的存储引擎产品 WiredTiger。MongoDB 拿下了这家公司的开发团队和产品,以及首席架构师 Michael Cahill(也是 Berkeley DB 的架构师之一),让他担任存储工程总监一职。WiredTiger 是一个高效的存储引擎,使用了各种编程技术,如风险指针(hazard pointer)、无锁算法、快速锁存(fast latch)和消息传递,与其他引擎相比,WiredTiger 可以在每个 CPU 内核上执行更多的任务。为了最小化磁盘开销和 I/O,WiredTiger 使用了紧凑的文件格式和压缩(可选)。

MongoDB 的下一个主要版本是 3.0(2015 年 3 月),其中包含了新的 WiredTiger 存储引擎、可插拔存储引擎 API、增加了 50 个副本集限制和安全改进。同年,Glassdoor 将 MongoDB 公司列为最佳的雇主之一。同年晚些时候又发布了 3.2 版本,支持文档验证、部分索引和一些主要的聚合增强。

2017 年,微软发布了多模型 NoSQL 数据库服务 CosmosDB,作为微软 Azure 云平台的一部分。它提供了与 MongoDB 3.2 的协议兼容性,针对 MongoDB 3.2 的查询也可以在 CosmosDB 上运行,这加快了开发人员采用 CosmosDB 的速度。

截止 2016 年,MongoDB 公司拥有 500 多名员工,数据库的下载量超过 2000 万次。2017 年 10 月,MongoDB 公司上市,市值超过 10 亿美元。MongoDB 3.6 在一个月后 (2017 年 11 月) 发布,为多集合连接查询、变更流和使用 JSON 模式进行文档验证提供了更好的支持。MongoDB 3.6 是微软 Azure CosmosDB 截至 2020 年 8 月能够支持的最新版本。

2018 年,MongoDB 公司斥资 6800 万美元收购了 mLab,这是 MongoDB 公司的第二笔收购。当时,mLab 在云端提供 MongoDB 服务 (DBaaS),并拥有大量的客户。云计算是未来,MongoDB 公司迅速收购并集成了 mLab,将其作为 MongoDB Atlas 云平台的一部分。然后,他们通过改变开源版本的许可条款来限制更多的 DBaaS 竞争者出现!

MongoDB 开源社区版和高级企业版都使用了相同的底层引擎。这意味着任何人都可以使用社区版,然后基于社区版提供付费的云服务。对于 MongoDB 公司来说,它们的云产品 MongoDB Atlas 就多了很多直接竞争者。因此,在 2018 年 10 月,MongoDB 公司将社区版的许可从 GNU AGPLv3 (AGPL) 更改为服务器端公共许可 (SSPL)。许可中有一个条款用来防止未来 SaaS 竞争对手使用 MongoDB 并提供他们自己的 SaaS 版本:

如果您将本程序的功能或修改版本作为服务提供给第三方,必须将服务源代码通过网络下载的方式免费提供给所有人。

这是一个由 MongoDB 公司自己提出的许可条款,并声称兼容 OSI。不过,该条款后来在开放源码计划 (OSI) 的审批过程中被撤回,不过开源版本的 MongoDB 仍然采用 SSPL 许可。

到了 2018 年,MongoDB 公司拥有 1000 多名员工。下一个主要版本 MongoDB 4.0(2018 年 6 月) 提供了跨文档事务处理能力。这是一个重要的里程碑,MongoDB 已经为高数据完整性需求做好了准备。

云生态系统在快速增长,不久后,MongoDB 公司意识到他们需要发展成一个成熟的云平台,而不只是提供数据库服务。2019 年,MongoDB 公司进行了第三笔收购,以 3900 万美元收购了云计算移动数据库公司 Realm。有意思的是,MongoDB 最初也是一种 PaaS 托管解决方案,而 12 年之后,它又回到了同样的方向。同年,MongoDB 公司发布了带有分布式事务支持的 MongoDB 4.2。

截至 2020 年 8 月,MongoDB 社区版版本是 4.4。值得注意的是,MongoDB 数据库工具可以单独下载。MongoDB 4.4 包含了一些主要的特性增强,比如多集合联合聚合、复合哈希分片键和对冲读(Hedged Read)/ 镜像读。

现在的 MongoDB

截至 2020 年,MongoDB 的全球下载量达到了 1.1 亿次。MongoDB 公司目前有 2000 多名员工,有超过 18000 名付费客户,其中有很多客户同时使用 MongoDB Atlas 和 MongoDB 企业版。截至 2020 年 8 月,MongoDB 社区版版本是 4.4。大多数大公司在内部的一些场景中使用社区版。MongoDB 社区版仍然是开源的,除了一些关键特性外,它与 MongoDB 企业版差不多。

MongoDB 企业版 (每个服务器每年的费用在 1 万美元左右) 提供了以下这些附加功能:

  • 内存存储引擎——适用于需要快速数据访问而不需要持久存储的场景。
  • 审计——数据库管理员在部署时跟踪系统活动。
  • 身份验证和授权——支持 Kerberos 身份验证和 LDAP 身份验证和授权。
  • 加密——WiredTiger 引擎提供了一个原生加密选项。默认是 AES256,使用 OpenSSL。

除了社区版,MongoDB 公司还提供了以下这些产品:

  • MongoDB Database Tools——命令行工具集合,包括导入 / 导出 (mongodump、mongorestore 等) 和诊断工具 (mongostat、mongotop)。
  • MongoDB 企业服务器——企业版,提供额外的安全和审计功能。
  • MongoDB Atlas——基于云的 SaaS 版服务器。
  • Atlas Data Lake——一个基于云的数据湖工具,由 MongoDB 查询语言提供支持,可以通过 MongoDB Atlas 和 AWS S3 查询和分析数据。
  • Atlas Search——一个基于云的全文搜索引擎,基于 MongoDB Atlas。
  • MongoDB Realm——一个为移动应用提供后端服务的托管云服务。
  • MongoDB Charts——一个云工具,用于创建 MongoDB 数据的可视化表示。
  • MongoDB Compass——可下载的 GUI 工具,用于连接 MongoDB 数据库和查询数据。
  • MongoDB Ops Manager——用于在自定义基础设施上部署、备份和扩展 MongoDB 的管理平台。
  • MongoDB Cloud Manager——云版本的 Ops 管理器。
  • MongoDB Connectors——为其他平台 / 工具提供的用于连接 MongoDB 的驱动程序。

前方的道路

由于在 SSPL 许可方面存在争议,开发者社区中有一些人对 MongoDB 生态系统持谨慎态度。投资者还面临着围绕生态系统创收的压力。如果你把 2008 年版和 2020 年版的 MongoDB 主页放在一起看,这一点就显而易见 (见下图)。MongoDB 社区版下载页面实际上也列出了企业版中才有的特性!

另外,MongoDB 公司还面临来自云供应商的激烈竞争。MongoDB 公司面临的主要问题是数据存储只是企业应用程序的一部分,如果没有一个令人信服的全栈云服务,在未来可能很难与云供应商竞争。

Eliot Horowitz (MongoDB 的关键人物) 于 2020 年 7 月离开了公司。尽管他还在担任顾问的角色,但 MongoDB 的产品仍存在一些风险,比如焦点被弱化、减少对免费社区版的支持或进一步修改许可条款。

写在最后

MongoDB 是一个围绕开源技术产品成功创办一家公司的完美案例,也是在产品生命周期中如何选择正确时机转向的绝佳例子。MongoDB 的简单性和较小的安装体积可以在不增加很多开销的情况下构建复杂的系统。我希望 MongoDB 公司在未来几年继续为社区版提供支持。

原文链接

MongoDB History

2020 年 10 月 09 日 10:36 2315
用户头像
小智 InfoQ高级编辑

发布了 385 篇内容, 共 297.8 次阅读, 收获喜欢 1604 次。

关注

评论

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

GitHub上的今年第一本《Java异步编程实战》美团T9亲荐,太赞了

你看起来很好吃

Java 程序员 架构师 异步编程

Redis问的太深入,面试官说:你先回去等通知吧

你看起来很好吃

Java redis 编程 程序员 架构师

我们从Kubernetes发展中学到了什么(1)

华宇法律科技

Kubernetes 容器 k8s

阿里P8大牛力荐:Java程序员进阶必读的书籍清单(附电子版)

Java成神之路

Java redis 编程 程序员 JVM

架构师培训 -12 hadoop

刘敏

架构师训练营第 0 期第 12 周作业

无名氏

真香警告!手绘172张图解HTTP协议+703页TCP/IP协议笔记

你看起来很好吃

Java 程序员 架构师 计算机

TCP/IP协议族(第四版)已出,不愧是世界计算机优秀畅销精选书籍

你看起来很好吃

Java 编程 架构师 TCP/IP 协议族

架构师训练营第十二周作业

叮叮董董

如何实现特定列脱敏?这两种方法你都要会

华为云开发者社区

postgresql 数据 脱敏 匿名 视图

除了方文山,用TA你也能帮周杰伦写歌词了

华为云开发者社区

AI 数据 周杰伦 modelarts 歌词

图解图库JanusGraph系列-一文知晓“图数据“底层存储结构(JanusGraph data model)

洋仔聊编程

janusgraph 图数据库 存储结构 图解源码分析

云小课 | 一份超实用的勒索病毒自救预防指南

华为云开发者社区

勒索病毒 弱密码 云小课 企业主机安全 病毒云查杀

一文说透"静态代理"与"动态代理"

洋仔聊编程

源码分析 动态代理 静态代理

首发!阿里面试官总结从零到架构面试宝典,是时候让面试官懵逼了

周老师

Java 编程 程序员 架构 面试

Github下载即将破百万的PDF:双十一高并发亿级流量秒杀顶级教程

你看起来很好吃

Java 编程 程序员 秒杀 计算机

架构师培训十二周练习

小蚂蚁

架构师训练营十二周作业

方堃

疫情对在线教育的影响

anyRTC开发者

在线教育 直播 RTC 安卓

加密数字货币钱包APP系统开发,数字货币钱包系统定制

13530558032

膜拜!京东T9大牛沉淀三年终于整理出了这份架构核心修炼之道

你看起来很好吃

Java 编程 程序员 架构师 计算机

京东T9今年首发的一份Spring Boot实战,让开发像搭积木一样简单

你看起来很好吃

Java 编程 程序员 架构师 计算机

2. Bean Validation声明式校验方法的参数、返回值

YourBatman

参数校验 Hibernate-Validator Bean Validation 方法校验

LeetCode题解:155. 最小栈,使用链表代替栈,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

数字货币交易系统应用开发,区块链交易所app

13530558032

收藏!一篇教会你写90%的shell脚本!

洋仔聊编程

Shell shell脚本编写 收藏教程

全网都在跪求的阿里Java修炼开发技术笔记,终于开放下载了

你看起来很好吃

Java 编程 架构师 后端开发

Spring+多线程+集合+MVC+数据结构算法+MyBatis源码学习笔记分享

Java成神之路

Java spring 编程 程序员 多线程

易观郭炜:流动水系数造未来

易观大数据

不按套路出牌的阿里面试官:“刁难”面试者常用套路,你中招了吗

周老师

Java 编程 程序员 架构 面试

区块链USDT支付系统,USDT承兑支付软件开发

13530558032

MongoDB简史-InfoQ