我可以吗?如果可以,我该如何在 Mongo 中重命名分片?
例如,如果我想将 rs0 的实例更改为下面 rep0:
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("111111111111")
}
shards:
{ "_id" : "rs0", "host" : "rs0/mongo0a:27017,mongo0b:27017" }
...
我曾考虑过删除并重新添加分片,但我不确定如何在不耗尽分片和删除数据库的情况下做到这一点。
目前,0 个集合已启用分片,我只是添加了几个独立集合作为分片。
谢谢
答案1
不,目前不支持重命名分片的方法,但正如您所提到的,您可以删除并重新添加。即便如此,它也不像您想象的那么简单,因为虽然您可以在添加分片时指定名称,但事情并没有就此结束 - 还有副本集本身需要担心。添加时的名称规范只是 的值_id
,请参见以下示例(我的副本集是 rs0,与您的一样):
mongos> db.adminCommand({addShard : "rs0/host.example.com:27017,host.example.com:27018", name : "rep0"});
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("539838845bc6bf5ee52a56ea")
}
shards:
{ "_id" : "rep0", "host" : "rs0/host.example.com:27017,host.example.com:27018" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
请注意,所有更改的都是_id
分片的,"host"
值保持不变,因为rs0
是副本集的名称 - 如果您尝试rep0
在那里使用,它将无法添加。因此,删除并重新添加只会给您两个名称之间的不匹配。
要更改该host
值,您不仅必须删除/重新添加分片,还必须在重新添加分片之前更改副本集配置。换句话说,replSet
必须更改参数rep0
,这意味着重新初始化集合 - 也不是一件容易的事。
总体而言,您可以实现目标,但需要做大量工作,而且不会很快完成(消耗、重新初始化集合),尤其是当您有大量数据时。为了更改几个字符串,我通常建议保持原样。
答案2
这可能不受支持。不过,我找到了一种重命名碎片的方法。使用时请自担风险。
基本上,分片名称出现在以下集合中的配置服务器中:config.databases、config.chunks 和 config.shards。
进行简单更新,用新分片名称替换具有旧分片名称的字段。 您必须在所有配置服务器上重复此操作。 首先关闭分片服务器和 mongos 客户端。示例如下:
$ mongo <configserver>:<port>/config
configsvr> db.databases.update({primary:'old_shard_name'},{$set:{primary:'new_shard_name'}},{multi:true})
configsvr> db.chunks.update({shard:'old_shard_name'},{$set:{shard:'new_shard_name'}},{multi:true})
configsvr> var temp = db.shards.findOne({_id:'old_shard_name'})
configsvr> temp._id = 'new_shard_name'
configsvr> db.shards.remove({_id:'old_shard_name'})
configsvr> db.shards.insert(temp)
如果你同时更改副本集名称,则可以同时修改config.shards集合中记录的“hosts”字段。