本文介紹ApsaraDB for MongoDB支援的版本、引擎及版本和引擎之間的適配關係,協助您選擇適合您的業務需求的執行個體。
支援版本
ApsaraDB for MongoDB支援如下版本:
您可以在執行個體運行期間手動升級資料庫版本,但版本升級後不支援降級。詳情請參見升級資料庫版本。
儲存引擎
儲存引擎 | 適用情境 | 說明 |
WiredTiger | 預設儲存引擎,適用於大多數業務情境。 | 基於BTree結構組織資料,相比MongoDB早期的MMAPv1儲存引擎效能提升明顯,且支援資料壓縮,儲存成本更低。 |
版本和儲存引擎的適配關係
儲存引擎 | 4.4及以上版本 | 4.2版本 | 4.0版本 | 3.4版本(已停售) |
WiredTiger |
|
|
|
|
MongoDB 8.0版本說明
新推出升級版TCMalloc、最佳化複製效能、最佳化reshard效能等功能,並在分區、日誌、彙總、安全性等方面進行了增強最佳化。
升級版TCMalloc
升級版TCMalloc會使用每個CPU的緩衝(而不是每個線程的緩衝),以減少記憶體片段並使資料庫更能適應高壓力工作負載。同時,升級版TCMalloc使用時會在後台建立一個線程,每秒嘗試將記憶體釋放回作業系統。
複製效能
從MongoDB 8.0版本開始,
writeConcern
為majority
時,MongoDB會在大多數複本集成員已經寫入了相關的oplog後就返回確認,而不是等待應用這個更改後才返回,此更改提高了majority
模式下寫入的效能。Secondary節點會並行寫入和應用每個批次的oplog內容。當Writer線程從主節點讀取新的oplog條目並將其寫入本地oplog時,Applier線程會非同步將這些更改應用到本機資料庫。此更改提高了Secondary節點的複製輸送量。
reshard效能
MongoDB 8.0版本支援了forceRedistribution選項,允許使用和之前相同的分區鍵對集合進行重新分區,將資料重新分配到新的分區上。這個過程相比Chunk進行範圍遷移要快很多,還可以與zones選項搭配將資料移轉到特定地區。
分區
雜湊分區會預設為每個分區建立1個Chunk(MongoDB 8.0版之前是預設2個)。
dbhash
命令可以直接在分區上運行。findAndModify
和deleteOne
命令可以使用部分Shard Key作為查詢條件。在一個已經分區的集合上使用
upsert
為true
的updateOne
命令時,查詢條件中可以不包含所有的Shard Key。支援通過
unshardCollection
命令或sh.unshardCollection()
方法取消現有集合的分區,此操作會將集合中的所有文檔移動到指定的分區或資料量最少的分區上。支援通過
moveCollection
命令將某一個未分區的集合移動到指定的分區上,不必約束於Primary Shard。但時間序列集合和可查詢密碼編譯集合不可移動,且可能會有2秒左右的集合寫入阻塞。提供了新的資料庫命令和mongosh協助函數:
命令
mongosh協助函數
說明
moveCollection
sh.moveCollection()
將一個未分區的集合移至某個Shard。
unshardCollection
sh.unshardCollection()
取消對現有分區集合的分區,並將集合資料移至某個Shard。
abortMoveCollection
sh.abortMoveCollection()
停止進行中的
moveCollection
操作。abortUnshardCollection
sh.abortUnshardCollection()
停止進行中的
unshardCollection
操作。無
sh.shardAndDistributeCollection()
對集合進行分區,並使用提供的分區鍵立即重新分配資料。
運行該協助函數與連續運行
shardCollection
和reshardCollection
的結果相同,目的是加快資料移動速度。
日誌記錄
慢日誌中添加了
workingMillis
欄位,用於展示實際執行操作所花費的時間。區別於之前的
durationMillis
操作總延遲,workingMillis
不會包含鎖等待或流量控制等因素消耗的時間。彙總
binData轉換
您可以使用$convert運算子執行以下轉換:
字串值轉換為binData值。
binData值轉換為字串值。
另外,$toUUID運算式提供了將字串轉換為UUID值的簡化文法。
$queryStats
$queryStats階段會返回已記錄查詢的統計資料,且最佳化了在Change Stream中的跟蹤和報告指標。
安全
可查詢加密
支援使用
$lt
、$lte
、$gt
、$gte
對加密欄位進行範圍查詢。入口隊列
MongoDB 8.0引入了一個新的隊列用於入口准入控制(
ingressAdmissionControllerTicketPoolSize
),即從網路進入資料庫的操作將進入入口隊列。入口隊列預設情況下不進行限制,您可以自訂隊列最大值使得請求進行排隊。
其他最佳化
引入了一種新的Query Shape,此前的Query Shape被稱為Plan Cache Query Shape,同時查詢最佳化工具會將Query Settings作為附加的輸入資訊,影響最終的查詢計劃選擇。
setQuerySettings添加查詢設定:
可用於指定索引選擇,8.0版本棄用了使用
planCacheSetFilter
來設定index filter
的方式。可用於限流設定,您可以通過
reject
選項設定拒絕某個Query Shape。
removeQuerySettings
用於刪除查詢設定。$querySettings
用於查看查詢設定。
explain()
命令現在會通過queryPlanner.optimizationTimeMillis
返回查詢計劃用在最佳化上的時間,單位為毫秒。新增
defaultMaxTimeMS
參數,用於指定單個讀取操作完成的預設時間限制,單位為毫秒。適用的操作:
find
aggregate
(不包括$merge
和$out
階段)count
distinct
dbHash
如果用戶端指定了
maxTimeMS
,那麼defaultMaxTimeMS
對此操作將不再生效。
新增
bulkWrite
命令,可以在一個請求中對多個集合執行多條插入、更新、刪除操作。updateOne
支援對sort
選項進行排序。支援在Capped Collection上建立TTL索引。
非事務的批量插入不會再產生單獨的oplog,而是放到一個oplog中進行批處理,所有插入的文檔在Change Stream事件中有相同的
clusterTime
。此改動提高了批量插入的效能,避免從節點回放多條oplog可能導致的複寫延遲。支援對同一資料庫下的不同集合并發執行DDL操作。
在叢集執行DDL操作(如
reshardCollection
這種會修改集合的命令)的過程中添加或刪除分區會被阻塞,您只能在DDL操作後執行。改進了索引構建,返回錯誤報表的速度更快,故障恢複能力更強。
行為
MongoDB 8.0版本
MongoDB 8.0之前版本
發現錯誤停止構建索引的時機
在收集掃描階段發現的索引錯誤(重複鍵錯誤除外)會立即返回,然後索引構建停止。
MongoDB 8.0可協助您快速診斷索引錯誤。例如,如果發現不相容的索引值格式,則會立即將錯誤返回給您。
MongoDB 8.0之前版本在收集掃描階段發現的索引錯誤會在提交階段返回錯誤,提交階段發生在索引構建的末尾。
與MongoDB 8.0相比,索引構建錯誤可能需要很長時間才能返回,因為錯誤是在提交階段索引構建結束時返回的。
彈性部署
提高部署的彈性。如果發生索引構建錯誤,輔助成員可以請求主成員停止索引構建,並且輔助成員不會崩潰。
停止索引構建的請求並不總是可行的,如果成員已經投票提交索引,則輔助成員無法請求停止索引構建,並且輔助成員會崩潰(類似於MongoDB 7.0及更早版本)。
索引構建錯誤可能導致輔助成員崩潰。
磁碟空間
改進了索引構建的磁碟空間管理。如果可用磁碟空間低於
indexBuildMinAvailableDiskSpaceMB
參數中指定的最小值,索引構建可能會自動停止。如果成員已經投票同意提交索引,則索引構建不會停止。
可用磁碟空間不足時,也會停止索引構建。
MongoDB 7.0版本說明
新推出可查詢加密(Queryable Encryption)、分區中繼資料一致性校正、採樣查詢與分析分區鍵(analyzeShardKey)和自動合并(AutoMerger)功能,並在分區(Sharding)、時序集合(Time-Series Collection)、彙總(Aggregation)和安全性等方面進行了增強最佳化。
可查詢加密
在MongoDB 6.0版本中,可查詢加密功能為預覽(Preview)版本,該功能在MongoDB 7.0版本中正式發布(Generally Available),更多資訊請參見Queryable Encryption。
分區中繼資料一致性校正
MongoDB7.0版本中新增了checkMetadataConsistency命令,以檢查不同分區中中繼資料不一致的情況。您可以在日常營運中增加該巡檢項,儘早發現可能不一致的風險。更多資訊請參見checkMetadataConsistency。
採樣查詢與分析分區鍵
支援基於採樣查詢(Sampled queries)的結果來分析集合的分區鍵是否合理,可以協助您更好地設計Schema以及分區鍵、更合理使用分區架構。更多資訊請參見analyShardKey與configureQueryAnalyzer。
自動合并
MongoDB 7.0為自動均衡器(Balancer)實現了一個新的自動合并器(AutoMerger),當資料或索引分布不均衡、存在過多分區或進行資料移轉時,自動合并器會合并Chunks,以均衡資料並提高效能。MongoDB 7.0預設開啟該功能,您也可以通過Balancer使用中視窗的控制該功能。
分區
支援通過參數
rangeDeleterHighPriority
設定刪除孤兒文檔是否具備更高的優先順序。通常業務的刪除往往具有更高的優先順序, 所以該參數預設為false。不再支援用於記錄目錄緩衝重新整理行為的
operationsBlockedByRefresh
監控指標,原因為基於mongos每個利用集合路由資訊的操作都會增加該計數器的次數。新增關於Resharding的監控指標。
addShard命令不再支援
maxSize
選項。調整
config.settings
集合的chunksize時,增加了合理性校正,將值限制在[1,1024]。MongoDB在6.0.3版本後對Balancer策略進行若干調整:
Balancer不再依據分區間Chunks數量的差異,而是依據分區間資料量的差異進行均衡。
將Chunk的邏輯概念轉為Range。
自動分裂(auto-splitting)只會在跨分區移動時發生。
時序集合
移除了之前版本對於時序集合DELETE命令的操作限制。除了不能在多文檔事務中使用相關刪除命令外,當前DELETE命令再無其他限制。
COMPACT命令支援時序集合。
彙總
新增了以下操作符,支援位計算和百分位元:
欄位名
描述
$bitAnd
返回Int或Long類型數值的按位與運算的結果。
$bitNot
返回Int或Long類型數值的按位取反運算結果。
$bitOr
返回Int或Long類型數值的按位或運算的結果。
$bitXor
返回Int或Long類型數值的按位異或運算的結果。
$median
返回近似中位元,相當於50百分位元。
$percentile
返回指定的百分位元。
安全性
支援KMIP 1.0和1.1。
支援OpenSSL 3.0以及OpenSSL FIPS。
其他最佳化
慢日誌新增了
catalogCacheIndexLookupDurationMillis
等欄位,更多資訊請參見log messages for slow queries。支援動態調整儲存引擎事務並發度,之前預設是128,從MongoDB 7.0起,MongoDB會自動動態調整該並發度,更多資訊請參見Concurrent Storage Engine Transactions。
currentOp新增了關於query sampling的全新欄位,更多資訊請參見currentop-metrics。
支援複合萬用字元索引,更多資訊請參見Compound Wildcard Indexes。
新增
$changeStreamSplitLargeEvent
運算元支援對超過16 MB的超大變更事件(change events)進行切分,更多資訊請參見Large Change Stream Events。最佳化基於Slot查詢執行引擎的效能。
新增Chunk遷移的指標,更多資訊請參見New Sharding Statistics for Chunk Migrations。
支援通過
USER_ROLES
系統變數來擷取當前User的角色。新增
analyzeShardKey
、balancer
、queryAnalyzers
相關的全域參數。serverStatus的返回結果新增更多欄位,更多資訊請參見serverStatus Output Change。
MongoDB 6.0版本說明
新推出可查詢加密(Queryable Encryption)和叢集同步(Cluster-to-Cluster Sync)功能,並在時序集合(Time Series Collection)、變更流(Change Streams)、彙總(Aggregation)、查詢(Query)、彈性和安全性方面進行了增強最佳化。
可查詢加密
允許使用者從用戶端加密敏感性資料,將其作為完全隨機的加密資料儲存在資料庫伺服器端,並對加密資料進行豐富的查詢。
可查詢加密只允許在用戶端查看敏感性資料的明文,在查詢到達伺服器端時會同時包含從KMS擷取的加密金鑰,然後在伺服器端以密文進行查詢並返回,最後在用戶端利用密鑰解密後以明文呈現。
叢集同步
推出了新的同步工具mongosync,它能支援跨任何環境(包括混合實境世界、Atlas、本地以及邊緣環境)的資料同步(兩個MongoDB執行個體間連續且單向的資料同步)。使用者還可以即時控制和監控整個同步過程,按需啟動、停止、恢複甚至反轉同步。
時序集合
分別從索引、查詢以及排序多個方面增強了時序集合。
引入二級和複合索引,以改善讀取效能。
引入針對時空資料的地理位置索引(Geo-Indexing),將地理資訊添加到時序資料,有助於更好地分析涉及距離和位置的情境。
情境樣本:跟蹤夏日冷鏈運輸車的溫度變化情況、監測特定航線上的貨運船燃料消耗。
最佳化對時序資料的
last point
查詢,不再需要掃描整個集合後才能查詢到最後一個資料點。最佳化對時序資料的排序,通過時間以及中繼資料欄位上的聚簇索引(Clustered Index)和二級索引(Secondary Index)更高效地完成排序操作。
變更流
推出了如下新特性以及最佳化項:
支援查看變更前的視圖(Pre-image)。
說明MongoDB 6.0之前的版本僅支援查看變更後的視圖,從MongoDB 6.0版本開始,支援查看變更前後的視圖。前後視圖的更多資訊,請參見Change Streams with Document Pre- and Post-Images。
支援
create
、createIndexes
、modify
和shardCollection
等DDL語句,更多資訊,請參見Change Events。Change Events新增
wallTime
欄位,時間戳記支援多種轉換和展示運算元(包括$toDate
、$tsSeconds
和tsIncrement
)以方便業務消費。
彙總
推出了如下新特性以及最佳化項:
分區叢集執行個體支援
$lookup
和$graphLookup
。改進
$lookup
對JOINS的支援。改進
$graphLookup
對圖遍曆的支援。提升
$lookup
效能,部分情境中效能提升可達百倍。
說明$lookup
和$graphLookup
的更多資訊,請參見$lookup (aggregation)和$graphLookup (aggregation)。查詢
新增
$maxN
、$topN
、$minN
、$bottomN
、$lastN
和$sortArray
等操作符。通過操作符可以將更多的計算從業務層下沉到資料庫中,使得業務層更加輕量化。說明操作符的更多資訊,請參見Aggregation Pipeline Operators。
彈性
推出了如下新特性以及最佳化項:
將資料區塊(Chunk)規格的預設值從64 MB調整為128 MB,有效降低了資料移轉頻率以及網路和路由層的開銷。
支援
configureCollectionBalancing
命令,此命令支援的功能如下:支援為不同的分區表設定不同的資料區塊規格。
樣本:資料規模特別大的分區表,將資料區塊規格調整到256 MB。資料規模相對較小但希望在分區上分布更均勻的分區表,將資料區塊規格調整到64 MB或32 MB。
支援主動對集合進行磁碟重組。
相較於
compact
命令,configureCollectionBalancing
命令提供了更好的磁碟重組服務,有效降低了磁碟空間佔用率。
說明configureCollectionBalancing
命令的更多資訊,請參見configureCollectionBalancing。安全性
對用戶端欄位級加密(CSFLE, Client-Side Field-Level Encryption)功能進行了最佳化。CSFLE將支援任何符合密鑰管理互連協議(KMIP,Key Management Interoperability Protocol)的密鑰管理供應商,即除了基於KeyFile的本地密鑰管理外,MongoDB支援通過KMIP與第三方密鑰管理裝置整合,為使用者提供更安全的保障。
說明用戶端欄位級加密功能被廣泛應用于敏感資料的管理中,尤其是資料移轉的情境。
MongoDB 5.0版本說明
標誌著一個新的發布周期的到來,以更快地交付新特性給到使用者。
原生時間序列平台
通過原生支援整個時間序列資料的生命週期(從採集、儲存、查詢、即時分析和可視化,到線上歸檔或隨著資料老化自動失效),使構建和已耗用時間序列應用程式的速度更快、成本更低。隨著MongoDB 5.0的發布,MongoDB擴充了通用的應用資料平台,使開發能夠更容易地處理時間序列資料,進一步擴充其在物聯網、金融分析、物流等方面的應用情境。
線上重新分區
您可以在業務運行(資料不斷增長)的情況下,按需改變集合的分區鍵(Shard key),而不需要資料庫停機或在資料集合中進行複雜的遷移。您只需要在MongoDB Shell中運行reshardCollection命令,選擇您需要重新分區的資料庫和集合,指定新的分區鍵即可。
reshardCollection: "<database>.<collection>", key: <shardkey>
說明<database>:需要重新分區的資料庫名稱。
<collection>:需要重新分區的集合名稱。
<shardkey>:分區鍵的名稱。
當您調用reshardCollection命令時,MongoDB會複製現有集合,然後將現有集合中所有oplog應用到新集合中,當所有oplog被使用後,MongoDB會自動切換到新集合,並在後台刪除舊集合。
版本化API
版本化API支援MongoDB靈活地在每個版本中為資料庫添加新的功能和改進內容(以新版本相容早期版本的方式)。當您需要改變API時,可以增加新版本的API,並與現有版本化的API在同一台伺服器上同時運行。隨著MongoDB版本發布的加速,版本化API能夠使您更快、更輕鬆地使用到MongoDB最新版本的功能特性。
版本化API定義了應用程式最常用的一組命令和參數(無論是資料庫在年度重大發布還是季度快速發布期間,這些命令均不會改變)。通過將應用程式生命週期和資料庫生命週期解耦,您可以將驅動程式固定在MongoDB API的特定版本上,即使資料庫發生升級和改進,您的應用程式將可以繼續運行數年而不需要修改代碼。
Write Concern預設Majority層級
從MongoDB 5.0開始,Write Concern預設層級為majority,僅當寫入操作被應用到Primary節點(主節點)且被持久化到大多數副本節點的日誌中的時候,才會提交並返回成功,“開箱即用”地提供了更強的資料可靠性保障。
長時間啟動並執行快照查詢
長時間啟動並執行快照查詢(Long-Running Snapshot Queries)增加了應用程式的通用性和彈性。您可以通過該功能運行預設時間為5分鐘的查詢(或將其調整為自訂期間),同時保持與即時事務性資料庫一致的快照隔離,也可以在Secondary節點(從節點)上進行快照查詢,從而在單個叢集中運行不同的工作負載,並將其擴充到不同的分區上。
新版MongoDB Shell
為了提供更好的使用者體驗,MongoDB 5.0從頭開始重新設計了MongoDB Shell(mongosh),以提供一個更現代化的命令列體驗,以及增強可用性的功能和強大的指令碼環境。新版MongoDB Shell已經成為MongoDB平台的預設Shell。新版MongoDB Shell引入了文法高亮、智能自動完成、上下文協助和有用的錯誤資訊,為您創造一個直觀、互動的體驗。
版本發布調整
從MongoDB 5.0開始,MongoDB發布的版本將分為Major Release(大版本)和Rapid Releases(快速發布版本),其中Rapid Releases作為開發版本提供下載和測試體驗,但不建議用在生產環境。
MongoDB 4.4版本說明
針對之前版本中使用者呼聲最高的痛點重點進行了改進。
Hidden Indexes
隱藏現有的索引,保證該索引在後續的查詢中不會被使用,用來觀察目標低效率索引的刪除是否會導致業務效能抖動,如不造成影響即可放心刪除該低效率索引。
Refinable Shard Keys
增加一個或多個Suffix Field來改善現有的文檔在Chunk上的分布問題,避免所有訪問集中在某個單一分區上,分散伺服器的壓力。
Compound Hashed Shard Keys
支援在複合索引中指定單個雜湊欄位,在極大程度上簡化商務邏輯的複雜性。
Hedged Reads
在分區叢集執行個體下,支援將一個讀請求同時發送給某個分區中的兩個複本集成員,並選擇響應最快的返回結果來恢複用戶端,以實現降低請求延遲的目的。
Streaming Replication
主庫Oplog主動流向備庫,相比之前版本的備庫輪詢方式,節省了近一半的往返時間,提升了主備複製的效能。
Simultaneous Indexing
主庫與備庫的索引建立操作同步進行,大幅減少主備庫在索引建立過程中產生的延遲,保證備庫能及時訪問到最新的資料。
Mirrored Reads
主節點會按一定的比例把讀流量複製到備庫上執行,保證從節點承載一定的讀流量,緩解業務的訪問延遲。
Resumable Initial Sync
在主備庫全量同步過程中,提供斷點續傳功能,避免因網路斷連而導致全量同步工作從頭進行。
Time-Based Oplog Retention
支援自訂指定Oplog的保留時間長度,避免主庫Oplog被清理觸發全量同步。
Union
新增$unionWith stage用於實作類別似於SQL的
union all
功能,增強了MongoDB的查詢能力。Custom Aggregation Expressions
新增$accumulator和$function用來實現自訂的Aggregation Expression,完善介面統一性和使用者體驗。
更多MongoDB 4.4版本的新功能,請參見MongoDB 4.4功能概覽。
MongoDB 4.2版本說明
採用二段提交方式,保證分區叢集事務的ACID特性,極大拓展了適用的業務情境。
分散式交易
採用二段提交方式,保證分區叢集事務的ACID特性,極大拓展了MongoDB的業務情境,實現從NoSQL到NewSQL的飛躍。
可重試讀
增加可重試讀功能,提供弱網環境下自動重試能力,降低業務端的邏輯複雜性,保證使用者業務的連續性。
萬用字元索引
對於非確定欄位,支援建立萬用字元索引覆蓋一個文檔下的多個特徵欄位,管理方便且使用靈活。
欄位級加密
驅動層面支援欄位級加密,可以針對特定的敏感資訊(例如帳號、密碼、價格、手機號等)單獨加密。避免全庫加密,提升業務靈活性和安全性。
物化視圖
通過最新的物化視圖可以緩衝計算結果,避免重複計算提升運行效率,減少邏輯複雜度。
MongoDB 4.0版本說明
更適用於金融等對事務有依賴且使用NoSQL特性的情境。
跨文檔事務支援
首個支援跨文檔事務的NoSQL雲資料庫,將文檔模型的速度,靈活性、功能與ACID保證相結合。
遷移速度提升40%
並發的讀取和寫入,使得新增的Shard節點能更快地完成資料移轉以承載業務壓力。
讀效能大幅擴充
藉助事務特性,Secondary節點不再因為同步處理記錄而阻塞讀取請求。 阿里雲同時在全體系版本支援多節點擴充功能,可大幅提升業務讀取能力。
MongoDB 3.4版本說明(已停售)
在效能和安全性等方面較3.2版本均有不同程度的提升。
MongoDB 3.2版本已下線,詳情請參見【通知】2月4日ApsaraDB for MongoDB下線3.2版本,上線4.2版本。
更快的主備同步
在同步資料的同時建立所有索引(以前的版本僅建立_id索引)。同時在同步資料的階段,Secondary節點不斷讀取新的oplog資訊,確保Secondary節點的local資料庫具備足夠的儲存空間來儲存臨時資料。
更高效的負載平衡
3.2及以前版本中,分區叢集的負載平衡由Mongos節點負責,多個Mongos節點會搶一個分布式鎖,由搶鎖成功的Mongos節點執行負載平衡任務,在Shard節點間遷移塊;而在3.4版本中,負載平衡由ConfigServer節點中的Primary節點負責,負載平衡的並發度和效率上均有大幅提升。
更豐富的aggregation操作
在3.4版本增加了大量的aggregation操作符,可支援更強的資料分析能力。例如,
bucket
能便捷地對資料進行分類;$grahpLookup
相較於3.2版本的$lookup
能支援更複雜的關係運算;$addFields
使得文檔操作更豐富(例如將某些欄位求和儲存為新的欄位)。支援Sharding Zones
分區叢集裡引入了Zone的概念,主要取代現在的tag-aware sharding機制,能將某些資料分配到指定的一個或多個Shard節點中,該特性極大地方便sharding cluster的跨機房部署。
支援Collation
在之前的版本裡,文檔裡儲存的字串不論是中英文還是大小寫,一律按位元組來對比;引入Collation後,支援對字串的內容進行解讀,可以按使用的locale進行對比,也支援在對比時忽略大小寫。
支援唯讀視圖(Read-only views)
在3.4中增加了對唯讀視圖的支援,可以將集合中滿足某個查詢條件的資料虛擬成一個特殊的集合,使用者可以在特殊的集合上做進一步的查詢操作。