2010-02-27

MongoDB

Logo Há atualmente na Computação uma onda de adoção de bancos de dados não-relacionais, comumente chamados NoSQL.

O foco principal dos bancos NoSQL atuais é a orientação a documentos, uma variação hash da orientação a objetos e alternativa aos RDBMSs, que dominaram a orientação dos gerenciadores de banco de dados por décadas.

O principal banco NoSQL é o CouchDB, DBMS do Projeto Apache baseado em Erlang, porém há uma alternativa bem mais simples e aparentemente tão poderosa quanto: MongoDB.

MongoDB combina os melhores funcionalidades de orientação a documentos, hashes e RDBMSs. É um banco de dados orientado a documentos, escalável, livre de esquema, de alto desempenho e código aberto escrito em C++.

Este artigo aborda a instalação do servidor em ambiente Slackware e Ubuntu. Para uso veja artigo no Kodumaro.

Obtenção do pacote


No momento em que escrevi este artigo, não havia pacote APT do MongoDB, mas a instalação foi bastante simples e comum a ambos os sistemas em questão.

Primeiro obtenha o binário para sua arquitetura da página de download:


Instalação


Crie a seguinte estrutura de diretórios:
bash$ sudo mkdir -p \
/srv/mongodb/etc /srv/mongodb/sbin \
/srv/mongodb/var/data /srv/mongodb/var/log


Descompate o binário do MongoDB em /srv/mongodb:
bash$ sudo tar xzvf mongodb-linux-*.tgz -C /srv/mongodb/


Crie o arquivo de configuração do servidor em /srv/mongodb/etc/mongodb.conf com o seguinte conteúdo:
#auth = true
fork = true

dbpath = /srv/mongodb/var/data
logpath = /srv/mongodb/var/log/mongo.log
logappend = true

bind_ip = 127.0.0.1
port = 27017


Crie o script de inicialização do servidor /srv/mongodb/sbin/rc.mongodb-server:
#!/bin/bash

MONGO_HOME=/srv/mongodb
MONGOD="$MONGO_HOME/current/bin/mongod"
CONF_FILE="$MONGO_HOME/etc/mongodb.conf"
PID_FILE="$MONGO_HOME/var/log/mongo.pid"


function start_mongo() {
if [[ -e "$PID_FILE" ]]
then
echo "MongoDB daemon seems to be running, PID $(cat $PID_FILE)" >&2
echo "if the daemon is not running, remove the PID file: $PID_FILE" >&2
return 1
fi
echo "$MONGOD -f $CONF_FILE"
"$MONGOD" -f "$CONF_FILE" | head -n1 | cut -d: -f2 > "$PID_FILE"
}

function stop_mongo() {
if [[ ! -e "$PID_FILE" ]]
then
echo "MongoDB daemon seems not to be running, killing it anyway" >&2
fi
pkill -2 mongod && rm -f "$PID_FILE"
}

function status_mongo() {
if [[ -e "$PID_FILE" ]]
then
echo "MongoDB daemon seems to be running with PID $(cat $PID_FILE)"
else
echo "MongoDB daemon seems not to be running"
fi
"$MONGOD" --sysinfo
}


case "$1" in
start)
start_mongo
;;
stop)
stop_mongo
;;
restart)
stop_mongo
sleep 1
start_mongo
;;
status)
status_mongo
;;
*)
echo "options: [start|stop|restart|status]" >&2
;;
esac


E dê permissão de execução ao arquivo:
bash$ sudo chmod +x /srv/mongodb/sbin/rc.mongodb-server


Crie um link simbólico para o diretório do binário do MongoDB:
bash$ cd /srv/mongodb/
bash$ sudo ln -s mongodb-linux-* current


Crie um link simbólico para o script de inicialização para o diretório de rc-scripts. No Ubuntu é assim:
bash$ cd /etc/init.d/
bash$ sudo ln -s /srv/mongodb/sbin/rc.mongodb-server mongodb-server


No Slackware:
bash$ cd /etc/rc.d/
bash$ sudo ln -s /srv/mongodb/sbin/rc.mongodb-server


Para tornar o serviço inicializável é bastante diferente em cada sistema, mas são procedimentos padrão, portanto não vou descrevê-los aqui.

Crie um apelido (alias) para o cliente (a chamada pode ficar em um script executável em /etc/profile.d/):
bash$ alias mongo='/srv/mongodb/current/bin/mongo'


Usuário alternativo


É possível não usar o superusuário para rodar o MongoDB. Para isso crie um usuário:
bash$ sudo useradd \
-c 'MongoDB Server' \
-d /srv/mongodb \
-g daemon \
-s /usr/bin/false \
-u 29 mongodb


Altere o rc-script para executar os processos como usuário mongodb. A linha 18 vira:
sudo -u mongodb "$MONGOD" -f "$CONF_FILE"  | head -n1 | cut -d: -f2 > "$PID_FILE"


E a linha 27:
sudo -u mongodb pkill -2 mongod && rm -f "$PID_FILE"


Mude as permissões do diretório de dados:
bash$ sudo chown -R mongodb /srv/mongodb/var/data


Configurações iniciais

Inicie o serviço:
bash$ sudo /srv/mongodb/sbin/rc.mongodb-server start


Se tudo correr bem, já estará no ar. Precisamos criar um usuário administrador:
bash$ mongo
MongoDB shell version: 1.2.2
url: test
connecting to: test
type "help" for help
> use admin
switched to db admin
> db.addUser('admin', 'ra35EG/dz');
{ "user": "admin", "pwd": "2167016d7d6c88bcc8029ad2b1a7f1ff" }


Saia do prompt e edite o arquivo de configuração /srv/mongodb/etc/mongodb.conf, descomente a primeira linha:
auth = true


E reinicie o serviço:
bash$ sudo /srv/mongodb/sbin/rc.mongodb-server restart


Agora o banco de dados vai pedir autenticação:
bash$ mongo
MongoDB shell version: 1.2.2
url: test
connecting to: test
type "help" for help
> show dbs
assert: assert failed : listDatabases failed
Sat Feb 27 13:04:51 JS Error: uncaught exception: assert failed : listDatabases failed
> use admin
switched to db admin
> db.auth('admin', 'ra35EG/dz');
1
> show dbs
admin
local


Habilitar o serviço para conexões externas


Caso você queira permitir conexões externas, altere em /srv/mongodb/etc/mongodb.conf a linha sobre bind_ip:
bind_ip = 0.0.0.0


E reinicie o serviço.

**


Espero que este artigo tenha sido útil. Para mais informações, continue lendo o artigo no Kodumaro.

[]’s
Cacilhas, La Batalema