Могу ли я, и если могу, как я могу переименовать шард в 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 из коллекций имеют шардинг, у меня есть только несколько автономных приложений, добавленных в качестве шардов.
Спасибо
Вероятно, это не поддерживается. Однако я нашел способ переименовать осколки. Используйте на свой риск.
Обычно имя шарда появляется на серверах конфигурации в следующих коллекциях: 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)
Если вы одновременно меняете имя набора реплик, вы можете одновременно изменить поле «hosts» записи в коллекции config.shards.
Нет, в настоящее время не существует поддерживаемого способа переименования осколка, хотя, как вы упомянули, вы можете удалить и добавить повторно. Даже в этом случае это не так просто, как вы думаете, потому что, хотя вы можете указать имя при добавлении шарда, оно не заканчивается на этом - есть сам набор реплик, о котором нужно беспокоиться. Спецификация имени при добавлении - это просто значение _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
также, а это означает повторную инициализацию набора - тоже непростая задача.
В целом, добраться туда, куда вы хотите, можно, но потребуется большой объем работы, и она не будет быстрой (утечки, повторная инициализация набора), особенно если у вас много данных. Чтобы изменить пару строк, я обычно рекомендую оставить их как есть.