将4.2分片集群降级到4.0

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

降级路径

重要:

在升级或降级副本集之前,请确保所有副本集成员都在运行。如果您不这样做,在开始所有成员之前,升级或降级将不会完成。

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

提示:

如果您降级,

  • 在Windows上,降级到4.0.12或更高版本。您无法降级到4.0.11或更低版本。
  • 在Linux/macOS上,如果您正在运行更改流,并希望无缝恢复更改流,请降级到4.0.7或更高版本。

注意事项

从MongoDB 4.2开始,无论"majority"读取关注支持如何,更改流都是可用的;也就是说,读取关注majority支持可以启用(默认)或禁用以使用更改流。

在MongoDB 4.0及更低版本中,只有当启用"majority"读取关注支持(默认)时,更改流才可用。

一旦您降级到4.0系列,如果您禁用了读取关注"majority"更改流将被禁用。

创建备份

可选但推荐。创建数据库的备份。

访问控制

如果您的分片集群启用了访问控制,则降级用户特权必须包括管理config数据库索引的其他特权。

db.getSiblingDB("admin").createRole({
     role: "configIndexRole",
     privileges: [
        {
          resource: { db: "config", collection: "" },
          actions: [ "find", "dropIndex", "createIndex", "listIndexes" ]
        }
     ],
     roles: [  ]
});

将新创建的角色添加到降级用户中。例如,如果您在admin数据库中有一个用户myDowngradeUser已经具有root角色,请使用db.grantRolesToUser()授予附加角色:

db.getSiblingDB("admin").grantRolesToUser( "myDowngradeUser",
   [ { role: "configIndexRole", db: "admin" } ],
   {  w: "majority", wtimeout: 4000 }
);

先前条件

要从4.2降级到4.0,您必须删除持久存在的不兼容功能和/或更新不兼容的配置设置。这些包括:

1、降级功能兼容性版本(fCV)

要降级分片集群featureCompatibilityVersion

  1. 将mongo shell连接到 mongos实例。

  2. 降级featureCompatibilityVersion"4.0"

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

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

  3. 为了确保分片集群的所有成员都反映更新的featureCompatibilityVersion,请连接到每个碎片副本集成员和每个配置服务器副本集成员,并检查featureCompatibilityVersion

    提示:

    对于启用了访问控制的分片集群,要对碎片副本集成员运行以下命令,您必须以碎片本地用户的身份连接到该成员

    db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
    

    所有成员都应返回一个结果,其中包括:

    "featureCompatibilityVersion" : { "version" : "4.0" }
    

    如果任何成员返回的featureCompatibilityVersion为“4. 2”,请等待该成员反映版本“4. 0”后再继续。

    笔记:

    仲裁员不会复制admin.system.version集合。因此,仲裁员总是有一个与二进制文件降级版本相等的功能兼容性版本,无论副本集的FCV值如何。

    例如,MongoDB 4.2集群中的仲裁器的FCV值为4.0。

    有关返回的featureCompatibilityVersion值的详细信息,请参阅 Get FeatureCompatibilityVersion.

2.删除FCV 4.2持久功能

只有当fCV被设置为"4.2"时,以下步骤才是必要的。

删除所有与4.0不兼容的持久4.2功能。这些包括:

2a。索引键大小

从MongoDB 4.2开始,对于设置为"4.2"或更高的featureCompatibilityVersion(fCV),MongoDB删除了索引密钥限制。对于设置为"4.0"fCV,该限制仍然适用。

如果fCV设置为“4.0”后,索引的键超过了索引键限制,请考虑将索引更改为散列索引或索引计算值。您还可以在解决问题之前暂时将 failIndexKeyTooLong设置为false。但是,如果将failIndexKeyTooLong设置为false,则使用这些索引的查询可能返回不完整的结果。

2b。索引名称长度

从MongoDB 4.2开始,对于设置为"4.2"或更高的featureCompatibilityVersion(fCV),MongoDB删除了索引名称长度。对于设置为"4.0"的fCV,该限制仍然适用。

如果您的索引名称在fCV设置为"4.0"后超过索引名称长度,请删除并使用较短的名称重新创建索引。

db.collection.dropIndex( <name | index specification> )

db.collection.createIndex(
   { <index specification> },
   { name: <shorter name> }
}

提示:

参见:

2c。独特的索引版本

对于featureCompatibilityVersion(fCV)“4.2”,MongoDB为唯一索引使用一种新的内部格式,该格式与MongoDB 4. 0不兼容。新的内部格式既适用于现有的唯一索引,也适用于新建/重建的唯一索引。

如果fCV曾设置为"4.2"请使用以下脚本删除并重新创建所有唯一索引。

运行的脚本mongos

// A script to rebuild unique indexes after downgrading fcv 4.2 to 4.0.
// Run this script to drop and recreate unique indexes
// for backwards compatibility with 4.0.

db.adminCommand("listDatabases").databases.forEach(function(d){
   let mdb = db.getSiblingDB(d.name);

   mdb.getCollectionInfos( { type: "collection" } ).forEach(function(c){
      let currentCollection = mdb.getCollection(c.name);

      currentCollection.getIndexes().forEach(function(idx){
         if (idx.unique){
            print("Dropping and recreating the following index:" + tojson(idx))

            assert.commandWorked(mdb.runCommand({dropIndexes: c.name, index: idx.name}));

            let res = mdb.runCommand({ createIndexes: c.name, indexes: [idx] });
            if (res.ok !== 1)
               assert.commandWorked(res);
         }
      });
   });
});

在分片上运行的脚本

mongos上运行脚本后,如果您创建了碎片本地用户,则需要检查单个碎片。也就是说,如果您直接在碎片上而不是通过mongos创建维护用户,请在碎片的主要成员上运行脚本。

// A script to rebuild unique indexes after downgrading fcv 4.2 to 4.0.
// Run this script on shards to drop and recreate unique indexes
// for backwards compatibility with 4.0.

let mdb = db.getSiblingDB('admin');

mdb.getCollectionInfos( { type: "collection" } ).forEach(function(c){
   let currentCollection = mdb.getCollection(c.name);

   currentCollection.getIndexes().forEach(function(idx){
      if (idx.unique){
         print("Dropping and recreating the following index:" + tojson(idx))

         assert.commandWorked(mdb.runCommand({dropIndexes: c.name, index: idx.name}));

         let res = mdb.runCommand({ createIndexes: c.name, indexes: [idx] });
         if (res.ok !== 1)
            assert.commandWorked(res);
      }
   });
});

2d。删除user_1_db_1系统唯一索引

此外,如果您启用了访问控制,您还必须删除admin.system.users集合上的systemunique索引user_1_db_1

如果fCV曾设置为"4.2"请使用以下命令删除user_1_db_1系统唯一索引:

db.getSiblingDB("admin").getCollection("system.users").dropIndex("user_1_db_1")

在以下过程中使用4.0二进制文件启动服务器时,user_1_db_1索引将自动重建。

2e。删除通配符索引

对于设置为"4.2"``featureCompatibilityVersion(fCV),MongoDB支持创建通配符索引。在降级到fCV"4.0"之前,您必须删除所有通配符索引。

使用以下脚本删除并重新创建所有通配符索引:

// A script to drop wildcard indexes before downgrading fcv 4.2 to 4.0.
// Run this script to drop wildcard indexes
// for backwards compatibility with 4.0.

db.adminCommand("listDatabases").databases.forEach(function(d){
   let mdb = db.getSiblingDB(d.name);
   mdb.getCollectionInfos({ type: "collection" }).forEach(function(c){
      let currentCollection = mdb.getCollection(c.name);
      currentCollection.getIndexes().forEach(function(idx){

         var key = Object.keys(idx.key);
         if (key[0].includes("$**")) {

           print("Dropping index: " + idx.name + " from " + idx.ns);

           let res = mdb.runCommand({dropIndexes: currentCollection, index: idx.name});
           assert.commandWorked(res);

         }

      });
   });
});

重要:

在进行中的通配符索引构建期间降级到fCV"4.0"不会自动删除或终止索引构建。索引构建可以在降级到fcv"4.0"后完成,从而在集合上生成有效的通配符索引。针对该数据目录启动4.0二进制文件将导致启动失败。

使用db.currentOp()检查是否有任何正在进行的通配符索引构建。一旦任何正在进行的通配符索引构建完成,请运行脚本将其删除,然后再降级到fCV"4.0"

2f。查看包含4.2个运算符的定义/集合验证定义

在降级二进制文件之前,请修改包含4.2运算符只读视图定义和集合验证定义,例如$set$unset$replaceWith

您可以通过以下方式修改视图:

您可以通过以下方式修改colleciton验证表达式:

3.更新tls前缀配置

从MongoDB 4.2开始,MongoDB添加了“tls”前缀选项作为“ssl”前缀选项的别名。

如果您的部署或客户端使用“tls”前缀选项,请替换为mongod、mongos以及mongo shell和驱动程序的相应“ssl”前缀选项。

4.准备从zstd压缩降级

zstd日志压缩img

从4.2版本开始,zstd压缩库可用于日志数据压缩。

对于任何使用zstd库作为其日志压缩机的碎片或配置服务器成员:

如果成员使用zstd进行日志压缩和zstd数据压缩

如果成员仅将zstd用于日志压缩,则

笔记:

以下过程涉及在没有日志的情况下以独立身份重新启动副本成员。

  1. mongod实例进行干净的关机:

    db.getSiblingDB('admin').shutdownServer()
    
  2. 更新配置文件,以准备以独立方式重新启动:

    例如:

    storage:
       journal:
          enabled: false
    setParameter:
       skipShardingConfigurationChecks: true
       disableLogicalSessionCacheRefresh: true
    #replication:
    #   replSetName: shardA
    #sharding:
    #   clusterRole: shardsvr
    net:
      port: 27218
    

    如果您使用命令行选项而不是配置文件,则必须在重新启动期间更新命令行选项。

  3. 重新启动mongod实例:

    • 如果您使用的是配置文件:

      mongod -f <path/to/myconfig.conf>
      
    • 如果您使用的是命令行选项而不是配置文件:

      mongod --nojournal --setParameter skipShardingConfigurationChecks=true --setParameter disableLogicalSessionCacheRefresh=true --port <samePort> ...
      
  4. mongod实例进行干净的关机:

    db.getSiblingDB('admin').shutdownServer()
    

    确认该进程已不再运行。

  5. 更新配置文件,准备使用新的日志压缩机重新启动:

    例如:

    storage:
       wiredTiger:
          engineConfig:
             journalCompressor: <newValue>
    replication:
       replSetName: shardA
    sharding:
       clusterRole: shardsvr
    net:
      port: 27218
    

    如果您使用命令行选项而不是配置文件,则必须在下面的重新启动期间更新命令行选项。

  6. mongod实例作为副本集成员重新启动:

    • 如果您使用的是配置文件:

      mongod -f <path/to/myconfig.conf>
      
    • 如果您使用的是命令行选项而不是配置文件:

      mongod --shardsvr --wiredTigerJournalCompressor <differentCompressor|none> --replSet ...
      

笔记:

如果您在降级过程中遇到mongod的不干净关机,因此您需要使用日志文件进行恢复,请使用4.2 mongod恢复实例,然后重试实例的降级。

zstd数据压缩

重要:

如果您也使用zstd日志压缩您执行日志压缩机的先决条件步骤。

zstd压缩库从4.2版本开始可用。对于任何使用zstd压缩存储数据的配置服务器成员或碎片成员,降级过程将要求对该成员进行初始同步。准备:

  1. mongod实例创建一个新的空data directory。此目录将在下面的降级过程中使用。

    重要:

    确保运行mongod的用户帐户具有新目录的读写权限。

  2. 如果您使用配置文件,请更新该文件以为降级过程做好准备:

    如果您改用命令行选项,则必须更新以下规程中的选项。

对使用zstd压缩的任何其他成员重复。

zstd网络压缩

从4.2版本开始,zstd压缩库可用于网络消息压缩。

为准备降级:

  1. 对于任何使用zstd进行网络消息压缩并使用配置文件的mongod / mongos 实例,请更新net.compression.compressors设置,以便为降级过程中的重新启动做好准备。

    如果您改用命令行选项,则必须更新以下规程中的选项

  2. 对于在其URI connection string中指定zstd的任何客户端,请更新以从列表中删除zstd

  3. 对于任何在其--networkMessageCompressors中指定zstd的mongo shell,更新以从列表中删除zstd。

重要:

当双方启用网络压缩时,消息会被压缩。否则,双方之间的消息将被解压缩。

5.删除客户端字段级加密文档验证关键字

重要:

在降级服务器之前,删除应用程序中的客户端字段级加密代码。

MongoDB 4.2增加了对执行客户端字段级加密的支持,作为集合的指定JSON模式验证文档验证的一部分。具体来说,$jsonSchema对象支持encryptencryptMetadata关键字。MongoDB 4.0支持这些关键字,如果任何集合将这些关键字指定为其验证$jsonSchema的一部分,则无法启动

在每个数据库上使用db.getCollectionInfos()来识别指定自动字段级加密规则的集合,作为$jsonSchema验证器的一部分。要准备降级,请连接到集群mongos,并使用4.0不兼容的关键字对每个集合执行以下操作之一:

程序

降级分片集群

警告:

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

1、下载最新的4.0二进制文件。

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

重要:

在升级或降级副本集之前,请确保所有副本集成员都在运行。如果您不这样做,在开始所有成员之前,升级或降级将不会完成。

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

2、停用平衡器。

将mongo shell连接到分片集群中的 mongos实例,并运行sh.stopBalancer()禁用均衡器:

sh.stopBalancer()

笔记:

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

sh.getBalancerState()

从MongoDB 6.1开始,不执行自动分割块。这是因为平衡了政策的改进。自动拆分命令仍然存在,但不执行操作。有关详细信息,请参阅平衡策略更改。

在6.1之前的MongoDB版本中,sh.stopBalancer()还禁用了分片集群的自动拆分。

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

3、降级mongos实例。

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

笔记:

如果您使用命令行选项而不是配置文件,请在重新启动期间酌情更新命令行选项。

4、降级每个分片,一次一个

一次降级一个碎片

  1. 一次降级碎片的辅助成员:

    • 关闭mongod实例。

      db.adminCommand( { shutdown: 1 } )
      
    • 将4.2二进制文件替换为4.0二进制文件并重新启动。

      笔记:

      如果您使用命令行选项而不是配置文件,请在重新启动期间酌情更新命令行选项。

    • 请等待成员恢复到SECONDARY状态,然后再降级下一个辅助成员。要检查成员的状态,请将mongo shell连接到shard并运行 rs.status()方法。

      重复对每个辅助成员降级。

  2. 降级碎片仲裁器(如果有的话)。

    如果副本集不包括仲裁器,请跳过此步骤。

    • 关掉 mongod。有关安全 Stop mongod Processes 的其他方法,请参见停止 mongod进程。

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

      rm -rf /path/to/mongodb/datafiles/*
      
    • 将4.2二进制文件替换为4.0二进制文件并重新启动。

      笔记:

      如果您使用命令行选项而不是配置文件,请在重新启动期间酌情更新命令行选项。

    • 等待成员恢复到仲裁器状态。要检查成员的状态,请将mongo shell连接到成员并运行 rs.status()方法。

  3. 把分片的主系统降级。

    • 从碎片的主通道下来。将一个mongo shell连接到主服务器,并使用rs.stepDown()将主服务器降级,强制选举一个新的主服务器:

      rs.stepDown()
      
    • rs.status()显示初选已下级,而其他成员已处于PRIMARY状态时,请降级降级初选:

    • 关闭降级初选。

      db.adminCommand( { shutdown: 1 } )
      
    • 将4.2二进制文件替换为4.0二进制文件并重新启动。

      笔记:

      如果您使用命令行选项而不是配置文件,请在重新启动期间酌情更新命令行选项。

    对剩余的碎片重复。

5、降级配置服务器

  1. 一次降级配置服务器副本集(CSRS)的辅助成员:

    • 关闭mongod实例。

      db.adminCommand( { shutdown: 1 } )
      
    • 将4.2二进制文件替换为4.0二进制文件并重新启动。

      笔记:

      如果您使用命令行选项而不是配置文件,请在重新启动期间酌情更新命令行选项。

    • 请等待成员恢复到SECONDARY状态,然后再降级下一个辅助成员。要检查成员的状态,请将mongo shell连接到shard并运行 rs.status()方法。

  2. 逐步降低配置服务器主服务器。

    • 将一个mongo shell连接到主服务器,并使用rs.stepDown()将主服务器降级,强制选举一个新的主服务器:

      rs.stepDown()
      
    • rs.status()显示初选已下级,而其他成员已处于PRIMARY状态时,请降级降级初选:

    • 关闭降级初选。

      db.adminCommand( { shutdown: 1 } )
      
    • 将4.2二进制文件替换为4.0二进制文件并重新启动。

      笔记:

      如果您使用命令行选项而不是配置文件,请在重新启动期间酌情更新命令行选项。

6、重新启用平衡器。

分片集群组件的降级完成后,连接到mongos并重新启动平衡器。

sh.startBalancer();

要验证平衡器是否已启用,请运行sh.getBalancerState()

sh.getBalancerState()

如果启用了平衡器,则该方法返回true。

7、重新启用自动拆分

当作为降级过程的一部分停止平衡器时,sh.stopBalancer()方法也禁用了自动拆分。

一旦降级到MongoDB 4.0,sh.startBalancer()将无法重新启用自动拆分。如果您想重新启用自动拆分,runshsh.enableAutoSplit()):

sh.enableAutoSplit()

原文 - Downgrade 4.2 Sharded Cluster to 4.0

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:26

results matching ""

    No results matching ""