将 3.4 分片集群降级到 3.2
在本页面
在尝试任何降级之前,请熟悉本文档的内容。
Downgrade Path
一旦升级到 3.4,就不能降级到 3.2.7 或更早的版本。您只能降级到 3.2.8 或更高版本。
Create Backup
*可选,但推荐.*创建数据库备份。
Prerequisites
在降级二进制文件之前,您必须降级功能部件兼容性版本,并删除所有具有 3.2 或更早版本的3 .4 功能不兼容,如下所述。仅当将featureCompatibilityVersion
设置为"3.4"
时,才需要执行这些步骤。
1.降级功能兼容版本
db.adminCommand({setFeatureCompatibilityVersion: "3.2"})
此命令必须执行对内部系统集合的写入。如果由于某种原因该命令未成功完成,则可以安全地在mongos实例上重试该命令,因为该操作是幂等的。
2.删除视图
如果定义了任何视图,请先删除视图,然后再将 MongoDB 3.4 降级到 3.2.
db.adminCommand("listDatabases").databases.forEach(function(d){
let mdb = db.getSiblingDB(d.name);
mdb.getCollectionInfos({type: "view"}).forEach(function(c){
print(mdb[c.name]);
});
});
在每个包含视图的数据库中,删除system.views
集合以删除该数据库中的所有视图。
如果使用访问控制运行,则必须具有删除数据库的system.views
集合的特权。参见创建一个角色以删除 system.views 跨数据库的集合。
3.从集合和索引中删除排序规则选项
如果您为集合或索引定义了任何非“简单”排序规则,请在将 MongoDB 3.4 降级到 3.2 之前删除该集合或索引。
db.adminCommand("listDatabases").databases.forEach(function(d){
let mdb = db.getSiblingDB(d.name);
mdb.getCollectionInfos( { "options.collation": { $exists: true } } ).forEach(function(c){
print(mdb[c.name]);
});
});
您可以在没有排序规则规范的情况下将集合的内容迁移到新集合(一种方法是通过聚合管道阶段$out)。
- 要查找具有排序规则规范的索引,可以在mongo shell 中运行以下命令:
db.adminCommand("listDatabases").databases.forEach(function(d){
let mdb = db.getSiblingDB(d.name);
mdb.getCollectionInfos().forEach(function(c){
let currentCollection = mdb.getCollection(c.name);
currentCollection.getIndexes().forEach(function(i){
if (i.collation){
printjson(i);
}
});
});
});
使用整理规范删除索引。降级后,重新创建删除的索引。
4.转换十进制类型的数据
要检测十进制的存在,可以对可能包含十进制数据的集合运行db.collection.validate(true)。
db.collection.validate(true)仅在featureCompatibilityVersion
为"3.2"
时才报告十进制数据。
5.降级索引版本
如果您具有v: 2
个索引(即featureCompatibilityVersion: "3.4"
,则是在 MongoDB 3.4 中创建的索引的默认版本),请在降级 MongoDB 之前使用重新索引集合将集合上的所有索引重新创建为v: 1
。
您必须在分片和配置服务器上都执行此操作:
db.adminCommand("listDatabases").databases.forEach(function(d){
let mdb = db.getSiblingDB(d.name);
mdb.getCollectionInfos().forEach(function(c){
let currentCollection = mdb.getCollection(c.name);
currentCollection.getIndexes().forEach(function(i){
if (i.v === 2){
printjson(i);
}
});
});
});
- 如果分片是副本集,请在分片的每个成员上重复此过程,因为重新索引操作不会传播到辅助节点。
Tip
如果将mongo shell 连接到辅助成员,请将 use db.getMongo().setReadPref('secondary')
设置为允许从辅助读取。
- 在配置服务器副本集的每个成员上重复该过程。
Procedure
Considerations
在降级过程中,您无法更改集合元数据。例如,在降级期间,请 不要 执行以下任何操作:
-
创建数据库的任何操作
-
以任何方式修改集群元数据的任何其他操作。有关分片命令的完整列表,请参见Sharding Reference。但是请注意,并不是Sharding Reference页上的所有命令都修改集群元数据。
降级集群
下载最新的 3.2 二进制文件。
使用软件包 Management 器或手动下载,可获得 3.2 系列的最新版本。如果使用程序包 Management 器,请为 3.2 二进制文件添加新的存储库,然后执行实际的降级过程。
一旦升级到 3.4,就不能降级到 3.2.7 或更早的版本。您只能降级到 3.2.8 或更高版本。
禁用平衡器。
如禁用平衡器所述关闭平衡器。
降级 mongos 实例。
降级二进制文件并重新启动。
降级每个碎片,一次降级。
一次降级碎片。如果这些分片是副本集,则对于每个分片:
mongod --shardsvr --port <port> --dbpath <path>
如果使用configuration file,请将文件更新为包含sharding.clusterRole: shardsvr和net.port并开始:
sharding:
clusterRole: shardsvr
net:
port: <port>
storage:
dbpath: <path>
包括适合您的部署的任何其他配置。
- await 该成员恢复到
SECONDARY
状态,然后再降级下一个辅助成员。要检查成员的状态,您可以在mongo shell 中发出rs.status()。
对每个次要成员重复上述步骤。
- 降级主副本集。
将mongoShell 连接到主要数据库,并使用rs.stepDown()降低主要数据库并强制选择新的主要数据库:
rs.stepDown()
-
当rs.status()显示主要数据库已降级,而另一个成员已成为
PRIMARY
状态时,则将已降级的主要数据库降级: -
关闭逐步降低的主数据库,并将mongod二进制文件替换为 3.2 二进制文件。
- 使用
--shardsvr
和--port
命令行选项启动 3.2 二进制文件。
- 使用
mongod --shardsvr --port <port> --dbpath <path>
或者,如果使用configuration file,则更新文件以指定sharding.clusterRole: shardsvr和net.port并启动 3.2 二进制文件:
sharding:
clusterRole: shardsvr
net:
port: <port>
storage:
dbpath: <path>
包括适合您的部署的任何其他配置。
降级配置服务器。
如果配置服务器是副本集:
mongod --configsvr --port <port> --dbpath <path>
如果使用configuration file,则更新文件以指定sharding.clusterRole: configsvr和net.port并启动 3.4 二进制文件:
sharding:
clusterRole: configsvr
net:
port: <port>
storage:
dbpath: <path>
包括适合您的部署的任何其他配置。
- await 该成员恢复到
SECONDARY
状态,然后再降级下一个辅助成员。要检查成员的状态,请在mongo shell 中发出rs.status()。
对每个次要成员重复上述步骤。
-
降级主副本集。
-
将mongoShell 连接到主要数据库,并使用rs.stepDown()降低主要数据库并强制选择新的主要数据库:
rs.stepDown()
-
当rs.status()显示主要数据库已降级,而另一个成员已处于
PRIMARY
状态时,请关闭已降级的主要数据库并将mongod二进制文件替换为 3.2 二进制文件。 -
使用
--configsvr
和--port
选项启动 3.2 二进制文件:
mongod --configsvr --port <port> --dbpath <path>
如果使用configuration file,则更新文件以指定sharding.clusterRole: configsvr和net.port并启动 3.4 二进制文件:
sharding:
clusterRole: configsvr
net:
port: <port>
storage:
dbpath: <path>
包括适合您的部署的任何其他配置。
重新启用平衡器。
分片群集组件的降级完成后,重新启用平衡器。