說到現(xiàn)代 Web 應(yīng)用程序開發(fā),不得不提到 MongoDB。如果你是一名全棧程序員,每天都會跟 MERN 打交道,其中 M 指的就是 MongoDB。MongoDB 開源社區(qū)版為大量的 Web 應(yīng)用程序提供支持。從 2007 年開始,MongoDB 走過了漫長的道路。它是 MongoDB 公司的主要產(chǎn)品,這家公司市值已經(jīng)超過 100 億美元。與很多產(chǎn)品一樣,在線廣告是推動 MongoDB 愿景和發(fā)展的關(guān)鍵催化劑。MongoDB 的故事很有趣,在本文中,我將帶你一起探索 MongoDB 的發(fā)展之旅。
MongoDB 的故事開始于 2007 年。1995 年,Dwight Merriman 和 Kevin O'Connor 創(chuàng)辦了著名的在線廣告公司 DoubleClick。不久后,Kevin Ryan 也加入了這個團(tuán)隊(duì) (Dwight 和 Kevin 后來共同創(chuàng)辦了 5 家公司——Gilt、10gen、Panther Express、ShopWiki 和 Business Insider)。DoubleClick 很快就大獲成功,幾年之內(nèi),它的廣告流量達(dá)到了每秒 40 萬條。當(dāng)時的關(guān)系型數(shù)據(jù)庫技術(shù)還沒有預(yù)料到會有如此大規(guī)模的流量。配備如此規(guī)模的關(guān)系數(shù)據(jù)庫需要大量的資金和硬件資源。因此,Dwight(他是當(dāng)時的 CTO) 和他的團(tuán)隊(duì)開發(fā)了自定義數(shù)據(jù)庫實(shí)現(xiàn)來擴(kuò)展 DoubleClick,以應(yīng)對流量的激增。
2003 年,Eliot Horowitz 在大學(xué)畢業(yè)之后加入 DoubleClick 的研發(fā)部門,成為一名軟件工程師。兩年后,他離開了 DoubleClick,和 Dwight 一起創(chuàng)辦了 ShopWiki。他們都意識到,他們在一次又一次地解決同樣的水平伸縮性問題。因此,2007 年,Dwight、Eliot 和 Kevin Ryan 一起創(chuàng)辦了一家叫作 10gen 的新公司。10gen 專注于提供一個帶有自有應(yīng)用程序和數(shù)據(jù)庫棧的 PaaS 托管解決方案。10gen 很快引起了風(fēng)險(xiǎn)投資人 Albert Wenger(Union Square Ventures) 的注意,他向 10gen 投資了 150 萬美元。以下是 Albert Wenger 在 2008 年寫的有關(guān) 10gen 投資的文字:
今天,我們很高興地宣布,我們將為一支特立獨(dú)行的團(tuán)隊(duì)提供支持,也就是 10gen 的一班天才們。他們匯聚了構(gòu)建互聯(lián)網(wǎng)規(guī)模系統(tǒng)的經(jīng)驗(yàn),比如 DART、Panther Express CDN,廣泛參與了開源活動,包括 Apache 軟件基金會。他們正在為云計(jì)算構(gòu)建一個開源技術(shù)棧,包括一個應(yīng)用服務(wù)器和一個數(shù)據(jù)庫,它們都是基于現(xiàn)代硬件能力和構(gòu)建 Web 站點(diǎn)或服務(wù)的經(jīng)驗(yàn)從頭開始開發(fā)的。應(yīng)用服務(wù)器最初支持服務(wù)器端 JavaScript 和 Ruby(實(shí)驗(yàn)性的)。數(shù)據(jù)庫采用了一種有趣的設(shè)計(jì)來存儲對象,這種設(shè)計(jì)在快速隨機(jī)訪問和高效的集合掃描之間做出了平衡。
Albert 所說的“采用了有趣的設(shè)計(jì)的數(shù)據(jù)庫”實(shí)際上指的就是 MongoDB。從 2007 年到 2009 年,這個新數(shù)據(jù)庫迅速發(fā)展。Dwight 第一次提交的 MongoDB 代碼可以在這里看到。
https://github.com/mongodb/mongo/commit/e73188b5512c82290a4070af4afddac20d0b981e
MongoDB 的核心引擎是用 C++ 開發(fā)的。之所以把這個數(shù)據(jù)庫叫作 MongoDB,是因?yàn)樗麄兿胗盟鼇頌橐恍┑湫偷膽?yīng)用場景 (如內(nèi)容服務(wù)) 提供海量數(shù)據(jù)的存儲服務(wù)。最初,這個團(tuán)隊(duì)只有 4 名工程師 (包括 Dwight 和 Eliot),并只專注于 MongoDB 數(shù)據(jù)庫。他們的商業(yè)理念是通過開源免費(fèi)下載的方式來發(fā)布數(shù)據(jù)庫,并在這個基礎(chǔ)上提供商業(yè)支持和培訓(xùn)服務(wù)。
MongoDB 1.0 于 2009 年 2 月發(fā)布。最初的版本提供了一種具有文檔模型、索引和基本復(fù)制功能的查詢語言,還提供了實(shí)驗(yàn)版的分片功能,但生產(chǎn)版本的分片集群功能在一年后發(fā)布的 1.6 版本中才有。
以下是 Dwight 對于“Mongo 是否適用于高度可伸縮系統(tǒng)”的問題的回答:
在水平伸縮方面,可以使用自動分片功能來構(gòu)建大型的 MongoDB 集群。現(xiàn)在是 alpha 版,但如果你的項(xiàng)目才剛剛啟動,那么當(dāng)你需要它的時候,它可能已經(jīng)生產(chǎn)就緒了。
在早期,MongoDB 的基本設(shè)計(jì)原則如下:
快速和簡單的數(shù)據(jù)模型,實(shí)現(xiàn)更快的編程——支持 CRUD 的文檔模型。
使用熟悉的編程語言和格式——JavaScript/JSON。
無模式文檔——方便敏捷迭代開發(fā)。
為了快速開發(fā)和更易于伸縮,只提供必要的功能,沒有連接和跨集合的事務(wù)。
支持簡單的水平伸縮和持久性 / 可用性 (復(fù)制 / 分片)。
在 2011 年的一次“NoSQL 以及為什么我們要開發(fā) MongoDB”的 ZendCon 演講中,Dwight 詳細(xì)介紹了這些原則。大約在 42 分鐘的時候,還出現(xiàn)了一個有關(guān)復(fù)制和分片之間區(qū)別的討論。隨著代碼的成熟和 MongoDB 成為主流,這些原則當(dāng)中有很多都被明顯淡化了。最新的 MongoDB(從 4.2 開始)可以在一定程度上支持連接,甚至是支持分布式事務(wù)!
https://youtu.be/hOOQJpGu1kY?t=2408
在詳細(xì)講述 MongoDB 的歷史和發(fā)展歷程之前,我們先簡單地了解一下 MongoDB!
MongoDB 是一個基于文檔的 NoSQL 數(shù)據(jù)庫。它可以在所有主流平臺上運(yùn)行 (Windows、Linux、Mac),并且可以免費(fèi)下載它的開源版本。MongoDB 將數(shù)據(jù)實(shí)體存儲在集合中,存儲的每一個數(shù)據(jù)塊都是 JSON 格式。例如,如果一個用戶提交了一個在線訂單,該訂單的全部細(xì)節(jié) (訂單號、訂單項(xiàng)、收獲地址等) 將保存在一個 JSON 文檔中,然后將其保存到“customer_order”集合中。
MongoDB 還附帶了一個控制臺客戶端,這是一個功能齊全的 JavaScript 環(huán)境,你可以用它添加、刪除、編輯或查詢數(shù)據(jù)庫中的文檔數(shù)據(jù)。
下面是 MongoDB 服務(wù)器主要組件的架構(gòu)視圖。
MongoDB 目前為 13 種編程語言提供了驅(qū)動程序,包括 Java、Node.JS、Python、PHP 和 Swift。存儲引擎 MMAPv1 從 4.2 版本開始就被移除了。加密存儲引擎只在商業(yè)版中提供。
MongoDB 的美妙之處在于它的開源免費(fèi)社區(qū)版為你提供了這些能力:
一個簡單的單機(jī)實(shí)例就可以滿足大多數(shù)小型應(yīng)用程序的需求。
一個多機(jī)實(shí)例可以為大多數(shù)商業(yè)應(yīng)用程序提供持久性 / 高可用性。
一個具有水平伸縮能力的大型集群 (分片集群) 可以處理非常大的數(shù)據(jù)集和大量的查詢。MongoDB 提供了自動化基礎(chǔ)設(shè)施,用于實(shí)現(xiàn)分布式的數(shù)據(jù)分布和處理。
下面的這些圖表演示了各種運(yùn)行 MongoDB 實(shí)例的方式。
對于小型應(yīng)用程序,單臺服務(wù)器就足以滿足頻繁的數(shù)據(jù)備份需求了。如果需要容錯,可以使用副本集。在容錯配置中,通常有 3 個或更多的 MongoDB 實(shí)例。這些實(shí)例當(dāng)中只有一個作為主實(shí)例,如果它發(fā)生故障,其他兩個輔助實(shí)例中的一個將成為主實(shí)例。這些實(shí)例中的數(shù)據(jù)都是一樣的。
對于同時要求具備水平伸縮能力和容錯能力的大型數(shù)據(jù)庫,需要使用 MongoDB 分片集群。從下圖可以看出,一個容錯分片集群推薦的最小機(jī)器數(shù)量是 14 臺!每一個容錯副本集只處理數(shù)據(jù)的一個子集,數(shù)據(jù)分區(qū)是由 MongoDB 引擎自動完成的。
在下載最新版本的 MongoDB(4.4) 并解壓縮之后,你會發(fā)現(xiàn)它只包含以下三個主要文件:
mongo——MongoDB Shell,使用基于 JavaScript 的命令與服務(wù)器發(fā)生交互。
mongod——運(yùn)行 MongoDB 的主文件,可以作為單個數(shù)據(jù)庫實(shí)例、分片集群的成員或分片集群的配置服務(wù)器運(yùn)行。
mongos——一個路由器應(yīng)用程序,用在具有水平伸縮能力的數(shù)據(jù)庫服務(wù)器集群中。
在 Mac 上,這 3 個可執(zhí)行文件的總大小約為 150MB。對于任意類型的 MongoDB 部署,都只需要這幾個組件!在一個軟件膨脹的世界里,這是一種很受歡迎的變革!這種簡單和優(yōu)雅讓 MongoDB 變得強(qiáng)大而可靠。
MongoDB 1.0 是在 2009 年 2 月發(fā)布的,提供了大部分基本的查詢功能。MongoDB 1.2 是在 2009 年 12 月發(fā)布的,引入了 map-reduce,支持大規(guī)模數(shù)據(jù)處理。在看到 MongoDB 的巨大潛力之后,10gen 公司迅速壯大了團(tuán)隊(duì)。MongoDB 1.4(2010 年 3 月) 引入了后臺索引創(chuàng)建,MongoDB 1.6(2010 年 8 月) 引入了一些主要特性,比如用于水平伸縮的分片、具備自動故障轉(zhuǎn)移能力的副本集以及對 IPv6 的支持。
到了 2012 年,10gen 有 100 名員工,公司開始提供 24/7 服務(wù)。MongoDB 2.2 版本 (2012 年 8 月) 引入了聚合管道,可以將多個數(shù)據(jù)處理步驟組合成一個操作鏈。到了 2013 年,10gen 擁有 250 多名員工和 1000 多名客戶。為了挖掘商業(yè)潛力,10gen 更名為 MongoDB 公司,專注于數(shù)據(jù)庫產(chǎn)品。MongoDB 2.4 版本 (2013 年 3 月) 在 Mongo Shell 中引入了文本搜索和谷歌的 V8 JS 引擎等增強(qiáng)功能。除了 2.4 之外,還發(fā)布了 MongoDB 企業(yè)版,提供了監(jiān)控和安全集成等附加功能。
MongoDB 早期版本的一個主要問題是它用來保存和管理磁盤數(shù)據(jù)的存儲引擎相對較弱。于是,MongoDB 公司進(jìn)行了第一筆收購,收購了 WiredTiger 公司。這家公司有超級穩(wěn)定的存儲引擎產(chǎn)品 WiredTiger。MongoDB 拿下了這家公司的開發(fā)團(tuán)隊(duì)和產(chǎn)品,以及首席架構(gòu)師 Michael Cahill(也是 Berkeley DB 的架構(gòu)師之一),讓他擔(dān)任存儲工程總監(jiān)一職。WiredTiger 是一個高效的存儲引擎,使用了各種編程技術(shù),如風(fēng)險(xiǎn)指針(hazard pointer)、無鎖算法、快速鎖存(fast latch)和消息傳遞,與其他引擎相比,WiredTiger 可以在每個 CPU 內(nèi)核上執(zhí)行更多的任務(wù)。為了最小化磁盤開銷和 I/O,WiredTiger 使用了緊湊的文件格式和壓縮(可選)。
MongoDB 的下一個主要版本是 3.0(2015 年 3 月),其中包含了新的 WiredTiger 存儲引擎、可插拔存儲引擎 API、增加了 50 個副本集限制和安全改進(jìn)。同年,Glassdoor 將 MongoDB 公司列為最佳的雇主之一。同年晚些時候又發(fā)布了 3.2 版本,支持文檔驗(yàn)證、部分索引和一些主要的聚合增強(qiáng)。
2017 年,微軟發(fā)布了多模型 NoSQL 數(shù)據(jù)庫服務(wù) CosmosDB,作為微軟 Azure 云平臺的一部分。它提供了與 MongoDB 3.2 的協(xié)議兼容性,針對 MongoDB 3.2 的查詢也可以在 CosmosDB 上運(yùn)行,這加快了開發(fā)人員采用 CosmosDB 的速度。
截止 2016 年,MongoDB 公司擁有 500 多名員工,數(shù)據(jù)庫的下載量超過 2000 萬次。2017 年 10 月,MongoDB 公司上市,市值超過 10 億美元。MongoDB 3.6 在一個月后 (2017 年 11 月) 發(fā)布,為多集合連接查詢、變更流和使用 JSON 模式進(jìn)行文檔驗(yàn)證提供了更好的支持。MongoDB 3.6 是微軟 Azure CosmosDB 截至 2020 年 8 月能夠支持的最新版本。
2018 年,MongoDB 公司斥資 6800 萬美元收購了 mLab,這是 MongoDB 公司的第二筆收購。當(dāng)時,mLab 在云端提供 MongoDB 服務(wù) (DBaaS),并擁有大量的客戶。云計(jì)算是未來,MongoDB 公司迅速收購并集成了 mLab,將其作為 MongoDB Atlas 云平臺的一部分。然后,他們通過改變開源版本的許可條款來限制更多的 DBaaS 競爭者出現(xiàn)!
MongoDB 開源社區(qū)版和高級企業(yè)版都使用了相同的底層引擎。這意味著任何人都可以使用社區(qū)版,然后基于社區(qū)版提供付費(fèi)的云服務(wù)。對于 MongoDB 公司來說,它們的云產(chǎn)品 MongoDB Atlas 就多了很多直接競爭者。因此,在 2018 年 10 月,MongoDB 公司將社區(qū)版的許可從 GNU AGPLv3 (AGPL) 更改為服務(wù)器端公共許可 (SSPL)。許可中有一個條款用來防止未來 SaaS 競爭對手使用 MongoDB 并提供他們自己的 SaaS 版本:
如果您將本程序的功能或修改版本作為服務(wù)提供給第三方,必須將服務(wù)源代碼通過網(wǎng)絡(luò)下載的方式免費(fèi)提供給所有人。
這是一個由 MongoDB 公司自己提出的許可條款,并聲稱兼容 OSI。不過,該條款后來在開放源碼計(jì)劃 (OSI) 的審批過程中被撤回,不過開源版本的 MongoDB 仍然采用 SSPL 許可。
到了 2018 年,MongoDB 公司擁有 1000 多名員工。下一個主要版本 MongoDB 4.0(2018 年 6 月) 提供了跨文檔事務(wù)處理能力。這是一個重要的里程碑,MongoDB 已經(jīng)為高數(shù)據(jù)完整性需求做好了準(zhǔn)備。
云生態(tài)系統(tǒng)在快速增長,不久后,MongoDB 公司意識到他們需要發(fā)展成一個成熟的云平臺,而不只是提供數(shù)據(jù)庫服務(wù)。2019 年,MongoDB 公司進(jìn)行了第三筆收購,以 3900 萬美元收購了云計(jì)算移動數(shù)據(jù)庫公司 Realm。有意思的是,MongoDB 最初也是一種 PaaS 托管解決方案,而 12 年之后,它又回到了同樣的方向。同年,MongoDB 公司發(fā)布了帶有分布式事務(wù)支持的 MongoDB 4.2。
截至 2020 年 8 月,MongoDB 社區(qū)版版本是 4.4。值得注意的是,MongoDB 數(shù)據(jù)庫工具可以單獨(dú)下載。MongoDB 4.4 包含了一些主要的特性增強(qiáng),比如多集合聯(lián)合聚合、復(fù)合哈希分片鍵和對沖讀(Hedged Read)/ 鏡像讀。
截至 2020 年,MongoDB 的全球下載量達(dá)到了 1.1 億次。MongoDB 公司目前有 2000 多名員工,有超過 18000 名付費(fèi)客戶,其中有很多客戶同時使用 MongoDB Atlas 和 MongoDB 企業(yè)版。截至 2020 年 8 月,MongoDB 社區(qū)版版本是 4.4。大多數(shù)大公司在內(nèi)部的一些場景中使用社區(qū)版。MongoDB 社區(qū)版仍然是開源的,除了一些關(guān)鍵特性外,它與 MongoDB 企業(yè)版差不多。
MongoDB 企業(yè)版 (每個服務(wù)器每年的費(fèi)用在 1 萬美元左右) 提供了以下這些附加功能:
內(nèi)存存儲引擎——適用于需要快速數(shù)據(jù)訪問而不需要持久存儲的場景。
審計(jì)——數(shù)據(jù)庫管理員在部署時跟蹤系統(tǒng)活動。
身份驗(yàn)證和授權(quán)——支持 Kerberos 身份驗(yàn)證和 LDAP 身份驗(yàn)證和授權(quán)。
加密——WiredTiger 引擎提供了一個原生加密選項(xiàng)。默認(rèn)是 AES256,使用 OpenSSL。
除了社區(qū)版,MongoDB 公司還提供了以下這些產(chǎn)品:
MongoDB Database Tools——命令行工具集合,包括導(dǎo)入 / 導(dǎo)出 (mongodump、mongorestore 等) 和診斷工具 (mongostat、mongotop)。
MongoDB 企業(yè)服務(wù)器——企業(yè)版,提供額外的安全和審計(jì)功能。
MongoDB Atlas——基于云的 SaaS 版服務(wù)器。
Atlas Data Lake——一個基于云的數(shù)據(jù)湖工具,由 MongoDB 查詢語言提供支持,可以通過 MongoDB Atlas 和 AWS S3 查詢和分析數(shù)據(jù)。
Atlas Search——一個基于云的全文搜索引擎,基于 MongoDB Atlas。
MongoDB Realm——一個為移動應(yīng)用提供后端服務(wù)的托管云服務(wù)。
MongoDB Charts——一個云工具,用于創(chuàng)建 MongoDB 數(shù)據(jù)的可視化表示。
MongoDB Compass——可下載的 GUI 工具,用于連接 MongoDB 數(shù)據(jù)庫和查詢數(shù)據(jù)。
MongoDB Ops Manager——用于在自定義基礎(chǔ)設(shè)施上部署、備份和擴(kuò)展 MongoDB 的管理平臺。
MongoDB Cloud Manager——云版本的 Ops 管理器。
MongoDB Connectors——為其他平臺 / 工具提供的用于連接 MongoDB 的驅(qū)動程序。
由于在 SSPL 許可方面存在爭議,開發(fā)者社區(qū)中有一些人對 MongoDB 生態(tài)系統(tǒng)持謹(jǐn)慎態(tài)度。投資者還面臨著圍繞生態(tài)系統(tǒng)創(chuàng)收的壓力。如果你把 2008 年版和 2020 年版的 MongoDB 主頁放在一起看,這一點(diǎn)就顯而易見 (見下圖)。MongoDB 社區(qū)版下載頁面實(shí)際上也列出了企業(yè)版中才有的特性!
另外,MongoDB 公司還面臨來自云供應(yīng)商的激烈競爭。MongoDB 公司面臨的主要問題是數(shù)據(jù)存儲只是企業(yè)應(yīng)用程序的一部分,如果沒有一個令人信服的全棧云服務(wù),在未來可能很難與云供應(yīng)商競爭。
Eliot Horowitz (MongoDB 的關(guān)鍵人物) 于 2020 年 7 月離開了公司。盡管他還在擔(dān)任顧問的角色,但 MongoDB 的產(chǎn)品仍存在一些風(fēng)險(xiǎn),比如焦點(diǎn)被弱化、減少對免費(fèi)社區(qū)版的支持或進(jìn)一步修改許可條款。
MongoDB 是一個圍繞開源技術(shù)產(chǎn)品成功創(chuàng)辦一家公司的完美案例,也是在產(chǎn)品生命周期中如何選擇正確時機(jī)轉(zhuǎn)向的絕佳例子。MongoDB 的簡單性和較小的安裝體積可以在不增加很多開銷的情況下構(gòu)建復(fù)雜的系統(tǒng)。我希望 MongoDB 公司在未來幾年繼續(xù)為社區(qū)版提供支持。
https://www.quickprogrammingtips.com/mongodb/mongodb-history.html
聯(lián)系客服