将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"更改流将被禁用。

创建备份

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

访问控制

如果您的副本集启用了访问控制,则降级用户权限必须包括跨数据库列出和管理索引的权限。具有root角色的用户具有所需的特权。

先决条件

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

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

提升:

要降级副本集featureCompatibilityVersion

  1. 将mongo shell连接到主服务器。

  2. 降级featureCompatibilityVersion"4.0"

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

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

  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"请使用以下脚本删除并重新创建所有唯一索引。

提示:

在您解决任何问题后执行此操作索引键大小索引名称长度问题首先。

脚本

// 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);
         }
      });
   });
});

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”前缀选项,请替换为 mongodmongos以及mongo shell和驱动程序的相应“ssl”前缀选项。

4.准备从zstd压缩降级

zstd数据压缩

重要:

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

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

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

    重要:

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

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

  3. Deletestoragestorage.wiredTiger.collectionConfig.blockCompressor使用默认压缩器(snappy)或设置为另一个支持4.0的压缩机。

  4. storage.dbPath到新的数据目录。

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

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

zstd日志压缩

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

对于使用zstd库作为其日志压缩机的任何成员:

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

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

笔记:

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

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

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

    • storage.journal.enabled设置为false

    • 注释您部署的复制设置。

    • setParameter部分中将参

      disableLogicalSessionCacheRefresh设置为true

    例如:

    storage:
       journal:
          enabled: false
    #replication:
    #   replSetName: replA
    setParameter:
        disableLogicalSessionCacheRefresh: true
    

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

  3. 重新启动mongod实例:

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

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

      • 包括--nojournal选项

      • 删除任何复制命令行选项(例如--replSet):

      • Set parameter disableLogicalSessionCacheRefresh to true in the --setParameter option.

        mongod --nojournal --setParameter disableLogicalSessionCacheRefresh=true  ...
        
  4. mongod实例进行干净的关机:

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

    确认该进程已不再运行。

  5. 更新配置文件,准备使用新的日志压缩机作为副本集成员重新启动:

    • 删除storage.journal.enabled设置。

    • 取消对部署的复制设置进行评论。

    • 删除disableLogicalSessionCacheRefresh参数。

    • Removestoragestorage.wiredTiger.engineConfig.journalCompressor设置以使用默认日志压缩器或指定新值。

      例如:

      storage:
         wiredTiger:
            engineConfig:
               journalCompressor: <newValue>
      replication:
         replSetName: replA
      

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

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

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

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

      • 删除--nojournal选项。
      • 删除--wiredTigerJournalCompressor命令行选项,以使用默认日志压缩器或更新到新值。
      • 包括您的复制命令行选项以及副本集成员的任何其他选项。
      • 删除disableLogicalSessionCacheRefresh参数。
      mongod --wiredTigerJournalCompressor <differentCompressor|none> --replSet ...
      

笔记:

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

zstd网络压缩

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

为准备降级:

  1. 对于任何使用zstd进行网络消息压缩并使用配置文件的副本集成员,请更新net.compression.compressors设置,为降级过程中的重新启动做准备。

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

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

  3. 对于任何 蒙戈 指定的shell 标准在其 - -网络消息压缩器 ,更新以删除 标准 从 名单。

重要:

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

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

重要:

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

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

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

程序

警告:

在继续进行降级过程之前,请确保所有复制集成员,包括延迟的复制集成员,都反映先决条件更改。也就是说,在降级之前,检查featureCompatibilityVersion并删除每个节点的不兼容功能。

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

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

重要:

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

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

2、降级副本集的辅助成员

降级副本集的每个辅助成员,一次降级一个:

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

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

    笔记:

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

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

  • 一旦成员进入SECONDARY阶段,就降级下一级中。

3、降级仲裁器副本集成员(如果有的话)。

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

降级副本集的仲裁器成员:

  • 关掉 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()方法。

4、降低主节点

在mongo shell中使用 rs.stepDown()来逐步关闭主服务器并强制执行正常的故障转移过程。

rs.stepDown()

rs.stepDown()加快故障转移程序,比直接关闭主故障转移更可取。

5、更换并重新启动前一个主服务器。

rs.status()显示主级已下台,而其他成员已处于PRIMARY状态时:

  • 关闭上一级。

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

    笔记:

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

原文 - Downgrade 4.2 Replica Set to 4.0

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

results matching ""

    No results matching ""