尝试降级之前,请先熟悉本页面的内容。
降级路径
重要
在升级或降级集群之前,请确保所有集群节点都正在运行。否则,升级或降级将在所有节点启动后才能完成。
如果您需要从9.0降级,请降级到8.3的最新补丁发布。
MongoDB仅支持相邻版本的单版本降级。您无法降级到发布当前发布落后多个版本的版本。
对于任何MongoDB发布,您都可以升级或降级到上一个主要版本或次要版本。
先决条件
在开始降级程序之前,必须完成以下先决条件步骤。
删除向后不兼容的功能
要从 9.0 降级到 8.3,必须删除与 8.3 不兼容的 9.0 功能。有关不兼容功能的列表以及如何删除这些功能,请参阅向后不兼容的功能。
确保没有正在进行的重新分片操作
确保所有重新分片操作均已成功完成。 如果最近的重新分片操作由于主节点故障转移而失败,则必须先运行abortReshardCollection命令,然后才能降级分片集群的featureCompatibilityVersion 。
如果在您降级分片集群的featureCompatibilityVersion时重新分片操作仍在运行,则重新分片操作将无法完成。
降级功能兼容版本(fCV)
要降级分片集群的FCV ,请执行以下操作:
确保没有正在进行任何初始同步。 在初始同步进行时运行
setFeatureCompatibilityVersion命令会导致初始同步重新启动。确保所有节点的副本集配置中都没有
newlyAdded字段。 在副本集中的每个节点上运行以下命令以验证这一点:use local db.system.replset.find( { "members.newlyAdded" : { $exists : true } } ); newlyAdded字段仅在初始同步期间和初始同步后不久出现在节点的副本集配置文档中。确保没有副本集成员处于
ROLLBACK或RECOVERING状态。将
featureCompatibilityVersion降级为"8.3"。重要
在降级binary版本之前,请确认您已删除所有向后不兼容的功能。在继续之前,请务必评估您的升级路径。
db.adminCommand( { setFeatureCompatibilityVersion: "8.3", confirm: true } ) setFeatureCompatibilityVersion命令对内部系统集合执行写入操作,并且是幂等的。如果命令未成功完成,请在mongos实例上重试命令。注意
当您将FCV从 9.0 降级时, MongoDB会将元数据从分片移回配置服务器。在此过渡期间, FCV降级会耗尽并阻止数据块操作,包括:
手动迁移和负载均衡器发布的迁移
FCV降级完成后,数据段操作将恢复。
注意
故障排除
当
setFeatureCompatibilityVersion在分片集群上运行时,数据块迁移、分割和合并可能会失败并显示ConflictingOperationInProgress。如果
setFeatureCompatibilityVersion因ManualInterventionRequired错误而失败,并且集群最近进行了因选举而失败的重新分片操作,则必须先运行abortReshardCollection命令,然后再尝试再次运行setFeatureCompatibilityVersion。
要确保副本集的所有节点都有更新的
featureCompatibilityVersion,请连接到每个副本集节点并检查featureCompatibilityVersion:db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ) "featureCompatibilityVersion" : { "version" : "8.3" } 如果任何成员返回
"9.0"的featureCompatibilityVersion,请等待该成员返回版本"8.3",然后再继续。
有关返回的featureCompatibilityVersion值的详细信息,请参阅获取 FeatureCompatibilityVersion。
降级程序
警告
在继续执行降级过程之前,请确保所有分片集群成员(包括延迟副本集成员)都有先决条件更改。 为此,请在降级之前检查featureCompatibilityVersion并删除每个节点的不兼容功能。
禁用负载均衡器
要禁用负载均衡器,请将 连接到分片集群中的mongosh mongos实例,然后运行以下命令:
sh.stopBalancer()
注意
如果迁移正在进行,MongoDB 会在停止负载均衡器之前完成进行中的迁移。 要检查负载均衡器的当前状态,请运行sh.isBalancerRunning() 。
要验证负载均衡器是否已禁用,请运行以下命令:
sh.getBalancerState()
如果负载均衡器已禁用, sh.getBalancerState()将返回false 。
有关禁用负载均衡器的更多信息,请参阅禁用负载均衡器。
降级每个分片,一次一个
将分片的从节点降级,一次一个。
关闭节点。
要关闭
mongod进程,请使用mongosh连接到部署并运行以下命令:db.adminCommand( { shutdown: 1 } ) 重新启动成员。
要启动
mongod进程,请运行以下命令:mongod --dbpath </path-to-data-folder> 等待成员进入
SECONDARY状态。在降级下一个从从节点(secondary node from replica set)之前,请等待该成员恢复到
SECONDARY状态。要检查成员的状态,请使用rs.status()中的mongosh方法。重复前面的步骤以降级每个从节点。
降级分片仲裁节点(如果有)。
如果副本集不包含仲裁节点,请跳过此步骤。
将分片集群的仲裁节点降级:
关闭节点。
要关闭仲裁节点,请使用
mongosh连接到仲裁节点并运行以下命令:db.adminCommand( { shutdown: 1 } ) 删除仲裁节点数据目录的内容。
要查找仲裁节点
mongod的数据目录,请检查storage.dbPath配置设置或--dbpath命令行选项。运行以下命令:
rm -rf /path/to/mongodb/datafiles/* 重新启动仲裁节点。
要启动
mongod进程,请运行以下命令:mongod --dbpath </path-to-mongodb-datafiles> 等待成员进入
ARBITER状态。在降级主节点 (primary
ARBITERnode in thers.status()replica set)之前,请等待该成员恢复到 状态。要检查成员的状态,请使用 中的mongosh方法。
将分片主节点降级。
从主节点降级。
在
mongosh中,使用 降级主节点 (primary noders.stepDown()in the replica set)并开始选举新的主节点 (primary node in the replica set):rs.stepDown() 验证主节点是否已降级。
运行以下命令:
rs.status() 验证主节点是否已降级以及其他节点是否已进入
PRIMARY状态。关闭前主节点。
要关闭以前的主节点 (primary node in the replica set),请使用
mongosh连接到部署并运行以下命令:db.adminCommand( { shutdown: 1 } ) 使用8.3二进制文件重新启动
mongod。要启动
mongod进程,请运行以下命令:mongod --dbpath </path-to-mongodb-datafiles> 对剩余分片重复上述步骤。
降级配置服务器
逐个降级配置服务器副本集 (CSRS) 的分片的从节点:
关闭从节点。
连接到从节点并运行以下命令:
db.adminCommand( { shutdown: 1 } ) 重新启动成员。
要启动
mongod进程,请运行以下命令:mongod --dbpath </path-to-data-folder> 等待成员进入
SECONDARY状态。在降级下一个从从节点(secondary node from replica set)之前,请等待该成员恢复到
SECONDARY状态。要检查成员的状态,请使用rs.status()中的mongosh方法。重复前面的步骤以降级每个从节点。
将配置服务器主节点降级。
从主节点降级。
在
mongosh中,运行rs.stepDown()以 降级 主节点并为新主节点开启选举:rs.stepDown() 验证主节点是否已降级。
运行以下命令:
rs.status() 验证主节点是否已降级以及其他节点是否已进入
PRIMARY状态。关闭前主节点。
要关闭以前的主节点 (primary node in the replica set),请使用
mongosh连接到部署并运行以下命令:db.adminCommand( { shutdown: 1 } ) 使用8.3二进制文件重新启动
mongod。要启动
mongod进程,请运行以下命令:mongod --dbpath </path-to-mongodb-datafiles>
重新启用负载均衡器
降级所有分片集群组件后,请连接到mongos并运行以下命令以重新启用负载均衡器:
sh.startBalancer()
sh.startBalancer()方法还启用分片集群的自动分割。