https://gist.github.com/paulobezerr/98016c2a89126c59bca3260e07bbdc44
Requisitos mínimos:
- Uma máquina para router (mongos)
- Três máquinas para configuração (metadata - mongod)
- Duas máquinas para guardar os dados (mongod) - Essas você pode instalar o mongo, abrir para fora e deixar rodando
O primeiro passo é criar o replicaset de configuração:
- Se em produção, criar três máquinas que receberão uma instância do mongodb, senão, utilizar a mesma máquina, porém mudar as portas das instâncias (por favor, se não souber como funciona, sobe VM e se vira com várias máquinas).
- Configurar três instâncias do mongodb com wiredTiger, setando o nome do replicaSet (igual em todas) e ativando o clusterRule para configsvr.
- Ligar as três instâncias.
O arquivo de configuração modelo é:
storage: dbPath: /var/lib/mongodb journal: enabled: true engine: wiredTiger systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log net: port: 27019 bindIp: 0.0.0.0 sharding: clusterRole: configsvr replication: replSetName: <replicaSetName>
Depois que as três instâncias estiverem levantadas, acessar qualquer uma delas e (depois de alterar o scripts abaixo para seus IP's), executar o comando:
rs.initiate({ _id: "<replicaSetName>", configsvr: true, members: [ { _id: 0, host: "<mongod_instance_1>:27019" }, { _id: 1, host: "<mongod_instance_2>:27019" }, { _id: 2, host: "<mongod_instance_3>:27019" } ] });
Com isso, teremos um replicaset de configuração do banco em três instâncias. Funciona como um espelho, porém a leitura é feita nas três instâncias (como em RAID).
Agora, termos que levantar a instância do router (mongos). Antes disso, é importante saber que a responsabilidade desse daemon é de manter as conexões e cursores com o a aplicação, que solicitou a operação. Por isso, não precisamos reservar espaço em disco para o banco, pois tudo é feito em memória.
A configuração do mongos, deve seguir esses parâmetros:
systemLog: destination: file logAppend: true path: /var/log/mongodb/mongos.log net: port: 27017 bindIp: 0.0.0.0 processManagement: fork: true sharding: configDB: "<replicaSetName>/<mongod_instance_1>:<port>,<mongod_instance_2>:<port>,<mongod_instance_3>:<port>"
Coloque essa instância para subir. Agora, você só precisa adicionar todas as instâncias de banco (aquelas que eu disse no iniício que podia configurar a máquina e deixar rodando). Para realizar essa operação, conecte-se no sharding, e execute o comando:
sh.addShard("<mongodb_instance>:<port>");
Quem guardará as informações do cluster, serão as instâncias de configuração, ou seja, você pode adicionar quantos mongos quiser sem precisar rodar o comando acima.
Precisamos ativar os bancos de dados que esse sharding irá controlar, para isso, conecte-se no mongos e execute:
sh.enableSharding("<database_name>");
Para facilitar a vida de todos, preparei o script para o systemd conseguir gerenciar os processos do mongo. Ele deve ser posto em /lib/systemd/system/mongos.service. Certamente, se você já passou por muitos problemas relacionados, isso vai mudar sua vida. Você pode utilizá-lo para subir processos do mongod, só alterar os nomes e paths.
[Unit] Description=High-performance, schema-free document-oriented database After=syslog.target After=network.target [Service] User=mongodb Group=mongodb Type=forking RuntimeDirectory=mongodb RuntimeDirectoryMode=755 PIDFile=/var/run/mongodb/mongos.pid ExecStart=/usr/bin/mongos --quiet \ --config /etc/mongos.conf \ --pidfilepath /var/run/mongodb/mongos.pid LimitFSIZE=infinity LimitCPU=infinity LimitAS=infinity LimitNOFILE=64000 LimitNPROC=64000 [Install] WantedBy=multi-user.target