Configurando um Ambiente de Sharding de MongoDB

A ideia por trás desse post veio de uma das minhas aulas de MongoDB, aonde tive que subir o serviço de Sharding dentro de três instâncias de CentOS. Esse post irá ensinar subir todo o ambiente em três VMs com configuração baixa para que qualquer computador “low-end” consiga rodar.

Descrição do Ambiente

Nosso ambiente será feito todo dentro do VirtualBox em conjunto com o Vagrant. Usaremos a imagem padrão de CentOS na versão 7 fornecido pelo Vagrant Hub como sistema operacional base para esse exercício. Serão criadas três máquinas usando as configurações abaixo:

  • Memória: 1024MB
  • CPU: 1
  • Disco: 50GB

Já a instalação não iremos usar o diretório padrão do MongoDB para nosso ambiente, invés disso iremos criar os diretórios /srv/mongodb/shard e /srv/mongodb/config simplesmente por questão de padronização.

Iremos criar três novos serviços chamados mongo-shard, mongo-config e mongo-router para iniciar e parar de forma simplificada nossos serviços de mongodb.

Por ultimo, cada serviço do MongoDB irá rodar em uma porta diferente, sendo que elas seguirão a documentação conforme abaixo:

  • Porta 27017: MongoDB Router (mongos)
  • Porta 27018: MongoDB Sharding node
  • Porta 27019: MongoDB ConfigDB

Criando o Arquivo do Vagrant

Iremos criar um diretório na máquina hospedeira aonde deverá conter todos os arquivos de nosso projeto. Dentro desse diretório crie um arquivo chamado Vagrantfile com as informações abaixo:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Chamando módulo YAML
require 'yaml'

# Lendo o arquivo YAML com as configuracoes do ambiente
env = YAML.load_file('machines.yml')

Vagrant.configure("2") do |config|
  env.each do |env|
    config.vm.define env['name'] do |srv|
      srv.vm.box = "centos/7"
      srv.vm.hostname = env['hostname']
      srv.vm.network 'private_network', ip: env['ipaddress']
      srv.vm.provider 'virtualbox' do |v|
        v.name = env['name']
        v.memory = env['memory']
        v.cpus = env['cpus']
      end
    end
  end
end

Esse arquivo irá criar nossas instâncias baseadas nas informações que ele coletar de outro arquivo YAML, no caso o machines.yml que deve estar presente no mesmo diretório e com informações conforme abaixo:

---
- name: MongoDB Node 01
  hostname: mongodb01.tristram.com.br
  ipaddress: 192.168.56.10
  memory: 1024
  cpus: 1

- name: MongoDB Node 02
  hostname: mongodb02.tristram.com.br
  ipaddress: 192.168.56.20
  memory: 1024
  cpus: 1

- name: MongoDB Node 03
  hostname: mongodb03.tristram.com.br
  ipaddress: 192.168.56.30
  memory: 1024
  cpus: 1

Por ultimo, execute o comando vagrant up dentro do diretório do seu projeto para que ele possa criar suas máquinas virtuais. Ao término você terá três servidores com o CentOS 7 na ultima versão e totalmente atualizado (caso tenha baixado a ultima build do Vagrant Hub). Para acessar qualquer uma delas, basta digitar o comando abaixo, trocando o X pelo servidor que deseja se logar:

$ vagrant ssh "MongoDB Node 0X"

Instalando o MongoDB

Para instalar o MongoDB, primeiramente acesse cada um dos servidores, e dentro deles, como usuário root, crie o arquivo /etc/yum.repos.d/mongodb.repo e coloque o conteúdo abaixo dentro dele. Iremos fazer isso para incluir o repositório do MongoDB dentro dessas instâncias para que possamos instala-lo em sua ultima versão (3.6), pois o CentOS ainda entrega a versão 3.2 devido a sua cultura de disponibilização de pacotes.

[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

Feito isso, execute o comando abaixo de instalação nas três máquinas para que possamos instalar o pacote mongodb-org (esse é o nome do pacote aonde o serviço e o CLI vem).

# yum install mongodb-org -y

Criando os Serviços

Ao término da instalação você terá o binário mongod que é o serviço de banco de dados, o mongos que é o router, e o mongo que é o CLI da ferramenta. Primeiramente iremos criar os diretórios aonde ficarão os dados do nosso cluster.

# mkdir -p /srv/mongodb/{shard,config}

Lembre-se de alterar o usuário dono desse diretório e o grupo dono para mongod, e também acertar as permissões (do chmod) conforme abaixo:

# chown -R mongod. /srv/mongodb
# chmod -r 755 /srv/mongodb

Outro ponto importante é desativar o SELinux. É possível trabalhar com ele ativo, porém irei explicar como podemos fazer isso num post futuro, aonde irei tratar de como funciona o SELinux. Para desativar, abra o diretório /etc/selinux/config e altere a variável SELINUX para desativado. Feito isso, reinicie a máquina para aplicar as alterações:

# vim /etc/selinux/config
SELINUX=disabled

# reboot

Próximo passo é copiar o arquivo /etc/mongod.conf para os arquivos /etc/mongo-shard.conf e /etc/mongo-config.conf para que possamos começar a modificar eles para seus respectivos serviços.

# cp /etc/mongod.conf /etc/mongo-shard.conf
# cp /etc/mongod.conf /etc/mongo-config.conf

Abra cada um dos arquivos e altere as linhas abaixo. Iremos ativar o configsvr para o ConfigServer e o shardsvr para o Sharding. Além disso iremos configurar suas respectivas portas, nome de cluster e aonde seus dados serão salvos.

# vim /etc/mongo-config.conf
...
storage:
    dbPath: /srv/mongodb/config
...
net:
    port: 27019
    bindIp: 0.0.0.0
...
replication:
    replSetName: "config"
sharding:
    clusterRole: "configsvr"
==================================
# vim /etc/mongo-shard.conf
...
storage:
    dbPath: /srv/mongodb/shard
...
net:
    port: 27018
    bindIp: 0.0.0.0
...
replication:
    replSetName: "shard"
sharding:
    clusterRole: "shardsvr"

Agora copie o arquivo mongod.service para o diretório /etc/systemd conforme abaixo para os serviços mongo-shard, mongo-config, e mongo-router:

# cp /lib/systemd/system/mongod.service /etc/systemd/system/mongo-shard.service
# cp /lib/systemd/system/mongod.service /etc/systemd/system/mongo-config.service
# cp /lib/systemd/system/mongod.service /etc/systemd/system/mongo-router.service

Dentro desses arquivos será alterado o nome do arquivo de PID deles, e qual é o local aonde ficam os arquivos de configuração usados durante a inicialização, além obviamente da descrição do serviço.

# vim /etc/systemd/system/mongo-shard.service
[Unit]
Description=MongoDB Sharding Service

[Service]
Environment="OPTIONS=-f /etc/mongo-shard.conf"
PIDFile=/var/run/mongodb/mongo-shard.pid
================================== 
# vim /etc/systemd/system/mongo-shard.service
[Unit]
Description=MongoDB Sharding Service

[Service]
Environment="OPTIONS=-f /etc/mongo-config.conf"
PIDFile=/var/run/mongodb/mongo-config.pid
================================== 
# vim /etc/systemd/system/mongo-router.service
[Unit]
Description=MongoDB Sharding Service

[Service]
Environment="--configdb config/mongodb01.tristram.com.br:27019,mongodb02.tristram.com.br:27019,mongodb03.tristram.com.br:27019"
ExecStart=/usr/bin/mongos $OPTIONS
PIDFile=/var/run/mongodb/mongo-router.pid

 

Ao término carregue os novos arquivos de inicialização no systemd e então inicie os serviços. Se tudo der certo inicie o mongo-shard e o mongo-config e deixe eles para inciar durante o boot do sistema. Voltamos para iniciar posteriormente o router, quando tivermos tudo funcionando.

# systemctl daemon-reload
# systemctl enable mongo-shard mongo-shard 
# systemctl start mongo-shard mongo-shard
# systemctl enable mongo-shard mongo-config
# systemctl start mongo-shard mongo-config

Configurando o ConfigServer

Acesse o serviço do mongodb na porta 27019 para começarmos a instalação do configserver. Com acesso a console execute o comando rs.initialize() para inicializar seu configserver. Isso fará com que um cluster com um único nó seja criado, aonde iremos posteriormente instalar os demais nós.

# mongo --port 27019
> rs.initialize()

Agora use o comando rs.add() para adicionar os demais servidores no cluster, lembrando de informar o FQDN deles corretamente com a porta em que o configserver irá rodar (27019) (lembrando que o FQDN deve ser resolvido via DNS ou arquivo /etc/hosts)

> rs.add("mongodb02.tristram.com.br:27019")
> rs.add("mongodb03.tristram.com.br:27019")

Com isso seu ConfigServer está configurado e funcionando. Agora saia da console e inicialize o serviço do mongo-router e garanta que o mesmo irá iniciar durante o boot nas três máquinas.

> exit
# systemctl enable mongo-router
# systemctl start mongo-router

Configurando o Sharding

Acesse o serviço do mongodb na porta 27018 para começarmos a instalação do sharding. O passo será bem semelhante, sendo que com acesso a console execute o comando rs.initialize() para inicializar seu sharding. Isso fará com que um cluster com um único nó seja criado, aonde iremos posteriormente instalar os demais nós.

# mongo --port 27019
> rs.initialize()

Agora use o comando rs.add() para adicionar os demais servidores no cluster, lembrando de informar o FQDN deles corretamente com a porta em que o sharding irá rodar (27018) (lembrando que o FQDN deve ser resolvido via DNS ou arquivo /etc/hosts)

> rs.add("mongodb02.tristram.com.br:27018")
> rs.add("mongodb03.tristram.com.br:27018")

Agora saia do mongo e acesse novamente ele através da porta 27017 para incluirmos nosso sharding na estrutura do replicaset. Para incluir, execute o comando sh.add() informando o nome do cluster de sharding e um dos membros do cluster. Não se preocupe em informar os demais membros: o MongoDB fará o trabalho de auto detectar todos os membros caso você informe somente uma única máquina.

> exit
# mongo --port 27017
> sh.add("shard/mongodb01.tristram.com.br:27018")

Pronto! Com isso temos o nosso cluster de MongoDB rodando em três máquinas conforme prometido no início do post. Agora seu próximo passo é popular os dados dentro da base e começar a brincar com o seu ambiente. Abaixo segue o link de alguns posts que foram usados como material da postagem.

  • https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

Deixe uma resposta

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