Dicas MongoDB
Introdução
Neste artigo reuni algumas dicas gerais sobre mongodb. Recentemente tive necessidade fazer a instalação do MongoDb em uma instância EC2 da Amazon. A versão utilizada foi baseada na 3, mais especificamente a versão 3.0.7. Algumas dificuldades encontradas no caminho foram solucionadas. As soluções compartilho com vocês neste artigo. Talvez possam te ajudar também.
A configuração usada no servidor foi o Ubuntu Server 14.04 LTS.
Configurando fstab
Na configuração do EC2 adicionei um ebs extra para usar como armazenamento do data directory do mongodb. Formatei o disco usando ext4 (xfs também é uma outra ótima recomendação além do ext4). Um parâmetro importante para obter um melhor desempenho do disco é usar o noatime na hora de configurar o mount point no fstab:
Com o parâmetro noatime na hora de montar o disco, acessos de leituras em arquivos desse disco não irão gerar a atualização de timestamp atime do arquivo. Isso melhora o desempenho de acesso à leitura do disco.
/dev/xvdb /database ext4 noatime 0 0
Movendo data directory
O próximo passo foi mover o data directory padrão do mongdb para outro diretório, no caso para ele foi para /database. O processo foi o seguinte: (Leve em consideração que você tem uma instalação recente do mongodb, onde ainda não tem nenhum dado de produção que precise migrar).
Parar o mongo:
$ sudo service mongod stop
Preparar o novo data directory:
$ sudo mkdir -p /database/mongodb $ sudo chown -R mongodb /database/mongodb/ $ sudo chgrp -R mongodb /database/mongodb/
Editar o arquivo /etc/mongod.conf, localizando a linha:
storage: dbPath: /var/lib/mongodb
Alterando para:
storage: dbPath: /database/mongodb
Após isso basta iniciar o mongo novamente:
$ sudo service mongod start
Troubleshooting
Failed to authenticate …. with mechanism MONGODB-CR: AuthenticationFailed MONGODB-CR credentials missing in the user document
O padrão de autenticação no Mongodb 3 foi alterada de MONGODB-CR (MongoDB Challenge and Response) para SCRAM-SHA-1. O client que esta tentando conectar no mongo 3 esta usando o mecanismo antigo. Para resolver o problema, você deverá excluir o usuário do mongo, alterar admin.system.version.authSchema para 3 e recriar o usuário novamente:
$ sudo mongo > use admin > db.dropUser('userxxx') > var schema = db.system.version.findOne({"_id" : "authSchema"}) > schema.currentVersion = 3 > db.system.version.save(schema)
Crie o usuário novamente: (da sua maneira, abaixo é apenas um exemplo)
> db.addUser( { user: "userxxx", pwd: "pwdyyy", roles: [ "readWrite", "dbAdmin" ] } )
Isso deve resolver o problema.
Resolvendo “insertion error: EOF” ao importar base com mongorestore
Ao tentar restaurar o backup do mongo de uma versão mais antiga para mongo 3, recebo uma série de mensagens de erro, finalizando com “insertion error: EOF”. Me parece ser um problema com a versão 3.0.7 apenas. De acordo com bug reportado em https://jira.mongodb.org/browse/TOOLS-939 a versão 3.0.8 não deve apresentar esse erro.
Uma forma de resolver o erro na 3.0.7 foi adicionado o parâmetro –batchSize=50 ao mongorestore.
Exemplificando, altere o comando de:
$ sudo mongorestore --db testedb testedb/
para:
$ sudo mongorestore --batchSize=50 --db testedb testedb/