Pular para o conteúdo principal

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 \
    --fork
LimitFSIZE=infinity
LimitCPU=infinity
LimitAS=infinity
LimitNOFILE=64000
LimitNPROC=64000
[Install]
WantedBy=multi-user.target

Postagens mais visitadas deste blog

Recuperação de stash perdida

Bom pessoal, passei um sufoco bem grande esses dias, onde no frigir dos ovos, eu realizei modificações importantíssimas no meu código, fiz (stash), alterei algumas coisas e no fim, (stash clear). Por que? Falta de atenção, stress, loucura, demência, sei lá.
O fato é que percebi o acontecido somente no próximo dia útil (segunda-feira).
Daí, eu tive que por o cérebro para funcionar, lembrar o erro que havia cometido e escolher formas para chegar aos dois kilos de código alterados na sexta feira...

Uma vez que tudo no git possui um SHA-1 e os índices não são apagados automaticamente (git-gc), o que eu limpei do stash deveria estar em algum lugar do banco de dados do meu repositório GIT local.

Mãos a obra na pesquisa e encontramos um camadara muito útil na documentação do (fsck):
--no-reflog: Do not consider commits that are referenced only by an entry in a reflog to be reachable. This option is meant only to search for commits that used to be in a ref, but now aren’t, but are still in tha…

Arrays no PostgreSQL

Aquele mesmo projeto que estou trabalhando me exigiu aprender como adicionar um array em tabelas do PostgreSQL. É algo bem simples de se utilizar. Vamos começar criando uma tabela que recebe os arrays:
CREATE TABLE entrada (
  id SERIAL PRIMARY_KEY,
  nf integer,
  data_reg timestamp without time zone DEFAULTnow(),
  data_inst timestamp without time zone,
  descricao text,
  materiais text[][],
  funcionario varchar(50)
)

Criei uma tabela chamada entrada, que serve para registrar materiais vindos para a instituição. As rows possuirão: id (PRIMARY_KEY),nf (número de nota fiscal),data_reg (data em que a query será registrada),data_inst (data que entrou na instituição),descricao (qualquer observação que precisem colocar)funcionario (id do funcionário que realizou a operação)materiais (É nesse momento que inserimos os arrays...Nesse caso, criei um campo (materiais), que é um array de arrays.  Coloco o tipo de campo, no caso text e o que define-o como array "[]", coloquei os colchetes dua…

View em PostgreSQL

Estou fazendo um programa de almoxarifado e decidi me aventurar no Postgres. Por coincidência acabei estudando bancos de dados em geral. Aprendi uma maneira muito simples de aumentar a velocidade do programa e reaproveitar código. Ao utilizar uma view, os dados já ficam pré-recarregados no servidor, então ao retirar os dados, você não está fazendo uma consulta completa no DB, pois ela já foi efetuada. Mão na massa...
Tenho as seguintes tabelas:

CREATE TABLE material (
  id SERIAL PRIMARY KEY,  -- auto_increment da ID
  nome varchar(200),      -- Nome
  modelo varchar(100),    -- Modelo
  tipo int,               -- Tipo (Pego em tabela tipo)
  marca int,              -- Marca (Pego em tabela marca)
);


CREATE TABLE tipo (
  id SERIAL PRIMARY KEY,  -- auto_increment da ID
  tipo varchar(100),      -- Tipo de produto
);
CREATE TABLE marca (
  id SERIAL PRIMARY KEY,  -- auto_increment da ID
  marca varchar(100),     -- Marca do produto
);
Vamos somente adicionar alguns valores para que tenha…