我可以吗,如果可以的话,我怎样才能在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" } ...
我曾经想过删除和重新添加碎片,但我不知道我怎么做,而不必消耗碎片和下降dbs。
目前0个集合已经启用了分片,我只是添加了一些独立的分片。
谢谢
不,目前没有支持重新命名碎片的方法,但是正如你所提到的,你可以删除并重新添加。 即使如此,它也不像你想象的那么简单,因为虽然你可以在添加一个分片时指定一个名字,但是它不会在那里结束 – 有一个副本设置自己担心。 添加时的名称规范只是_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值,不仅必须删除/重新添加分片,还必须在重新添加分片之前更改副本集configuration。 换句话说, replSet参数也必须更改为rep0 ,这意味着重新初始化集合 – 也不是一件容易的事情。
总的来说,有可能到达你想要的地方,但是会有大量的工作,并且不会很快(排除,重新初始化),特别是如果你有大量的数据。 为了改变一些string,我通常会build议将它们保持原样。
这可能不被支持。 但是,我已经find了重命名碎片的方法。 使用风险自负。
基本上,碎片名称出现在以下集合中的configuration服务器中:config.databases,config.chunks和config.shards。
做一个简单的更新,用新的分片名称replace具有旧分片名称的字段。 你将不得不在所有的configuration服务器上重复这一点。 先closures碎片服务器和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集合中logging的“hosts”字段。