Categories
程式開發

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,以應對流量的激增。

MongoDB簡史 1

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簡史 2

MongoDB 目前為13 種編程語言提供了驅動程序,包括Java、Node.JS、Python、PHP 和Swift。存儲引擎MMAPv1 從4.2 版本開始就被移除了。加密存儲引擎只在商業版中提供。

MongoDB 的美妙之處在於它的開源免費社區版為你提供了這些能力:

  • 一個簡單的單機實例就可以滿足大多數小型應用程序的需求。
  • 一個多機實例可以為大多數商業應用程序提供持久性/ 高可用性。
  • 一個具有水平伸縮能力的大型集群(分片集群) 可以處理非常大的數據集和大量的查詢。 MongoDB 提供了自動化基礎設施,用於實現分佈式的數據分佈和處理。

下面的這些圖表演示了各種運行MongoDB 實例的方式。

單服務器/ 容錯設置

對於小型應用程序,單台服務器就足以滿足頻繁的數據備份需求了。如果需要容錯,可以使用副本集。在容錯配置中,通常有3 個或更多的MongoDB 實例。這些實例當中只有一個作為主實例,如果它發生故障,其他兩個輔助實例中的一個將成為主實例。這些實例中的數據都是一樣的。

MongoDB簡史 3

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

對於同時要求具備水平伸縮能力和容錯能力的大型數據庫,需要使用MongoDB 分片集群。從下圖可以看出,一個容錯分片集群推薦的最小機器數量是14 台!每一個容錯副本集只處理數據的一個子集,數據分區是由MongoDB 引擎自動完成的。

MongoDB簡史 4

在下載最新版本的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 的支持。

MongoDB簡史 5

到了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 月能夠支持的最新版本。

MongoDB簡史 6

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簡史 7

另外,MongoDB 公司還面臨來自云供應商的激烈競爭。 MongoDB 公司面臨的主要問題是數據存儲只是企業應用程序的一部分,如果沒有一個令人信服的全棧雲服務,在未來可能很難與雲供應商競爭。

Eliot Horowitz (MongoDB 的關鍵人物) 於2020 年7 月離開了公司。儘管他還在擔任顧問的角色,但MongoDB 的產品仍存在一些風險,比如焦點被弱化、減少對免費社區版的支持或進一步修改許可條款。

寫在最後

MongoDB 是一個圍繞開源技術產品成功創辦一家公司的完美案例,也是在產品生命週期中如何選擇正確時機轉向的絕佳例子。 MongoDB 的簡單性和較小的安裝體積可以在不增加很多開銷的情況下構建複雜的系統。我希望MongoDB 公司在未來幾年繼續為社區版提供支持。

原文鏈接

MongoDB歷史