Como levantar um sharding do MongoDB

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

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *