Estou envolvido em um projeto que vai necessitar armazenar muitos arquivos, e precisava de uma solução que fosse tolerante a falhas e escalasse muito bem, tanto verticalmente (Mais disco) quanto horizontalmente (Mais servidores).
Depois de olhar algumas soluções existentes como MogileFS, Cassandra, entre outros, eu gostei bastante do GridFS do MongoDB, pela simplicidade de configuração e principalmente pelo sistema de eleição de um novo servidor mestre caso o ativo venha a falhar em um determinado replicaSet.
Minha configuração inicial dessa estrutura consiste em dois servidores de Storage (Ubuntu Server 11.04 64bits rodando em VMs vmware em discos diferentes) e uma terceira maquina simples e remota que será um backup onde será configurado meu primeiro ReplicaSet. No servidor de aplicação vou ter o MongoDB rodando como arbitro (sem armazenar dados) apenas para determinar qual o servidor é o mestre caso algum venha a falhar.
Instalação:
Considerando que nos servidores foi instalado o ubuntu server, sem nada, vamos a configuração:
primeiro vamos adicionar a linha na configuração do APT para podermos baixar o pacote oficial do MongoDB, mantido pela 10-gen, crie o arquivo: /etc/apt/sources.list.d/mongo.list e adicione a linha:
deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen
depois de salvar o arquivo, adicione a chave do repositorio:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
e finalmente instale o mongodb:
sudo aptitude update
sudo aptitude install mongodb-10gen
repita este processo em todas as maquinas de seu replicaSet.
Configuração do MongoDB
Primeiro vamos criar a pasta de armazenamento dos dados e definir as permissões:
sudo mkdir /dados
sudo chown mongodb:mongodb /dados/
sudo chmod 700 mongodb -Rf
Em todos os servidores vamos editar a configuração do MongoDB em /etc/mongodb.conf, aqui ficou assim:
dbpath=/dados/
logpath=/var/log/mongodb/mongodb.log
logappend=true
replSet = arquivo1
rest=true
* o parâmetro rest, faz com o que o servidor crie uma página para monitoramento dos status.
Depois de configurar todos os membros do replicaSet, reinicie o processo em todas as maquinas:
sudo service mongodb restart
Agora temos os servidores prontos para configurar a parte mais simples, o replicaset
Configuração do ReplicaSet
Para facilitar, configure nomes para seus membros do replicaSet no seu servidor de DNS interno ou, edite o arquivo /etc/hosts e adicione as maquinas que serão membro do replicaSet:
192.168.0.100 arquivo1a
192.168.0.101 arquivo1b
192.168.0.102 arquivo1bkp
* Ajuste os IPs de acordo com sua rede.
Agora, em um servidor qualquer, acesse o console de administração do Mongo:
e crie a configuração do replicaSet:
conf = { _id : 'arquivo1',
... members : [
... {_id: 0, host: 'arquivo1a'},
... {_id: 1, host: 'arquivo1b'},
... {_id: 2, host: 'arquivo1bkp', priority: 0}
... ]}
* Note que o servidor de backup tem prioridade zero, isto faz com que este servidor nunca seja eleito como servidor Mestre.
confira se está tudo ok:
{
"_id" : "arquivo1",
"members" : [
{
"_id" : 0,
"host" : "arquivo1a"
},
{
"_id" : 1,
"host" : "arquivo1b"
},
{
"_id" : 2,
"host" : "arquivo1bkp",
"priority" : 0
}
]
}
se estiver ok, ainda no console do Mongo, inicialize o replicaset:
em 10 segundos o seu replicaSet deverá estar rodando e pronto para receber dados, veja como está pelo navegador, acessando:
http://192.168.0.100:28017/_replSet
Você verá uma tela com o status de todos os membros do replicaSet:

Bom, é isso, no próximo post vou explicar como configurar o php e efetivamente armazenar arquivos no GridFS, Abraços