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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章