云数据库 MongoDB 版 8.3 引入了细粒度分片移除命令、执行中慢查询日志、查询级内存追踪和新聚合表达式。本文介绍所有新特性、优化项和行为变更。
完整的社区变更记录请参见 MongoDB 8.3 release notes。
速览
本文将从以下方面介绍云数据库 MongoDB 版 8.3 版本:
MongoDB 8.3 的更多新特性以及优化项,请参见 MongoDB 8.3 release notes。
聚合能力增强
数组索引访问
$map、$filter、$reduce 现在可以引用当前元素的索引。通过 arrayIndexAs 绑定自定义变量名,或使用内置的 $$IDX。
// 为每个元素添加从 1 开始的排名
db.scores.aggregate([
{ $project: {
ranked: { $map: {
input: "$items",
as: "item",
arrayIndexAs: "i",
in: { value: "$$item", rank: { $add: ["$$i", 1] } }
}}
}}
])
新增表达式
|
表达式 |
用途 |
典型场景 |
|
|
返回 BinData 的子类型 |
区分 UUID 与通用二进制字段 |
|
|
在管道中生成随机 ObjectId |
在 |
|
|
生成 MD5、SHA-256 或 XXH64 哈希 |
在服务端计算内容指纹或分区键 |
|
|
BSON 与扩展 JSON 互转 |
将存为文本字段的 JSON 字符串解析回带类型的 BSON 值 |
类型转换增强
-
$toString现在可以处理 object、array、正则表达式、MaxKey、MinKey 和 timestamp。 -
$convert新增base参数,支持 2、8、10、16 进制的字符串-数值互转。 -
新增
$toArray(字符串到数组、binData 到数值数组)和$toObject(字符串到对象)转换。详情参见 Convert binData to Array。
分片管理流程重构
细粒度分片移除
|
阶段 |
命令 |
说明 |
|
启动 |
|
开始将 chunk 从目标分片迁出 |
|
暂停 |
|
暂停迁移;分片仍留在集群中 |
|
查看 |
|
返回迁移进度和剩余 chunk 数 |
|
提交 |
|
数据迁移完成后确认移除 |
DDL 路由要求
监控与诊断增强
执行中慢查询日志
慢查询现在可以在执行期间记录,不仅限于完成后。每条查询在超过阈值时记录一次。
通过 --defaultSlowInProgMS 启动参数或运行时设置阈值:
db.setProfilingLevel(1, { slowms: 100, slowinprogms: 3000 })
日志条目包含 originalQueryShapeHash,可将分片级慢日志关联到 mongos 上的原始请求。
查询级内存追踪
两个新字段出现在 $currentOp、db.currentOp()、profiler、慢查询日志、explain 输出和 PlanCache.list() 中:
|
字段 |
说明 |
|
|
操作当前消耗的内存 |
|
|
操作的峰值内存消耗 |
通过这两个字段定位内存消耗大户,为内存限制的设置提供数据依据。
queryStats 包含 mongos 转发的查询
启用 queryStats 后,分片服务器现在包含来自 mongos 的查询统计。此前这些查询在分片级不可见。
serverStatus 按需输出
新增指标覆盖聚合扩展、分片临界区、TTL 操作、向量搜索、复制 oplog fetcher 延迟和执行队列准入。
通过 none: 1 标志位屏蔽所有可选字段,再选择性加入:
db.runCommand({ serverStatus: 1, none: 1, locks: 1 })
使用 lockContentionMetrics: 1 按需包含锁竞争数据。
service 字段已从 serverStatus 输出中移除。
FTDC 保留容量提升
FTDC 默认诊断目录上限从 200 MB 提升至 500 MB。connPoolStats 现在会为 mongod 采集。
性能与系统参数
预认证连接资源管控
三个新参数限制未完成认证的连接可占用的资源:
|
参数 |
用途 |
|
|
预认证缓冲区内存上限 |
|
|
消息大小错误的速率限制 |
|
|
预认证最大消息体大小 |
这些参数防止连接洪泛攻击导致的实例资源耗尽。
缓存压力自动回收
cachePressureQueryPeriodMilliseconds 控制存储引擎检查缓存压力的频率。检测到压力后,自动中止最旧的事务以释放缓存。
过载感知服务选择
开启 overloadAwareServerSelectionEnabled 后,客户端收到 SystemOverloadedError 时自动切换到其他节点重试。
五个参数控制 mongos 到 mongod 内部连接的重试退避:
|
参数 |
控制内容 |
|
|
初始重试延迟 |
|
|
最大重试延迟 |
|
|
最大重试次数 |
|
|
每个分片的过载重试令牌池大小 |
|
|
请求成功时令牌的返还速率 |
入口限流豁免
ingressRequestRateLimiterApplicationExemptions 允许指定不受入口限流约束的应用程序(按 appName 匹配)。在连接字符串中设置应用名:
mongodb://server:27017/db?appname=mongodump
Profiler 影响控制
两个新参数防止 profiler 影响生产性能:
|
参数 |
用途 |
|
|
profiling 锁的全局超时 |
|
|
每数据库每秒最大放弃写入数 |
通过 serverStatus 中的 profiler.totalAbandonedWrites 和 profiler.dbsPastThreshold 指标监控 profiler 开销。
索引变更
2dsphere 默认版本升级
2dsphereVersion 默认值从 3 升级至 4。
将 FCV 降级到 8.3 以下前,必须先删除所有 version 4 的 2dsphere 索引。
GeoJSON 优先
文档同时包含 GeoJSON 和旧版数值坐标时,索引生成现在优先使用 GeoJSON。如果依赖旧版坐标的现有索引,升级后需要重建。
时间序列变更
|
变更 |
详情 |
|
分片键约束 |
|
|
索引命名 |
时间序列索引不能命名为 |
|
timeField 命名 |
|
行为变更
|
领域 |
变更 |
|
Upsert 错误码 |
产生超过 16 MB BSON 对象的 upsert 返回错误码 10334( |
|
validate |
|
|
日期运算 |
|
|
浮点数解析 |
支持解析全范围双精度浮点数(含次正规数如 |
|
$trim 字符上限 |
|
|
$mergeObjects |
可在 |
|
TextOr 内存 |
TextOr 阶段( |
|
explain |
分片集群上对不存在的数据库执行 |
|
config.csrs.indexes |
|
|
findShardsOnConfigTimeoutMS |
新增参数,限制 |