Por que nossa configuração “perfeita” do MongoDB falhou na produção (e como a consertamos)
Três semanas antes do lançamento do nosso produto, tudo parecia perfeito. Nosso aplicativo estava funcionando bem no desenvolvimento, o Prisma estava lidando com lindamente nossas transações de banco de dados, e estávamos confiantes em ir ao ar. Em seguida, implantamos para a produção. “Transação falhou: não em um conjunto de réplicas” – seis palavras que transformaram nossa semana de lançamento em uma maratona de depuração. Parece familiar? Se você já tentou executar transações do MongoDB na produção, conhece essa dor. O que funciona perfeitamente em desenvolvimento quebra de repente quando você mais precisa. Hoje, estou compartilhando a configuração do MongoDB pronta para a produção que finalmente resolveu esse quebra-cabeça para nós. O problema que nos surpreendeu aqui está o que aconteceu: nosso ambiente de desenvolvimento usou uma instância simples do MongoDB. Mas quando tentamos usar transações do Prisma na produção, tudo caiu. O problema? O MongoDB requer uma réplica definida para que as transações funcionem, mesmo em uma configuração de um único nó. Isso não está claramente documentado em nenhum lugar e pegou toda a nossa equipe desprevenida. Não estávamos sozinhos – desde então, aprendi que isso acelera inúmeras equipes de desenvolvimento durante sua primeira implantação de produção. A solução que realmente trabalha com três dias de pesquisa, teste e algumas noites muito tarde, construímos uma configuração MongoDB 8.0 à prova de balas que lida com transações, fornece segurança adequada e persiste dados de maneira confiável. Aqui está exatamente como fizemos isso: Etapa 1: Organização (a fundação) primeiro, criamos uma estrutura de projeto limpa com gerenciamento de credenciais seguros: mkdir -p ~/mongodb_prod/mongo -teclado cd ~/mongodb_prod inserir o modo fullcreen exite o modo de tela completa. Em seguida, configuramos o modo de ambiente e o modo de linha full. Mongo_root_user = your_admin_user mongo_root_pass = your_super_strong_and_secret_password Digite o modo de tela completa FullScreen Mode Pro pro pro dica: Nunca coda essas credenciais em seus arquivos do docker. Aprendi isso da maneira mais difícil quando acidentalmente cometi senhas em nosso repositório. Etapa 2: O Security KeyFile (crítico para a produção) Esta etapa nos sujou inicialmente. Os conjuntos de réplica precisam de um arquivo de segurança para comunicação interna, mesmo em configurações de nó único: # gerar a chave de segurança openssl rand -base64 756> ./mongo-key/mongodb.key ## Definir permissões adequadas (isso é crucial!) CHMOD 400. Modo de tela completa Sair do modo de tela completa Por que ID do usuário 999? Esse é o usuário do MongoDB dentro do contêiner do docker. Entender isso errado causará falhas de autenticação que são incrivelmente frustrantes para depurar. Etapa 3: O Docker compõe a configuração que trabalha com múltiplas tentativas fracassadas, aqui está a configuração que finalmente funcionou: Serviços: MongoDB: Imagem: Mongo: 8.0 Container_name: MongoDB_Prod HostName: MONGODB_PROD RESTART: sempre portos: – “27017: 27017″ ” # LEADS: # Leia Mongo_initdb_root_username: $ {mongo_root_user} mongo_initdb_root_password: $ {Mongo_root_pass} # o comando mágico que habilita o comando réplica set: [“–replSet”, “rs0”, “–keyFile”, “/etc/secrets/mongodb.key”]
volumes: # Persistent database data – mongo-data:/data/db # Persistent config data – mongo-config:/data/configdb # Security keyFile mount – ./mongo-key/mongodb.key:/etc/secrets/mongodb.key:ro volumes: mongo-data: driver: local mongo-config: driver: local Enter fullscreen mode Sair do modo de tela cheia Insights de tecla: O parâmetro –Replset RS0 é o que permite as transações que o nome do host deve corresponder ao que você usa na configuração do conjunto de réplicas denominadas volumes, garantem que seus dados sobrevivam ao contêiner reinicie a etapa 4: a inicialização única, isso é onde muitos tutoriais falham. After starting the container, you need to initialize the replica set: # Start the container docker compose up -d # Wait 20-30 seconds for initialization sleep 30 # Initialize the replica set (replace with your actual credentials) docker exec mongodb_prod mongosh \ –username your_admin_user \ –password your_super_strong_and_secret_password \ –AuthenticationDatabase admin \ –eval “rs.iniciate ({_id: ‘rs0’, membros: [{ _id: 0, host: ‘mongodb_prod:27017’ }]}) “Digite o modo de tela cheia de tela cheia de tela cheia, procure” ok “: 1 na saída – essa é a sua confirmação de que tudo funcionou. Etapa 5: a sequência de conexão que muda tudo o que há para o formato da string de conexão que finalmente fez nossas transações prisma funcionarem: Database_url = “MongoDB: // your_admin_user: your_super_strong_password@mongodb_prod: 27017/your_db_name? Authsource = admin & replicaSet = rs0” Enter Fullscreen Mode de tela completa da linha fullb. Ativa as lições de suporte à transação aprendidas da maneira mais difícil Teste sua configuração de produção mais cedo: Não espere até a semana de lançamento para descobrir os requisitos do conjunto de réplicas. Infraestrutura. Lutando com transações de MongoDB na produção.
Fonte