Назад | Перейти на главную страницу

Переименовать Mongo Shard

Могу ли я, и если могу, как я могу переименовать шард в 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 также, а это означает повторную инициализацию набора - тоже непростая задача.

В целом, добраться туда, куда вы хотите, можно, но потребуется большой объем работы, и она не будет быстрой (утечки, повторная инициализация набора), особенно если у вас много данных. Чтобы изменить пару строк, я обычно рекомендую оставить их как есть.