本文介紹MongoDB 5.0的主要新特性。

背景信息

MongoDB 5.0標志著一個新的發布周期的到來,以更快地交付新特性給用戶。例如:版本化API與在線重新分片相結合,使用戶不必擔心未來的數據庫升級以及業務變化問題;本地原生時間序列數據平臺使MongoDB能夠支持更廣泛的工作負載和業務場景;新的MongoDB Shell能夠提升用戶體驗等均為MongoDB 5.0的功能。

原生時間序列平臺

MongoDB 5.0通過原生支持整個時間序列數據的生命周期(從采集、存儲、查詢、實時分析和可視化,到在線歸檔或隨著數據老化自動失效),使構建和運行時間序列應用程序的速度更快、成本更低。隨著MongoDB 5.0的發布,MongoDB擴展了通用的應用數據平臺,使開發能夠更容易地處理時間序列數據,進一步擴展其在物聯網、金融分析、物流等方面的應用場景。

MongoDB的時間序列集合以高度優化和壓縮的格式自動存儲時間序列數據,減少了存儲大小和I/O,以實現更好的性能和更大的規模。同時也縮短了開發周期,使您能夠快速建立一個針對時間序列應用的性能和分析需求而調優的模型。

創建時間序列數據集合的命令示例:
db.createCollection("collection_name",{ timeseries: { timeField: "timestamp" } } )

MongoDB可以無縫地調整采集頻率,并根據動態生成的時間分區自動處理無序的測量值。最新發布的MongoDB Connector for Apache Kafka實現了在本地支持時間序列,您可以直接從Kafka主題消息中自動創建時間序列集合,使您在收集數據的同時根據需要對數據進行處理和聚合,然后寫入到MongoDB的時間序列集合。

時間序列集合自動創建一個按時間排序的數據聚集索引,降低查詢數據的延遲。MongoDB查詢API還擴展了窗口函數,您可以運行分析性查詢(例如移動平均數和累積總和)。在關系型數據庫系統中,這些通常被稱為SQL分析函數,并支持以行為單位定義的窗口(即三行移動平均線)。MongoDB更進一步,還增加了指數移動平均線、導數和積分等強大的時間序列函數,支持您以時間為單位定義窗口(例如15分鐘的移動平均線)。窗口函數可用于查詢MongoDB的時間序列和常規集合,為多種應用類型提供了新的分析方式。另外,MongoDB 5.0也提供了新的時間運算符,包括$dateAdd$dateSubstract$dateDiff$dateTrunc,使您可以通過自定義的時間窗口對數據進行匯總和查詢。

您可以將MongoDB的時間序列數據與企業的其他數據相結合。時間序列集合可以與同一個數據庫中的常規MongoDB集合放在一起,您不必選擇一個專門的時間序列數據庫(它不能為任何其他類型的應用提供服務),也不需要復雜的集成來混合時間序列和其他數據。MongoDB通過提供一個統一的平臺,讓您建立高性能和高效的時間序列應用的同時,也為其他用例或工作負載提供支持,從而消除了整合和運行多個不同數據庫的成本和復雜性。

在線數據重新分片

數據庫版本 特點 實現方法
MongoDB 5.0以前 重新分片過程復雜且需要手動分片。
  • 方法一:先dump整個集合,然后用新的分片鍵把數據庫重新加載到一個新的集合中。

    由于這是一個需要離線處理的過程,因此您的應用程序在重新加載完成之前需要中斷停服較長時間。例如:在一個三分片的集群上dump和重新加載一個10 TB以上的集合可能需要幾天時間。

  • 方法二:新建一個分片集群并重新設定集合的分片鍵,然后通過定制遷移方式,將舊分片集群中需要重新分片的集合,按新的分片鍵寫入到新的分片集群中。
    • 該過程中需要您自行處理查詢路由和遷移邏輯、不斷檢查遷移進度,以確保所有數據遷移成功。
    • 定制遷移是高度復雜的、勞動密集型的、有風險的任務,而且耗時很長。例如:某個MongoDB用戶花了三個月才完成100億個document的遷移。
MongoDB 5.0開始
  • 運行reshardCollection命令即可啟動重新分片。
  • 重新分片的過程高效。

    并不是簡單地重新平衡數據,而是在后臺將所有當前集合的數據復制并重新寫入新集合,同時與應用程序新的寫入保持同步。

  • 重新分片是完全自動化的。

    將重新分片花費的時間從幾周或幾個月壓縮到幾分鐘或幾小時,避免了冗長繁雜的手動數據遷移。

  • 通過使用在線重新分片,可以方便地在開發或測試環境中評估不同分片鍵的效果,也可以在您需要時修改分片鍵。
您可以在業務運行(數據不斷增長)的情況下,按需改變集合的分片鍵(Shard key),而不需要數據庫停機或在數據集合中進行復雜的遷移。您只需要在MongoDB Shell中運行reshardCollection命令,選擇您需要重新分片的數據庫和集合,指定新的分片鍵即可。
reshardCollection: "<database>.<collection>", key: <shardkey>
說明
  • <database>:需要重新分片的數據庫名稱。
  • <collection>:需要重新分片的集合名稱。
  • <shardkey>:分片鍵的名稱。
  • 當您調用reshardCollection命令時,MongoDB會克隆現有集合,然后將現有集合中所有oplog應用到新集合中,當所有oplog被使用后,MongoDB會自動切換到新集合,并在后臺刪除舊集合。

版本化API

  • 應用程序兼容性

    MongoDB 5.0開始,版本化API定義了應用程序最常用的一組命令和參數(無論是數據庫在年度重大發布還是季度快速發布期間,這些命令均不會改變)。通過將應用程序生命周期和數據庫生命周期解耦,您可以將驅動程序固定在MongoDB API的特定版本上,即使數據庫發生升級和改進,您的應用程序將可以繼續運行數年而不需要修改代碼。

  • 靈活地添加新功能和改進內容

    版本化API支持MongoDB靈活地在每個版本中為數據庫添加新的功能和改進內容(以新版本兼容早期版本的方式)。當您需要改變API時,可以增加新版本的API,并與現有版本化的API在同一臺服務器上同時運行。隨著MongoDB版本發布的加速,版本化API能夠使您更快、更輕松地使用到MongoDB最新版本的功能特性。

Write Concern默認Majority級別

從MongoDB 5.0開始,Write Concern默認級別為majority,僅當寫入操作被應用到Primary節點(主節點)且被持久化到大多數副本節點的日志中的時候,才會提交并返回成功,“開箱即用”地提供了更強的數據可靠性保障。
說明 Write Concern是完全可調的,您可以自定義配置Write Concern,以平衡應用程序對數據庫性能和數據持久性的要求。

連接管理優化

默認情況下,一個客戶端連接對應后端MongoDB服務器上的一個線程(net.serviceExecutor配置為synchronous)。創建、切換和銷毀線程都是消耗較大的操作,當連接數過多時,線程會占用MongoDB服務器較多的資源。

連接數較多或創建連接失控的情況稱為“連接風暴”,產生該情況的原因可能是多方面的,且經常是在服務已經受到影響的情況下發生。

針對這些情況,MongoDB 5.0采取了以下措施:
  • 限制在任何時候驅動程序嘗試創建的連接數量,以簡單有效的方式防止數據庫服務器過載。
  • 減少驅動程序監控連接池時的檢查頻率,給無響應或過載的服務器節點一個緩沖和恢復的機會。
  • 驅動程序將工作負載導向具有最健康連接池的更快的服務器,而不是從可用的服務器中隨機選擇。

以上措施,加上之前版本在mongos查詢路由層的改進,進一步提升了MongoDB承受高并發負載的能力。

長時間運行的快照查詢

長時間運行的快照查詢(Long-Running Snapshot Queries)增加了應用程序的通用性和彈性。您可以通過該功能運行默認時間為5分鐘的查詢(或將其調整為自定義持續時間),同時保持與實時事務性數據庫一致的快照隔離,也可以在Secondary節點(從節點)上進行快照查詢,從而在單個集群中運行不同的工作負載,并將其擴展到不同的分片上。

MongoDB通過底層存儲引擎中一個名為Durable history的項目實現了長期運行的快照查詢,該項目早在MongoDB 4.4中就已實現。Durable history將存儲自查詢開始以來所有變化的字段值的快照。通過使用Durable history,查詢可以保持快照隔離,即使在數據發生變化的情況下,Durable history也有助于降低存儲引擎的緩存壓力,使得業務可以在高寫入負載的場景下實現更高的查詢吞吐量。

新版MongoDB Shell

為了提供更好的用戶體驗,MongoDB 5.0從頭開始重新設計了MongoDB Shell(mongosh),以提供一個更現代化的命令行體驗,以及增強可用性的功能和強大的腳本環境。新版MongoDB Shell已經成為MongoDB平臺的默認Shell。新版MongoDB Shell引入了語法高亮、智能自動完成、上下文幫助和有用的錯誤信息,為您創造一個直觀、互動的體驗。

  • 增強的用戶體驗
    • 更容易編寫查詢和聚合,更容易閱讀結果。

      新版MongoDB Shell支持語法高亮功能,方便您區分字段、值和數據類型,以避免語法錯誤。如果仍然發生錯誤,新版MongoDB Shell也可以指出問題點并告訴您解決方法。

    • 更快輸入查詢和命令。

      新版MongoDB Shell支持智能自動完成功能,即新版MongoDB Shell可以根據您連接的MongoDB的版本,為方法、命令、MQL表達式等給出自動完成選項的提示。

      示例:當您不記得某個命令的語法時,您可以直接從MongoDB Shell中快速查找該命令的語法。查找命令的語法
  • 高級腳本環境

    新版MongoDB Shell的腳本環境建立在Node.js REPL(交互式解釋器)之上,您在腳本中可以使用所有的Node.js APINPM的任何模塊。您也可以從文件系統中加載和運行腳本(和舊版MongoDB Shell一樣,您可以繼續使用LoadEval執行腳本)。

  • 擴展性和插件

    新版MongoDB Shell具有易擴展性,使您能夠使用MongoDB的所有功能以提高生產力。

    在新版MongoDB Shell中,允許安裝Snippets插件。Snippets可以自動加載至MongoDB Shell中,且Snippets可以使用所有的Node.js APINPM包。MongoDB也維護了一個Snippets倉庫,提供了一些有趣的功能(例如分析指定集合模式的插件),您也可以自由地配置MongoDB Shell使用您選擇的插件。
    說明 插件當前僅為MongoDB Shell的一個實驗性功能。

PyMongoArrow與數據科學

隨著新的PyMongoArrow API的發布,您可以在MongoDB上使用Python運行復雜的分析和機器學習。PyMongoArrow可以快速將簡單的MongoDB查詢結果轉換為流行的數據格式(例如Pandas數據框架和NumPy數組),幫助您簡化數據科學工作流程。

Schema驗證改進

Schema驗證(模式驗證)是對MongoDB進行數據應用管理控制的一種方式。MongoDB 5.0中,模式驗證變得更加簡單和友好,當操作驗證失敗時都會產生描述性的錯誤信息,幫助您了解不符合集合驗證器的驗證規則的文檔及原因,以快速識別和糾正影響驗證規則的錯誤代碼。

可恢復的索引創建任務

MongoDB 5.0支持將正在進行中的索引創建任務在節點重新啟動后自動會恢復至原來的位置,減少計劃中維護動作對業務的影響。例如:重新啟動或升級數據庫節點時,您不需要擔心當前正在進行的大集合索引創建任務失效。

版本發布調整

由于MongoDB支持很多版本和平臺,每個發布版本都需在20多個MongoDB支持的平臺上進行驗證,驗證工作量大,降低了MongoDB新功能的交付速度,所以從MongoDB 5.0開始,MongoDB發布的版本將分為Major Release(大版本)和Rapid Releases(快速發布版本),其中Rapid Releases作為開發版本提供下載和測試體驗,但不建議用在生產環境。

更多特性

關于MongoDB 5.0更多特性,請參見MongoDB 5.0