Renomear Mongo Shard

1

Posso, e se eu puder, como posso renomear um shard no Mongo?

Como se eu quisesse alterar as instâncias de rs0 para rep0 abaixo:

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" }
...

Pensei em remover e adicionar novamente o fragmento, mas não tenho certeza de como faria isso sem precisar drenar o shard e soltar dbs.

Atualmente, 0 das coleções têm sharding ativado, só tenho alguns standalones adicionados como shards.

Obrigado

    
por HeySteve 11.06.2014 / 03:55

2 respostas

1

Não, não há uma maneira compatível de renomear um fragmento no momento, embora, como você mencionou, você possa removê-lo e adicioná-lo novamente. Mesmo assim, não é tão simples quanto você imagina, porque embora seja possível especificar um nome ao adicionar um fragmento, ele não termina aí - existe um conjunto de réplicas com o qual se preocupar. A especificação do nome ao adicionar é apenas o valor de _id , veja o exemplo a seguir (meu conjunto de réplicas é rs0, como o seu):

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" }

Observe que tudo o que mudou é o _id do fragmento, o valor "host" permanece o mesmo, porque rs0 é o nome do conjunto de réplicas - se você tentar usar rep0 , ele será Falha ao adicionar. Portanto, tudo o que um remover e adicionar novamente lhe dará é uma incompatibilidade entre os dois nomes.

Para alterar esse valor host , não apenas você precisa remover / adicionar novamente o fragmento, mas também precisa alterar a configuração do conjunto de réplicas antes de adicionar novamente o fragmento. Em outras palavras, o parâmetro replSet deve ser alterado para rep0 também, e isso significa reinicializar o conjunto - não é uma tarefa fácil.

Em geral, é possível chegar onde você quer, mas haverá uma grande quantidade de trabalho e não será rápido (drenagens, re-inicialização do conjunto), especialmente se você tiver muitos dados. Para alterar algumas strings, geralmente recomendo deixá-las como estão.

    
por 11.06.2014 / 13:49
1

Isso provavelmente não é suportado. No entanto, encontrei uma maneira de renomear os shards. Use a seu próprio risco.

Basicamente, o nome do shard aparece nos servidores de configuração nas seguintes coleções: config.databases, config.chunks e config.shards.

Faça uma atualização simples para substituir os campos que possuem o nome do fragmento antigo pelo novo nome do fragmento. Você terá que repetir isso em todos os servidores de configuração. Encerre os servidores shard e os clientes mongos primeiro. Um exemplo está abaixo:

$ 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)

Se você estiver alterando o nome do conjunto de réplicas ao mesmo tempo, poderá modificar o campo "hosts" do registro na coleção config.shards ao mesmo tempo.

    
por 04.04.2016 / 21:59