MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Compactar automaticamente o espaço excluído no mongodb?


Em geral, se você não precisa reduzir seus arquivos de dados, não deve reduzi-los. Isso ocorre porque "aumentar" seus arquivos de dados em disco é uma operação bastante cara e quanto mais espaço o MongoDB puder alocar em arquivos de dados, menos fragmentação você terá.

Portanto, você deve tentar fornecer o máximo de espaço em disco possível para o banco de dados.

No entanto se você precisar reduzir o banco de dados, deve ter duas coisas em mente.

  1. O MongoDB aumenta seus arquivos de dados dobrando para que os arquivos de dados possam ter 64 MB, depois 128 MB, etc.

  2. Como acontece com a maioria de qualquer banco de dados ... todo operações como redução, você precisará agendar um trabalho separado para fazer isso, não há "autoshrink" no MongoDB. Na verdade, dos principais bancos de dados noSQL (odeio esse nome), apenas o Riak irá encolher automaticamente. Portanto, você precisará criar um trabalho usando o agendador do seu sistema operacional para executar uma redução. Você pode usar um script bash ou fazer um trabalho executar um script php, etc.

Javascript do lado do servidor

Você pode usar o Javascript do lado do servidor para reduzir e executar esse JS via shell do mongo regularmente por meio de um trabalho (como cron ou o serviço de agendamento do Windows) ...

Assumindo uma coleção chamada foo você salvaria o javascript abaixo em um arquivo chamado bar.js e corra ...
$ mongo foo bar.js

O arquivo javascript seria algo como ...
// Get a the current collection size.
var storage = db.foo.storageSize();
var total = db.foo.totalSize();

print('Storage Size: ' + tojson(storage));

print('TotalSize: ' + tojson(total));

print('-----------------------');
print('Running db.repairDatabase()');
print('-----------------------');

// Run repair
db.repairDatabase()

// Get new collection sizes.
var storage_a = db.foo.storageSize();
var total_a = db.foo.totalSize();

print('Storage Size: ' + tojson(storage_a));
print('TotalSize: ' + tojson(total_a));

Isso será executado e retornará algo como ...
MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153

Execute isso em um cronograma (durante nenhum horário de pico) e você está pronto para ir.

Coleções limitadas

No entanto, há uma outra opção, coleções limitadas .

Basicamente, você pode limitar o tamanho de (ou o número de documentos em) uma coleção para dizer .. 20 GB e, uma vez atingido esse limite, o MongoDB começará a descartar os registros mais antigos e substituí-los por entradas mais recentes à medida que forem chegando.

Esta é uma ótima maneira de manter uma grande quantidade de dados, descartando os dados mais antigos com o passar do tempo e mantendo a mesma quantidade de espaço em disco usado.