Você provavelmente está hospedando seu MongoDB em um provedor de serviços de nuvem confiável, digamos Atlas, por exemplo, porque você realmente deseja se concentrar em sua ideia e delegar todas as áreas sutis de gerenciamento chave, como rede, armazenamento, acesso, etc.
Tudo parece bom inicialmente até que sua pequena ideia comece a se transformar em um negócio e o custo comece a disparar. Mesmo que não seja esse o caso, este post ainda lhe dará uma visão geral das complexidades técnicas envolvidas (e dinheiro economizado!) se você migrar para uma solução auto-hospedada.
BTW, de quanta economia estamos falando? Vamos fazer uma comparação rápida entre um Atlas instância e um MongoDB auto-hospedado na AWS .
Atlas (~$166/mês)
$ 0,23/hora com base nos requisitos selecionados acima (~ cloud.mongodb.com)
AWS (~$36/mês)
US$ 0,0416/hora para a instância e preços adicionais com base no tipo e armazenamento do EBS (~ calculator.aws)
É uma economia de quase 4,5x apenas em termos de infraestrutura!
Agora que você conhece os principais porquês e ainda está lendo este post, sem mais delongas, vamos mergulhar na tecnologia.
Esboço
- Configurando a infraestrutura
- Configurando o MongoDB
- Migração em massa
- Delta-sync para fazer a ponte entre a latência do switch de conexão (não aplicável a clusters obsoletos)
Como todo o conteúdo pode ser um pouco cansativo em um só lugar, vou dividir isso em 2 posts relacionados.
1. Configurando a infraestrutura
Vou mencionar abaixo o guia para configurar uma instância executando o RedHat Enterprise Linux 8 na AWS. Isso ocorre porque o MongoDB geralmente funciona melhor com o sistema de arquivos xfs. Aqui está um artigo para entender melhor.
Ativar uma instância do EC2
Eu usei um
t3.small
instância que vem com 2 vCPUs e 2 Gb de RAM embora você possa selecionar qualquer instância de sua escolha.
É recomendável que seu banco de dados tenha acesso a pelo menos 1 GB de RAM e 2 núcleos reais pois isso afeta diretamente o desempenho durante os mecanismos de cache e simultaneidade, conforme manipulado pelo mecanismo padrão WiredTiger . Você pode ler mais sobre as notas de produção relacionadas aos requisitos de RAM e CPU aqui .
Visão geral da configuração:
- SO:Redhat Enterprise Linux 8 (baseado em Intel x64)
- Tipo de instância:t3.small
- Armazenamento:10 GB (os) + 30 GB (dados) + 3 GB (logs) de EBS ou seja, 3 volumes separados
Estou assumindo que você está familiarizado com a criação de uma VM na AWS.
Agora, quando a instância estiver em execução, atribua um IP elástico para ele e, em seguida, basta fazer um login remoto na máquina.
Precisaremos do IP elástico para configurar o nome do host público para a instância
$ ssh -i <PEM_FILE> ec2-user@<ELASTIC_IP>
Montar volumes adicionais
Adicionamos 2 volumes EBS adicionais além do Root FS for Data and Logs que ainda não foram montados (Lembra dos 30Gb e 3Gb? ). Você pode listar os blocos de volume usando,
$ sudo lsblk
Os volumes adicionais serão listados logo após o bloco raiz (consulte as setas)
Na imagem acima, você pode ver que os volumes adicionais são nomeados
- xvdb (30Gb de espaço para armazenar dados)
- xvdc (3Gb de espaço para armazenar logs)
Agora, vamos criar os sistemas de arquivos nesses volumes.
$ sudo mkfs.xfs -L mongodata /dev/xvdb
$ sudo mkfs.xfs -L mongologs /dev/xvdc
-L
é uma opção de alias para definir o rótulo do volume
E então monte os volumes.
$ sudo mount -t xfs /dev/xvdb /var/lib/mongo
$ sudo mount -t xfs /dev/xvdc /var/log/mongodb
Para que essas alterações sejam refletidas, o sistema deve ser reinicializado. Portanto, agora também precisamos da persistência da partição para que, em caso de reinicialização não intencional, não percamos o armazenamento do banco de dados.
Podemos conseguir isso especificando as regras de montagem no arquivo fstab. Você pode ler mais sobre isso aqui.
Antes disso vamos copiar o UUID das partições acima(porque elas são únicas e não mudarão ao reiniciar o sistema )
$ sudo blkid
Copie os UUIDs listados para /dev/xvdb e /dev/xvdc . Consulte o "LABEL" para identificação de bloco
Agora abra o
/etc/fstab
arquivo e cole a configuração no formato a seguir. UUID=<COPIED_UUID_FOR_DATA> /var/lib/mongo xfs defaults,nofail 0 0
UUID=<COPIED_UUID_FOR_LOGS> /var/log/mongodb xfs defaults,nofail 0 0
Atualizar nome de host
O nome do host será usado para identificar seu servidor de banco de dados na rede. Você pode usar o IP elástico atribuído acima ou Nome de domínio (se disponível). Abra o
/etc/hostname
arquivo e anexar a entrada. Por exemplo ip-xx.us-east-2.compute.internal **<ELASTIC_IP> <DOMAIN_1> <DOMAIN_2>** ...
Atualizar os limites do processo (opcional)
Isso é opcionalmente necessário para controlar o número máximo de conexões aceitáveis enquanto mantém o sistema estável. Abra o
/etc/security/limits.conf
arquivo e adicione as seguintes entradas. * soft nofile 64000
* hard nofile 64000
* soft nproc 32000
* hard nproc 32000
Agora que todos os pré-requisitos relacionados à infra estão classificados, reinicialize a instância e vamos prosseguir para a instalação do MongoDB.
1. Configurando o MongoDB
Adicionar a origem do repositório
Crie um arquivo
/etc/yum.repos.d/mongodb-org.4.2.repo
e adicione os seguintes detalhes do repositório de pacotes. [mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
Agora vamos instalar o MongoDB.
$ sudo yum -y install mongodb-org
Criar diretórios e permissões de configuração
O MongoDB por padrão usa os seguintes caminhos para armazenar os dados e os logs internos:
/var/lib/mongo → Dados
/var/log/mongodb → Registros
Crie os diretórios
$ sudo mkdir /var/lib/mongo
$ sudo mkdir /var/log/mongodb
Alterar permissões de usuários e grupos
$ sudo chown mongod:mongod /var/lib/mongo
$ sudo chown mongod:mongod /var/log/mongod
Criar um usuário administrador
O daemon/serviço mongod deve ser executado antes de continuarmos a criar um usuário.Vamos usar a configuração padrão (armazenada em
/etc/mongod.conf
) por enquanto e inicie o processo do daemon. $ sudo -u mongod mongod -f /etc/mongod.conf
O comando acima iniciará o daemon mongod no modo fork (padrão).
Agora, vamos fazer login no servidor e criar nosso primeiro usuário administrador.
Abra um shell mongo
$ mongo
Use o banco de dados "admin" para criar o administrador-raiz
> use admin
Criar o usuário administrador
> db.createUser({user: "admin", pwd: "password", roles: [{role: "root", db: "admin"}]})
Criar um usuário comum
> db.createUser({user: "normal_user", pwd: "password", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})
Encerre o servidor por enquanto. Vamos reiniciar novamente com a configuração modificada
> db.shutDownServer()
Configurando a autenticação
Aqui, habilitaremos a autenticação do banco de dados e modificaremos o endereço de ligação para que nosso servidor seja acessível no domínio público. Abra
/etc/mongod.conf
e faça as alterações abaixo. # network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # accessible on the network address
security:
authorization: enabled # creds will be required for making db operations
Salve a configuração e reinicie o servidor.
$ sudo -u mongod mongod -f /etc/mongod.conf
Testar login
Você pode verificar se as credenciais funcionam usando,
$ mongo -u admin -p password
Isso é tudo sobre a configuração inicial! Fique atento ao meu próximo post relacionado sobre o processo de migração detalhado e dicas sobre como manter o banco de dados pronto para produção.
P.S. Obrigado a Piyush Kumar por ajudar na curadoria deste post!