On this page
从 2.6 降级 MongoDB
在本页面
在尝试任何降级之前,请熟悉本文档的内容,尤其是降级建议和清单和降级分片集群的过程。
降级建议和清单
降级时,请考虑以下因素:
Downgrade Path
升级到 MongoDB 2.6 后,您不能**降级到 MongoDB 2.4 之前的任何版本。如果在运行 2.6 时创建了text
或2dsphere
索引,则只能降级到 MongoDB 2.4.10 或更高版本。
Preparedness
删除或降级版本 2 文本索引,然后再将 MongoDB 2.6 降级为 2.4.
删除或降级版本 2 2dsphere 索引,然后再将 MongoDB 2.6 降级为 2.4.
降级 2.6 用户授权模型。如果您已升级到 2.6 用户授权模型,则必须先将用户模型降级为 2.4,然后再将 MongoDB 2.6 降级为 2.4.
Procedures
请遵循降级过程:
要降级分片群集,请参阅降级 2.6 分片群集。
要降级副本集,请参阅降级 2.6 副本集。
要降级独立的 MongoDB 实例,请参阅降级 2.6 独立 mongod 实例。
降级 2.6 用户授权模型
如果您已升级到 2.6 用户授权模型,则必须先 将用户授权模型降级为 2.4,然后再 将 MongoDB 2.6 降级为 2.4.
Considerations
对于副本集,仅需在primary上运行降级过程,因为更改将自动复制到辅助副本。
对于分片群集,尽管此过程首先列出了该群集的授权数据的降级,但是您可以首先降级该群集或分片的授权数据。
您必须在升级过程中创建
admin.system.backup_users
和admin.system.new_users
集合。重要 。降级过程将用户数据返回到升级到 2.6 授权模型之前的状态。使用 2.6 用户模型对用户/角色数据所做的任何更改都将丢失。
访问控制先决条件
要降级授权模型,必须以用户身份连接以下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操作的特权,该特权由userAdminAnyDatabase和hostManager角色授予。
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 的过程。
从MongoDB 下载页面下载 2.4 系列最新版本的二进制文件。有关更多信息,请参见Install MongoDB。
降级 2.6 副本集
以下步骤概述了副本集的“滚动”降级过程。 “滚动”降级过程通过在其他成员可用时分别对成员降级来最大程度地减少停机时间:
降级每个二级成员,一次降级。
对于副本集中的每个secondary:
替换并重新启动二级 mongod 实例。
首先,关闭mongod,然后将这些二进制文件替换为 2.4 二进制文件,然后重新启动mongod。有关安全终止mongod进程的说明,请参见停止 mongod 进程。
允许辅助恢复。
await 成员恢复到SECONDARY
状态,然后再升级下一个辅助节点。
要检查成员的状态,请在mongo shell 中使用rs.status()方法。
降级初级。
在mongoShell 程序中使用rs.stepDown()来降低primary并强制执行正常的failover过程。
rs.stepDown()
rs.stepDown()加快了故障转移过程,并且
- 最好直接关闭主数据库。
替换并重新启动以前的主要 mongod。
当rs.status()显示主要数据库已降级并且另一个成员已处于PRIMARY
状态时,请关闭先前的主要数据库并将mongod二进制文件替换为 2.4 二进制文件并启动新实例。
副本集故障转移不是即时的,但将导致该集不可用于写入和中断读取,直到故障转移过程完成为止。通常,这需要 10 秒钟或更长时间。您可能希望在 sched 的维护时段内计划降级。
降级 2.6 分片群集
Requirements
在降级过程中,您无法更改集合元数据。例如,在降级期间,请 不要 执行以下任何操作:
创建数据库的任何操作
以任何方式修改集群元数据的任何其他操作。有关分片命令的完整列表,请参见Sharding Reference。但是请注意,并非Sharding Reference页上的所有命令都会修改群集元数据。
Procedure
分片群集的降级过程将逆转升级过程的 Sequences。
降级每个碎片,一次降级。对于每个分片,
在降级主要数据库之前,先降级mongod次。
- 要降级主数据库,请运行replSetStepDown并降级。
降级所有 3 个mongod配置服务器实例,将mongos --configdb参数中的* first 系统降级 last *。
降级并重新启动每个mongos,一次一次。降级过程是二进制的直接替换。
如启用平衡器所述打开平衡器。
Downgrade Procedure
升级到 MongoDB 2.6 后,您不能**降级到 MongoDB 2.4 之前的任何版本。如果您具有text
或2dsphere
索引,则只能降级到 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 实例。
mongod --dbpath /var/mongod/data
将/var/mongod/data
替换为您的 MongoDB dbPath。