Docs 主页 → 开发应用程序 → MongoDB Manual
将 4.4 分片集群降级到 4.2
在尝试任何降级之前,请先熟悉本文档的内容。
降级路径
重要
升级或降级副本集之前,请确保所有副本集节点都正在运行。否则,升级或降级操作将在所有节点启动后才会完成。
如果需要从 4.4 降级,请降级到最新的 4.2 补丁版本。
MongoDB 仅支持单版本降级。您无法降级到比当前版本落后多个版本的版本。
例如,您可以将 4.4 系列部署降级为 4.2 系列部署。但是,不支持将 4.2 系列部署进一步降级为 4.0 系列部署。
警告
降级下限
如果需要从版本 4.4 降级,请降级到 4.2.6 或更高版本。 您无法降级到 4.2.5 或更早的版本。
创建备份
可选但建议使用。创建数据库备份。
先决条件
要从 4.4 降级到 4.2,您必须删除保留的不兼容功能和/或更新不兼容的配置设置。
1. 命名空间长度
从 MongoDB 4.4 开始:
未分片集合和视图的命名空间长度限制为255字节,分片集合的命名空间长度限制为235字节。对于集合或视图,命名空间包括数据库名称、点 ( .
) 分隔符和集合/视图名称(例如<database>.<collection>
)。
在降级之前,请解析命名空间超过特征兼容性版本 (FCV) 4.2 的 120 字节命名空间长度限制的任何collection或视图。
要确定collection或视图的命名空间是否超过 120 字节限制,请将mongo
shell 连接到mongos
实例并运行:
db.adminCommand("listDatabases").databases.forEach(function(d){ let mdb = db.getSiblingDB(d.name); mdb.getCollectionInfos( ).forEach(function(c){ namespace = d.name + "." + c.name namespacelenBytes = encodeURIComponent(namespace).length if (namespacelenBytes > 120) { print (c.type.toUpperCase() + " namespace exceeds 120 bytes:: " + namespace ) } } ) })
如果任何collection或视图命名空间超过 120 字节,则在降级 FCV之前执行 :
对于未分片的collection,请使用
renameCollection
命令重命名collection。对于分片collection:
使用
$merge
创建名称更短的新分片collection,然后删除原始collection。将
mongoexport
和mongoimport
用于名称更短的新集合,然后删除原始集合。
对于视图,使用
db.createView()
以更短的名称重新创建视图,然后删除原始视图。
2. 降级特征兼容性版本 (fCV)
提示
降级到featureCompatibilityVersion (fCV) : "4.2" 对每个分片隐式执行
replSetReconfig
,以从配置文档中删除term
字段,并阻塞,直到新配置传播到大多数副本集节点。
要降级分片集群的featureCompatibilityVersion
,请执行以下操作:
将
mongo
Shell 连接到mongos
实例。将
featureCompatibilityVersion
降级为"4.2"
。db.adminCommand({setFeatureCompatibilityVersion: "4.2"}) setFeatureCompatibilityVersion
命令对内部系统集合执行写入操作,并且是幂等的。如果由于任何原因未成功完成该命令,请在mongos
实例上重试该命令。注意
当
setFeatureCompatibilityVersion
在分片集群上运行时,数据段迁移、分割和合并可能会失败并显示ConflictingOperationInProgress
。要确保分片集群的所有成员反映更新后的
featureCompatibilityVersion
,请连接到每个分片副本集成员和每个配置服务器副本集成员并检查featureCompatibilityVersion
:提示
对于已启用访问控制的分片集群,要对分片副本集成员运行以下命令,您必须以分片本地用户身份连接到该成员。
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ) 所有成员均应返回包含以下内容的结果:
"featureCompatibilityVersion" : { "version" : "4.2" } 如果任何成员返回
"4.4"
的featureCompatibilityVersion
,请等待该成员反映"4.2"
版本,然后再继续。
注意
仲裁节点不会复制 admin.system.version
集合。因此,无论副本集的 fCV 值如何,仲裁节点始终具有等于二进制文件的降级版本的特征兼容性版本。
例如,MongoDB 4.4 集群中的仲裁节点的 fCV 值为 4.2。
有关返回的featureCompatibilityVersion
值的详细信息,请参阅获取 FeatureCompatibilityVersion。
3. 删除 fCV 4.4 保留功能
仅当 fCV 设置为 "4.4"
时,才需要执行以下步骤。
删除所有与 4.2 不兼容的保留 4.4功能。 其中包括:
- 复合哈希索引
删除所有复合哈希索引。
使用
db.collection.getIndexes()
识别集合中的任何复合哈希索引,并使用db.collection.dropIndex()
删除这些索引。如果使用复合哈希索引对任何collection进行分片,请遵循下面
Compound Hashed Shard Keys
下列出的指导。- 组合哈希分片键 (Compound Hashed Shard Keys)
删除使用复合哈希分片键分片的任何collection。
使用
sh.status()
识别具有复合哈希分片键的collection并删除这些collection。如果集合为空或者集合中确实包含需要保留的数据,则使用
db.collection.drop()
删除集合。如果集合中有需要保存的数据,请先备份集合,然后再使用
db.collection.drop()
删除集合。 降级集群后,将数据恢复到集群中。
4. 删除 4.4 功能
删除所有使用 4.4 功能的保留功能。 这些包括但不限于:
如果有任何视图定义包含 4.4 操作符,例如
$unionWith
或$function
。 另请参阅新聚合操作符。
5. 更新缺失的分片键
在 MongoDB 4.4 中,collection中的文档可能会缺少字段。
如果降级到 4.2 并且分片集合包含缺少分片键字段的文档,则 4.2 mongos
实例不会返回缺少分片键字段的文档。 为避免这种情况,请在降级之前更新文档以包含缺失的分片键字段。
要查找缺少分片键任何部分的文档,请使用$exists
操作符。
例如,如果collectioncontacts
具有分片键{
zipcode: 1 }
,要查找没有zipcode
字段的文档:
db.contacts.find( { zipcode: { $exists: false } } )
要为这些文档将缺失的分片键字段设置为null
,可以使用db.collection.updateMany()
方法:
db.contacts.updateMany( { zipcode: { $exists: false } }, { $set: { zipcode: null } } )
如果将缺失的分片键字段设置为非null
值,则无法使用db.collection.updateMany()
方法,并且必须在事务中或作为可重试写入来执行更新。 有关详细信息,请参阅设置缺失的分片键字段。
6. 更新超过 512 字节的分片键
在版本 4.4 中进行了更改:在版本 4.4 中,MongoDB 删除了对分片键大小的 512 字节限制。 但是,对于 MongoDB 4.2 及更早版本,分片键不能超过 512 字节。 将任何超过 512 字节大小限制的分片键值更新为不超过 512 字节大小限制。 要更新文档的分片键值,请参阅更改文档的分片键值。
步骤
降级分片集群
警告
在继续执行降级过程之前,请确保所有节点(包括分片集群中的延迟副本集节点)都反映先决条件更改。 也就是说,在降级之前检查每个节点的featureCompatibilityVersion
并删除不兼容的功能。
禁用负载均衡器。
将mongo
shell 连接到集群中的mongos
实例,然后运行sh.stopBalancer()
以禁用负载均衡器:
sh.stopBalancer()
注意
如果迁移正在进行,系统将在停止负载均衡器之前完成进行中的迁移。您可以运行sh.isBalancerRunning()
来检查负载均衡器的当前状态。
要验证是否禁用了负载均衡器,请运行 sh.getBalancerState()
;如果已禁用负载均衡器,则会返回 false:
sh.getBalancerState()
有关禁用负载均衡器的更多信息,请参阅禁用负载均衡器。
降级每个分片,一次一个。
逐个降级分片。
一次降级一个分片的从节点:
在
mongosh
中运行以下命令以执行干净关闭,或参阅停止mongod
进程以了解安全终止mongod
进程的其他方法:db.adminCommand( { shutdown: 1 } ) 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。
等待成员恢复到
SECONDARY
状态,然后再降级下一个从节点成员。 要检查成员的状态,请将mongo
Shell 连接到分片并运行rs.status()
方法。对每个从节点成员重复降级操作。
降级分片仲裁节点(如果有)。
如果副本集不包含仲裁节点,请跳过此步骤。
在
mongosh
中运行以下命令以执行干净关闭,或参阅停止mongod
进程以了解安全终止mongod
进程的其他方法:db.adminCommand( { shutdown: 1 } ) 删除仲裁节点数据目录的内容。
storage.dbPath
配置设置或--dbpath
命令行选项指定仲裁节点mongod
的数据目录。rm -rf /path/to/mongodb/datafiles/* 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。
等待成员恢复到
ARBITER
状态。 要检查成员的状态,请将mongo
Shell 连接到成员并运行rs.status()
方法。
将分片的主节点降级。
降级副本集主节点。 将
mongo
Shell 连接到主节点,并使用rs.stepDown()
降级主节点并强制选举新的主节点:rs.stepDown() rs.status() 当状态显示主节点已降级并且另一个节点处于
PRIMARY
状态时,请继续。从
mongo
Shell 运行以下命令,以干净关闭降级主节点,或者参阅停止mongod
进程以了解安全终止mongod
进程的其他方法:db.adminCommand( { shutdown: 1 } ) 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。
对剩余分片重复上述步骤。
降级配置服务器。
一次降级一个配置服务器副本集 ( CSRS ) 的从节点:
在
mongosh
中运行以下命令以执行干净关闭,或参阅停止mongod
进程以了解安全终止mongod
进程的其他方法:db.adminCommand( { shutdown: 1 } ) 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。
等待成员恢复到
SECONDARY
状态,然后再降级下一个从节点成员。 要检查成员的状态,请将mongo
Shell 连接到分片并运行rs.status()
方法。对每个从节点成员重复降级操作。
降级配置服务器主节点。
将
mongo
Shell 连接到主节点,并使用rs.stepDown()
降级主节点并强制选举新的主节点:rs.stepDown() rs.status() 当状态显示主节点已降级并且另一个节点处于
PRIMARY
状态时,请继续。从
mongo
Shell 运行以下命令,以干净关闭降级主节点,或者参阅停止mongod
进程以了解安全终止mongod
进程的其他方法:db.adminCommand( { shutdown: 1 } ) 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。
重新启用负载均衡器。
完成分片集群组件的降级后,将mongo
shell 连接到mongos
并重新启用负载均衡器。
sh.startBalancer()
mongo
shell 方法sh.startBalancer()
还启用分片集群的自动分割。