On this page
从 3.2 降级 MongoDB
在本页面
在尝试任何降级之前,请熟悉本文档的内容,尤其是降级建议和清单和降级分片集群的过程。
降级建议和清单
降级时,请考虑以下因素:
Downgrade Path
要降级,请使用 3.0 系列中的最新版本。
Preparedness
删除或降级版本 3 文本索引,然后再将 MongoDB 3.2 降级到 3.0.
删除或降级版本 3 2dsphere 索引,然后再将 MongoDB 3.2 降级到 3.0.
Procedures
请遵循降级过程:
要降级分片群集,请参阅降级 3.2 分片群集。
要降级副本集,请参阅降级 3.2 副本集。
要降级独立的 MongoDB 实例,请参阅降级独立 mongod 实例。
Prerequisites
文本索引版本检查
如果您拥有* version 3 文本索引(即 MongoDB 3.2 中文本索引的默认版本),请在降级 MongoDB 之前删除 version 3 *文本索引。降级后,重新创建删除的文本索引。
要确定text
索引的版本,请运行db.collection.getIndexes()以查看索引规范。对于文本索引,该方法在字段textIndexVersion
中返回版本信息。例如,以下显示quotes
集合上的text
索引是版本 3.
{
"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" : 3
}
2dsphere 索引版本检查
如果您拥有* version 3 * 2dsphere
索引(即 MongoDB 3.2 中2dsphere
索引的默认版本),请在降级 MongoDB 之前删除* version 3 * 2dsphere
索引。降级后,重新创建2dsphere
索引。
要确定2dsphere
索引的版本,请运行db.collection.getIndexes()以查看索引规范。对于2dsphere
索引,该方法在2dsphereIndexVersion
字段中返回版本信息。例如,以下显示locations
集合上的2dsphere
索引是版本 3.
{
"v" : 1,
"key" : {
"geo" : "2dsphere"
},
"name" : "geo_2dsphere",
"ns" : "test.locations",
"sparse" : true,
"2dsphereIndexVersion" : 3
}
部分索引检查
在降级 MongoDB 之前,请删除所有部分索引。
降级独立 mongod 实例
以下步骤概述了将独立的mongod从版本 3.2 降级到 3.0 的过程。
下载最新的 3.0 二进制文件。
对于降级,请使用 3.0 系列中的最新版本。
使用最新的 3.0 mongod 实例重新启动。
Important
如果mongod实例正在使用WiredTiger存储引擎,则必须在 3.0 二进制文件中包含--storageEngine选项(如果使用配置文件,则必须包含storage.engine)。
关闭您的mongod实例。用下载的mongod二进制文件替换现有的二进制文件,然后重新启动。
降级 3.2 副本集
以下步骤概述了副本集的“滚动”降级过程。 “滚动”降级过程通过在其他成员可用时分别对成员降级来最大程度地减少停机时间:
降级 protocolVersion。
将mongo shell 连接到当前主数据库并降级复制协议:
cfg = rs.conf();
cfg.protocolVersion=0;
rs.reconfig(cfg);
降级副本集的辅助成员。
降级副本集的每个secondary成员,一次降级:
关闭mongod。有关安全终止mongod进程的说明,请参见停止 mongod 进程。
将 3.2 二进制文件替换为 3.0 二进制文件,然后重新启动。
Important
如果mongod实例正在使用WiredTiger存储引擎,则必须在 3.0 二进制文件中包含--storageEngine选项(如果使用配置文件,则必须包含storage.engine)。
- await 成员恢复到
SECONDARY
状态,然后再降级下一个辅助节点。要检查成员的状态,请在mongo shell 中使用rs.status()方法。
降级初级。
在mongoShell 程序中使用rs.stepDown()来降低primary并强制执行正常的failover过程。
rs.stepDown()
rs.stepDown()加快了故障转移过程,比直接关闭主数据库更可取。
替换并重新启动以前的主要 mongod。
当rs.status()显示主要数据库已降级,而另一个成员已处于PRIMARY
状态时,请关闭先前的主要数据库并将mongod二进制文件替换为 3.0 二进制文件并启动新实例。
Important
如果mongod实例正在使用WiredTiger存储引擎,则必须在 3.0 二进制文件中包含--storageEngine选项(如果使用配置文件,则必须包含storage.engine)。
副本集故障转移不是即时的,但将导致该集不可用于写入和中断读取,直到故障转移过程完成为止。通常,这需要 10 秒钟或更长时间。您可能希望在 sched 的维护时段内计划降级。
降级 3.2 分片群集
Requirements
在降级过程中,您无法更改集合元数据。例如,在降级期间,请 不要 执行以下任何操作:
创建数据库的任何操作
以任何方式修改集群元数据的任何其他操作。有关分片命令的完整列表,请参见Sharding Reference。但是请注意,并非Sharding Reference页上的所有命令都会修改群集元数据。
使用 SCCC Config 服务器降级分片群集
禁用平衡器。
降级每个碎片,一次降级。
对于每个副本集碎片:
降级 protocolVersion。
在降级主要数据库之前,先降级mongod次。
要降级主数据库,请运行replSetStepDown,然后降级。
有关降级副本集的详细信息,请参见降级 3.2 副本集。
降级 SCCC 配置服务器。
如果分片群集将 3 个镜像的mongod实例用于配置服务器,请按照与mongos的--configdb选项相反的 Sequences 降级这三个实例。例如,如果mongos具有以下--configdb列表:
--configdb confserver1,confserver2,confserver3
首先降级confserver3
,然后降级confserver2
,最后降级confserver1
。如果mongod实例正在使用WiredTiger存储引擎,则必须在 3.0 二进制文件中包含--storageEngine选项(如果使用配置文件,则必须包含storage.engine)。
mongod --configsvr --dbpath <path> --port <port> --storageEngine <storageEngine>
降级 mongos 实例。
降级二进制文件并重新启动。
重新启用平衡器。
分片群集组件的降级完成后,重新启用平衡器。
使用 CSRS Config 服务器降级分片群集
禁用平衡器。
检查 minOpTimeUpdaters 值。
如果分片群集对每个*分片使用CSRS,请检查minOpTimeUpdaters
值是否为零。 minOpTimeUpdaters
值为零表示没有正在进行的迁移。非零值表示正在进行迁移,或者先前完成的迁移由于某种原因未能清除minOpTimeUpdaters
值,因此应清除。
要检查值,对于每个分片,请连接到主要成员(或者,如果分片是独立的,则连接到独立的),并在admin
数据库中的system.version
集合中查询minOpTimeRecovery
文档:
use admin
db.system.version.findOne( { _id: "minOpTimeRecovery" }, { minOpTimeUpdaters: 1 } )
如果minOpTimeUpdaters
不为零,则通过降低当前主变量清除该值。当选择新的主数据库时,将清除该值。
rs.stepDown()
如果该分片是独立的,请重新启动该分片以清除该值。
准备 CSRS Config 服务器以进行降级。
如果分片群集使用CSRS:
- 从副本集中删除辅助成员仅拥有一个小学和两个中学,只有该小学可以投票并有资格成为小学;也就是说,其他两个成员的_4 和priority分别为
0
。
将mongo shell 连接到主数据库并运行:
rs.reconfig(
{
"_id" : <name>,
"configsvr" : true,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "<host1>:<port1>",
"priority" : 1,
"votes" : 1
},
{
"_id" : 1,
"host" : "<host2>:<port2>",
"priority" : 0,
"votes" : 0
},
{
"_id" : 2,
"host" : "<host3>:<port3>",
"priority" : 0,
"votes" : 0
}
]
}
)
- 使用replSetStepDown对
admin
数据库降级主要数据库。确保有足够的时间让中学学习。
将mongo shell 连接到主数据库并运行:
db.adminCommand( { replSetStepDown: 360, secondaryCatchUpPeriodSecs: 300 })
关闭配置服务器副本集,mongos实例和分片的所有成员。
重新启动每个配置服务器,使其成为独立的 3.2 mongod;即不使用--replSet,如果使用配置文件,则不使用replication.replSetName。
mongod --configsvr --dbpath <path> --port <port> --storageEngine <storageEngine>
更新每个分片的 protocolVersion。
重新启动每个副本集碎片并更新 protocolVersion。
将mongo shell 连接到当前主数据库并降级复制协议:
cfg = rs.conf();
cfg.protocolVersion=0;
rs.reconfig(cfg);
降级 mongos 实例。
Important
当配置服务器从副本集更改为三个镜像的mongod实例时,请更新--configdb设置。所有mongos必须使用相同的--configdb字符串。
降级二进制文件并重新启动。
降级配置服务器。
降级二进制文件并重新启动。在mongos的--configdb选项中以降序排列降级。
如果mongod实例正在使用WiredTiger存储引擎,则必须在 3.0 二进制文件中包含--storageEngine选项(如果使用配置文件,则必须包含storage.engine)。
mongod --configsvr --dbpath <path> --port <port> --storageEngine <storageEngine>
降级每个碎片,一次降级。
对于每个分片,请使用以下删除操作从admin.system.version
集合中删除minOpTimeRecovery
文档。如果该分片是副本集,请在副本集的主副本上针对每个分片执行 remove 操作:
use admin
db.system.version.remove(
{ _id: "minOpTimeRecovery" },
{ writeConcern: { w: "majority", wtimeout: 30000 } }
)
对于每个副本集碎片,降级mongod二进制文件并重新启动。如果您的mongod实例正在使用WiredTiger存储引擎,则必须在 3.0 二进制文件中包含--storageEngine选项(如果使用配置文件则为storage.engine)。
在降级主要数据库之前,先降级mongod次。
要降级主数据库,请运行replSetStepDown,然后降级。
有关降级副本集的详细信息,请参见降级 3.2 副本集。
重新启用平衡器。
分片群集组件的降级完成后,重新启用平衡器。