Docs 菜单

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,您必须删除保留的不兼容功能和/或更新不兼容的配置设置。

从 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下列出的指导。

组合哈希分片键 (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