A maneira mais rápida / melhor de copiar uma parte de um grande banco de dados mongo para outro servidor?

1

Eu tenho um conjunto de dados de 100 milhões de tweets armazenados no Mongo, não otimizados e não indexados.

Eu preciso copiar todos os tweets do último mês para outro servidor. Qual é a melhor maneira de fazer isso?

Minha idéia era usar um script Ruby para extrair e copiar os tweets relevantes para um novo banco de dados no servidor, depois executar o comando mongo copyDatabase para copiá-lo. Está demorando demais, porém, alguma outra maneira de fazer isso?

require 'mongo_mapper'
MongoMapper.database = 'twitter'
require './models'
tweets = TwitterTweet.where(:created_at => {"$gt" => 1.month.ago}).all; # about 15 million

MongoMapper.database = 'monthly'
# copy the tweets over to the new db
tweets.each do |tweet|
  tweet.save!
end;
    
por Mike 17.01.2013 / 14:24

1 resposta

0

Primeiro, você menciona que é não indexada / não otimizada - há pelo menos um índice em created_at ? Se não, você está fazendo uma consulta massivamente ineficiente (uma varredura de tabela) e isso não será muito rápido.

Em geral, provavelmente a maneira mais fácil de fazer isso é apenas ter o servidor existente como primário e então criar um secundário (veja Conceitos fundamentais do conjunto de réplicas . Em um conjunto de réplicas, quando você adiciona um novo secundário, ele sincroniza a partir do primário, clonando todos os dados existentes e, em seguida, aplicando quaisquer alterações subsequentes por meio do oplog . Quando estiver satisfeito por ter todos os dados necessários (e supondo que não deseja manter o conjunto de réplicas), basta reiniciar o mongod s sem o argumento --replSet (e em uma porta diferente é geralmente um bom idéia) e você terá uma cópia completa no novo host.

Uma abordagem mais manual seria desligar o atual mongod (ou fsyncLock() para garantir que não haja alterações) e, em seguida, copie os arquivos do banco de dados manualmente para um novo host - eles estarão no seu dbpath e ficarão assim:

<databasename>.ns
<databasename>.0
<databasename>.1
<databasename>.2
etc.

Eles contêm todas as informações que serão necessárias em mongod , portanto, depois de copiá-las para o novo host e iniciar a instância do MongoDB, você deve ser capaz de simplesmente use <databasename> e estar pronto.

Em cada caso, para quaisquer porções não utilizadas / indesejadas, basta soltá-las quando estiver em funcionamento no novo host e, em seguida, executar um repair se você quiser recuperar espaço no disco.

Por fim, se você realmente quiser apenas extrair uma parte dos registros, poderá mongodump a coleção relevante com um filtro de consulta e, em seguida, use mongorestore para importar para o novo host. Eu não acho que isso será massivamente mais rápido do que o rubi que você propõe acima, especialmente se você está faltando esse created_at index.

    
por 18.01.2013 / 10:58

Tags