MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB auto-hospedado


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

  1. Configurando a infraestrutura
  2. Configurando o MongoDB
  3. Migração em massa
  4. 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
  1. xvdb (30Gb de espaço para armazenar dados)
  2. 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!