Docs 菜单

Docs 主页开发应用程序MongoDB Manual

将 4.4 分片集群降级到 4.2

在此页面上

  • 降级路径
  • 创建备份
  • 先决条件
  • 步骤

在尝试任何降级之前,请先熟悉本文档的内容。

重要

升级或降级副本集之前,请确保所有副本集节点都正在运行。否则,升级或降级操作将在所有节点启动后才会完成。

如果需要从 4.4 降级,请降级到最新的 4.2 补丁版本。

MongoDB 仅支持单版本降级。您无法降级到比当前版本落后多个版本的版本。

例如,您可以将4 442降级。将 系列转换为 。 - 系列部署。但是,进一步降级该 。部署到 的 系列。不支持4 240系列部署。

警告

降级下限

如果需要从版本 4.4 降级,请降级到 4.2.6 或更高版本。 您无法降级到 4.2.5 或更早的版本。

可选但建议使用。创建数据库备份。

要从 4.4 降级到 4.2,您必须删除保留的不兼容功能和/或更新不兼容的配置设置。

从 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。

    • mongoexportmongoimport用于名称更短的新集合,然后删除原始集合。

  • 对于视图,使用db.createView()以更短的名称重新创建视图,然后删除原始视图。

提示

要降级分片集群的featureCompatibilityVersion ,请执行以下操作:

  1. mongo Shell 连接到 mongos 实例。

  2. featureCompatibilityVersion 降级为 "4.2"

    db.adminCommand({setFeatureCompatibilityVersion: "4.2"})

    setFeatureCompatibilityVersion 命令对内部系统集合执行写入操作,并且是幂等的。如果由于任何原因未成功完成该命令,请在 mongos 实例上重试该命令。

    注意

    setFeatureCompatibilityVersion在分片集群上运行时,数据段迁移、分割和合并可能会失败并显示ConflictingOperationInProgress

  3. 要确保分片集群的所有成员反映更新后的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。

仅当 fCV 设置为 "4.4" 时,才需要执行以下步骤。

删除所有与 4.2 不兼容的保留 4.4功能。 其中包括:

复合哈希索引

删除所有复合哈希索引。

使用db.collection.getIndexes()识别集合中的任何复合哈希索引,并使用db.collection.dropIndex()删除这些索引。

如果使用复合哈希索引对任何collection进行分片,请遵循下面Compound Hashed Shard Keys下列出的指导。

复合哈希分片键

删除使用复合哈希分片键分片的任何collection。

使用sh.status()识别具有复合哈希分片键的collection并删除这些collection。

  • 如果集合为空或者集合中确实包含需要保留的数据,则使用db.collection.drop()删除集合。

  • 如果集合中有需要保存的数据,请先备份集合,然后再使用db.collection.drop()删除集合。 降级集群后,将数据恢复到集群中。

删除所有使用 4.4 功能的保留功能。 这些包括但不限于:

在 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()方法,并且必须在事务中或作为可重试写入来执行更新。 有关详细信息,请参阅设置缺失的分片键字段。

在版本 4.4 中进行了更改:在版本 4.4 中,MongoDB 删除了对分片键大小的 512 字节限制。 但是,对于 MongoDB 4.2 及更早版本,分片键不能超过 512 字节。 将任何超过 512 字节大小限制的分片键值更新为不超过 512 字节大小限制。 要更新文档的分片键值,请参阅更改文档的分片键值。

警告

在继续执行降级过程之前,请确保所有节点(包括分片集群中的延迟副本集节点)都反映先决条件更改。 也就是说,在降级之前检查每个节点的featureCompatibilityVersion并删除不兼容的功能。

1

使用包经理或手动下载,获取 4.2 系列的最新版本。如果使用包经理,请为 4.2 二进制文件添加新的存储库,然后执行实际的降级过程。

重要

升级或降级副本集之前,请确保所有副本集节点都正在运行。否则,升级或降级操作将在所有节点启动后才会完成。

如果需要从 4.4 降级,请降级到最新的 4.2 补丁版本。

2

mongo shell 连接到集群中的mongos实例,然后运行sh.stopBalancer()以禁用负载均衡器:

sh.stopBalancer()

注意

如果迁移正在进行,系统将在停止负载均衡器之前完成进行中的迁移。您可以运行sh.isBalancerRunning()来检查负载均衡器的当前状态。

要验证是否禁用了负载均衡器,请运行 sh.getBalancerState();如果已禁用负载均衡器,则会返回 false:

sh.getBalancerState()

有关禁用负载均衡器的更多信息,请参阅禁用负载均衡器。

3

降级二进制文件并重新启动。

4

逐个降级分片。

  1. 一次降级一个分片的从节点:

    1. mongosh中运行以下命令以执行干净关闭,或参阅停止mongod进程以了解安全终止mongod进程的其他方法:

      db.adminCommand( { shutdown: 1 } )
    2. 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。

    3. 等待成员恢复到SECONDARY状态,然后再降级下一个从节点成员。 要检查成员的状态,请将mongo Shell 连接到分片并运行rs.status()方法。

      对每个从节点成员重复降级操作。

  2. 降级分片仲裁节点(如果有)。

    如果副本集不包含仲裁节点,请跳过此步骤。

    1. mongosh中运行以下命令以执行干净关闭,或参阅停止mongod进程以了解安全终止mongod进程的其他方法:

      db.adminCommand( { shutdown: 1 } )
    2. 删除仲裁节点数据目录的内容。 storage.dbPath配置设置或--dbpath命令行选项指定仲裁节点mongod的数据目录。

      rm -rf /path/to/mongodb/datafiles/*
    3. 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。

    4. 等待成员恢复到ARBITER状态。 要检查成员的状态,请将mongo Shell 连接到成员并运行rs.status()方法。

  3. 将分片的主节点降级。

    1. 降级副本集主节点。 将mongo Shell 连接到主节点,并使用rs.stepDown()降级主节点并强制选举新的主节点:

      rs.stepDown()
    2. 运行rs.status()

      rs.status()

      当状态显示主节点已降级并且另一个节点处于PRIMARY状态时,请继续。

    3. mongo Shell 运行以下命令,以干净关闭降级主节点,或者参阅停止mongod进程以了解安全终止mongod进程的其他方法:

      db.adminCommand( { shutdown: 1 } )
    4. 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。

对剩余分片重复上述步骤。

5
  1. 一次降级一个配置服务器副本集 ( CSRS ) 的从节点:

    1. mongosh中运行以下命令以执行干净关闭,或参阅停止mongod进程以了解安全终止mongod进程的其他方法:

      db.adminCommand( { shutdown: 1 } )
    2. 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。

    3. 等待成员恢复到SECONDARY状态,然后再降级下一个从节点成员。 要检查成员的状态,请将mongo Shell 连接到分片并运行rs.status()方法。

      对每个从节点成员重复降级操作。

  2. 降级配置服务器主节点。

    1. mongo Shell 连接到主节点,并使用rs.stepDown()降级主节点并强制选举新的主节点:

      rs.stepDown()
    2. 运行rs.status()

      rs.status()

      当状态显示主节点已降级并且另一个节点处于PRIMARY状态时,请继续。

    3. mongo Shell 运行以下命令,以干净关闭降级主节点,或者参阅停止mongod进程以了解安全终止mongod进程的其他方法:

      db.adminCommand( { shutdown: 1 } )
    4. 将 4.4 二进制文件替换为 4.2 二进制文件,然后重新启动。

6

完成分片集群组件的降级后,将mongo shell 连接到mongos重新启用负载均衡器。

sh.startBalancer()

mongo shell 方法sh.startBalancer()还启用分片集群的自动分割。

← 降级4 。 4 将副本集设置为4 。 2