On this page
将 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>
包括适合您的部署的任何其他配置。
重新启用平衡器。
分片群集组件的降级完成后,重新启用平衡器。