从 2.6 降级 MongoDB

在本页面

在尝试任何降级之前,请熟悉本文档的内容,尤其是降级建议和清单降级分片集群的过程。

降级建议和清单

降级时,请考虑以下因素:

Downgrade Path

升级到 MongoDB 2.6 后,您不能**降级到 MongoDB 2.4 之前的任何版本。如果在运行 2.6 时创建了text2dsphere索引,则只能降级到 MongoDB 2.4.10 或更高版本。

Preparedness

Procedures

请遵循降级过程:

降级 2.6 用户授权模型

如果您已升级到 2.6 用户授权模型,则必须先 将用户授权模型降级为 2.4,然后再 将 MongoDB 2.6 降级为 2.4.

Considerations

访问控制先决条件

要降级授权模型,必须以用户身份连接以下privileges

{ resource: { db: "admin", collection: "system.new_users" }, actions: [ "find", "insert", "update" ] }
{ resource: { db: "admin", collection: "system.backup_users" }, actions: [  "find" ] }
{ resource: { db: "admin", collection: "system.users" }, actions: [ "find", "remove", "insert"] }
{ resource: { db: "admin", collection: "system.version" }, actions: [ "find", "update" ] }

如果没有使用适当的privileges的用户,请创建一个授权模型降级用户:

以具有用户权限的用户身份进行连接,以 Management 用户和角色。

使用userAdminAnyDatabase连接并作为用户身份验证。

创建具有所需特权的角色。

使用db.createRole方法,创建具有所需特权的role

use admin
db.createRole(
  {
    role: "downgradeAuthRole",
    privileges: [
      { resource: { db: "admin", collection: "system.new_users" }, actions: [ "find", "insert", "update" ] },
      { resource: { db: "admin", collection: "system.backup_users" }, actions: [  "find" ] },
      { resource: { db: "admin", collection: "system.users" }, actions: [ "find", "remove", "insert"] },
      { resource: { db: "admin", collection: "system.version" }, actions: [ "find", "update" ] }
    ],
    roles: [ ]
  }
)

创建一个具有新角色的用户。

创建一个用户并为该用户分配downgradeRole

use admin
db.createUser(
   {
     user: "downgradeAuthUser",
     pwd: "somePass123",
     roles: [ { role: "downgradeAuthRole", db: "admin" } ]
   }
)

Note

除了创建新用户,您还可以将角色授予现有用户。请参阅db.grantRolesToUser()方法。

验证为新用户。

验证为新创建的用户。

use admin
db.auth( "downgradeAuthUser", "somePass123" )

成功认证后,该方法将返回1

Procedure

以下降级过程要求在 2.4 版中使用<database>.system.users个集合。对于非admin数据库完整无缺。

连接到 MongoDB 实例并进行身份验证。

使用适当的权限,对单个部署连接到mongod实例并进行身份验证,对于分片群集,对mongos进行身份验证。有关详细信息,请参见访问控制先决条件

创建 2.6 admin.system.users 集合的备份。

admin.system.users集合中的所有文档复制到admin.system.new_users集合中:

db.getSiblingDB("admin").system.users.find().forEach( function(userDoc) {
    status = db.getSiblingDB("admin").system.new_users.save( userDoc );
    if (status.hasWriteError()) {
        print(status.writeError);
    }
  }
);

更新 authSchema 的版本文档。

db.getSiblingDB("admin").system.version.update(
   { _id: "authSchema" },
   { $set: { currentVersion: 2 } }
);

该方法返回一个具有操作状态的WriteResult对象。成功更新后,WriteResult对象应具有"nModified"等于1

从 admin.system.users 集合中删除现有文档。

db.getSiblingDB("admin").system.users.remove( {} )

该方法返回一个WriteResult对象,并在"nRemoved"字段中删除了文档数量。

从 admin.system.backup_users 集合中复制文档。

将所有文档从 2.6 升级期间创建的admin.system.backup_users复制到admin.system.users

db.getSiblingDB("admin").system.backup_users.find().forEach(
   function (userDoc) {
      status = db.getSiblingDB("admin").system.users.insert( userDoc );
      if (status.hasWriteError()) {
          print(status.writeError);
      }
   }
);

更新 authSchema 的版本文档。

db.getSiblingDB("admin").system.version.update(
   { _id: "authSchema" },
   { $set: { currentVersion: 1 } }
)

对于分片群集,通过连接到每个分片的primary副本集成员来重复降级过程。

Note

在刷新用户缓存之前,群集的mongos实例将无法检测到授权模型的降级。您可以在每个mongos实例上运行invalidateUserCache以立即刷新,也可以等到用户缓存失效间隔末尾自动刷新缓存。要运行invalidateUserCache,您必须具有invalidateUserCache操作的特权,该特权由userAdminAnyDatabasehostManager角色授予。

Result

降级过程将用户数据返回到升级到 2.6 授权模型之前的状态。使用 2.6 用户模型对用户/角色数据所做的任何更改都将丢失。

降级更新的索引

文本索引版本检查

如果您拥有* version 2 文本索引(即 MongoDB 2.6 中文本索引的默认版本),请在降级 MongoDB 之前删除 version 2 *文本索引。降级后,启用文本搜索并重新创建删除的文本索引。

要确定text索引的版本,请运行db.collection.getIndexes()以查看索引规范。对于文本索引,该方法在字段textIndexVersion中返回版本信息。例如,以下显示quotes集合上的text索引是版本 2.

{
   "v" : 1,
   "key" : {
      "_fts" : "text",
      "_ftsx" : 1
   },
   "name" : "quote_text_translation.quote_text",
   "ns" : "test.quotes",
   "weights" : {
      "quote" : 1,
      "translation.quote" : 1
   },
   "default_language" : "english",
   "language_override" : "language",
   "textIndexVersion" : 2
}

2dsphere 索引版本检查

如果您具有* version 2 * 2dsphere索引(即 MongoDB 2.6 中2dsphere索引的默认版本),请在降级 MongoDB 之前删除* version 2 * 2dsphere索引。降级后,重新创建2dsphere索引。

要确定2dsphere索引的版本,请运行db.collection.getIndexes()以查看索引规范。对于2dsphere索引,该方法在2dsphereIndexVersion字段中返回版本信息。例如,以下显示locations集合上的2dsphere索引是版本 2.

{
   "v" : 1,
   "key" : {
      "geo" : "2dsphere"
   },
   "name" : "geo_2dsphere",
   "ns" : "test.locations",
   "sparse" : true,
   "2dsphereIndexVersion" : 2
}

降级 MongoDB 流程

降级 2.6 独立 mongod 实例

以下步骤概述了将独立mongod从 2.6 版本降级到 2.4 的过程。

降级 2.6 副本集

以下步骤概述了副本集的“滚动”降级过程。 “滚动”降级过程通过在其他成员可用时分别对成员降级来最大程度地减少停机时间:

降级每个二级成员,一次降级。

对于副本集中的每个secondary

替换并重新启动二级 mongod 实例。

首先,关闭mongod,然后将这些二进制文件替换为 2.4 二进制文件,然后重新启动mongod。有关安全终止mongod进程的说明,请参见停止 mongod 进程

允许辅助恢复。

await 成员恢复到SECONDARY状态,然后再升级下一个辅助节点。

要检查成员的状态,请在mongo shell 中使用rs.status()方法。

降级初级。

mongoShell 程序中使用rs.stepDown()来降低primary并强制执行正常的failover过程。

rs.stepDown()

替换并重新启动以前的主要 mongod。

rs.status()显示主要数据库已降级并且另一个成员已处于PRIMARY状态时,请关闭先前的主要数据库并将mongod二进制文件替换为 2.4 二进制文件并启动新实例。

副本集故障转移不是即时的,但将导致该集不可用于写入和中断读取,直到故障转移过程完成为止。通常,这需要 10 秒钟或更长时间。您可能希望在 sched 的维护时段内计划降级。

降级 2.6 分片群集

Requirements

在降级过程中,您无法更改集合元数据。例如,在降级期间,请 不要 执行以下任何操作:

Procedure

分片群集的降级过程将逆转升级过程的 Sequences。

Downgrade Procedure

升级到 MongoDB 2.6 后,您不能**降级到 MongoDB 2.4 之前的任何版本。如果您具有text2dsphere索引,则只能降级到 MongoDB 2.4.10 或更高版本。

除本页中所述的 外,在 2.4 和 2.6 之间移动是一种直接替代:

停止现有 mongod 实例。

例如,在 Linux 上,使用--shutdown选项运行 2.6 mongod,如下所示:

mongod --dbpath /var/mongod/data --shutdown

/var/mongod/data替换为您的 MongoDB dbPath。另请参见停止 mongod 进程,以了解停止mongod实例的替代方法。

启动新的 mongod 实例。

确保使用相同的dbPath启动 2.4 mongod

mongod --dbpath /var/mongod/data

/var/mongod/data替换为您的 MongoDB dbPath

首页