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

Como entrar em produção com o MongoDB - Dez principais dicas


Após o desenvolvimento bem-sucedido do aplicativo e antes de se dedicar à produção do MongoDB, conte com essas orientações rápidas para garantir um fluxo suave e eficiente, bem como obter um desempenho ideal.

1) Opções de implantação

Seleção do Hardware Certo


Para um desempenho ideal, é preferível usar o SSD em vez do HDD. É necessário ter cuidado se o seu armazenamento é local ou remoto e tomar as medidas adequadas. É melhor usar o RAID para proteção de defeitos de hardware e esquema de recuperação, mas não confie totalmente nele, pois não oferece proteção contra falhas adversas. Para execução em discos, o RAID-10 é uma boa opção em termos de desempenho e disponibilidade, o que geralmente falta em outros níveis de RAID. O hardware certo é o bloco de construção do seu aplicativo para otimizar o desempenho e evitar grandes problemas.

Hospedagem na Nuvem


Está disponível uma variedade de fornecedores de nuvem que oferecem hosts de banco de dados MongoDB pré-instalados. A escolha da melhor escolha é o passo fundamental para que sua aplicação cresça e cause as primeiras impressões no mercado-alvo. O MongoDB Atlas é uma das opções possíveis que oferece uma solução completa para interface em nuvem com recursos como implantação de seus nós e um snapshot de seus dados armazenados no Amazon S3. O ClusterControl é outra boa opção disponível para fácil implantação e dimensionamento. Que oferece uma variedade de recursos, como fácil adição e remoção de nós, redimensionamento de instâncias e clonagem de seu cluster de produção. Você pode experimentar o ClusterControl aqui sem ser cobrado. Outras opções disponíveis são RackSpace ObjectRocket e MongoStitch.

2) RAM


Os itens acessados ​​com frequência são armazenados em cache na RAM, para que o MongoDB possa fornecer um tempo de resposta ideal. A RAM geralmente depende da quantidade de dados que você armazenará, do número de coleções e dos índices. Certifique-se de ter RAM suficiente para acomodar seus índices, caso contrário, isso afetará drasticamente o desempenho do aplicativo na produção. Mais RAM significa menos falhas de página e melhor tempo de resposta.

3) Indexação


Para aplicativos que incluem solicitações de gravação crônica, a indexação desempenha um papel imperativo. De acordo com os documentos do MongoDB:

“Se uma operação de gravação modifica um campo indexado, o MongoDB atualiza todos os índices que possuem o campo modificado como chave”

Portanto, tenha cuidado ao escolher índices, pois isso pode afetar o desempenho do seu banco de dados.

Exemplo de indexação:exemplo de entrada no banco de dados do restaurante

{
  "address": {
     "building": "701",
     "street": "Harley street",
     "zipcode": "71000"
  },
  "cuisine": "Bakery",
  "grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
     { "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
     { "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
     { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
  ],
  "name": "Bombay Bakery",
  "restaurant_id": "187521"
}

  1. Criando Índice em Campo Único
    > db.restaurants.createIndex( { "cuisine": 1 } );
    {
         "createdCollectionAutomatically" : false,
         "numIndexesBefore" : 1,
         "numIndexesAfter" : 2,
         "ok" : 1
    }

    No exemplo acima, o índice de ordem crescente é criado no campo cozinha.

  2. Criando índice em vários campos
    > db.restaurants.createIndex( { "cuisine": 1 , "address.zipcode": -1 } );
    {
            "createdCollectionAutomatically" : false,
            "numIndexesBefore" : 2,
            "numIndexesAfter" : 3,
            "ok" : 1
    }

    Aqui, o índice composto é criado nos campos de culinária e CEP. O número -ve define a ordem decrescente.

4) Esteja preparado para fragmentação


O MongoDB particiona os dados em diferentes máquinas usando um mecanismo conhecido como sharding. Não é aconselhável adicionar fragmentação no início, a menos que você esteja esperando conjuntos de dados pesados. Lembre-se de manter o desempenho do seu aplicativo em linha, você precisa de uma boa chave de fragmentação, de acordo com seus padrões de dados, pois isso afeta diretamente seu tempo de resposta. O balanceamento de dados entre estilhaços é automático. No entanto, é melhor estar preparado e ter um plano adequado. Assim, você pode consolidar sempre que sua aplicação exigir.

5) Práticas recomendadas para configuração do SO

  • Sistema de arquivos XFS
    • É um sistema de arquivos com journaling de 64 bits altamente escalável e de alto desempenho. Renova o desempenho de E/S permitindo operações de E/S maiores e em menor número.
  • Coloque o limite do descritor de arquivo.
  • Desative páginas enormes transparentes e memória de acesso não uniforme (NUMA).
  • Altere o tempo de atividade TCP padrão para 300 segundos (para Linux) e 120 segundos (para Azure).

Experimente estes comandos para alterar o tempo de atividade padrão;

Para Linux

sudo sysctl -w net.ipv4.tcp_keepalive_time=<value>

Para Windows


Digite este comando no prompt de comando como administrador, onde é expresso em hexadecimal (por exemplo, 120000 é 0x1d4c0):
reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value>

6) Garantir a alta disponibilidade usando a replicação


Entrar em produção sem replicação pode causar falhas repentinas de inatividade do seu aplicativo. A replicação resolve o problema se um nó falhar. Gerencie operações de leitura e gravação para suas instâncias secundárias do MongoDB de acordo com as necessidades do seu aplicativo.

Mantenha estas coisas em mente ao replicar:
  • Para alta disponibilidade, implante seu conjunto de réplicas em no mínimo três data centers.
  • Certifique-se de que as instâncias do MongoDB tenham 0 ou 1 votos.
  • Garantir conectividade de rede bidirecional completa entre todas as instâncias do MongoDB.

Exemplo de criação de um conjunto de réplicas com 4 instâncias locais do MongoDB:


  1. Criando 4 instâncias locais do MongoDB

    Primeiro, crie diretórios de dados
    mkdir -p /data/m0
    mkdir -p /data/m1
    mkdir -p /data/m2
    mkdir -p /data/m3

  2. Iniciar 4 instâncias locais
    mongod --replSet cluster1 --port 27017 --dbpath /data/m0
    mongod --replSet cluster2 --port 27018 --dbpath /data/m1
    mongod --replSet cluster1 --port 27019 --dbpath /data/m2
    mongod --replSet cluster1 --port 27020 --dbpath /data/m3

  3. Adicione as instâncias ao cluster e inicie
    mongo myhost:34014
    myConfig = {_id: ‘cluster1’, members: [
        {_id: 0, host: ‘myhost1:27017’},
        {_id: 1, host: ‘myhost2:27018’},
        {_id: 2, host: ‘myhost3:27019’},
        {_id: 3, host: ‘myhost4:27020’}]
    }
    rs.initiate(myConfig);

Medidas de segurança

7) Máquinas seguras


As portas abertas em máquinas que hospedam o MongoDB são vulneráveis ​​a vários ataques maliciosos. Mais de 30 mil bancos de dados MongoDB foram comprometidos em um ataque de ransomware devido ao atraso na configuração de segurança adequada. Enquanto estiver em produção, feche suas portas públicas do servidor MongoDB. No entanto, você deve manter uma porta aberta para fins de SSh.

Ativando a autenticação na instância do MongoDB:


  1. Inicie o arquivo mongod.conf em seu editor favorito.

  2. Acrescente essas linhas no final do arquivo de configuração.
    security:
          authorization: enabled

  3. Acrescente essas linhas no final do arquivo de configuração.
    service mongod restart

  4. Confirme o estado
    service mongod status

Restringindo o acesso externo


Abra o arquivo mongod.conf novamente para definir IPs limitados de acesso ao seu servidor.
bind_ip=127.0.0.1

Ao adicionar esta linha, significa que você só pode acessar seu servidor através de 127.0.0. (que é localhost). Você também pode adicionar vários IPs na opção de ligação.
bind_ip=127.0.0.1,168.21.200.200

Isso significa que você pode acessar de localhost e sua rede privada.

8) Proteção por senha


Para adicionar uma camada de segurança extra às suas máquinas, habilite o controle de acesso e imponha a autenticação. Apesar do fato de que você restringiu o servidor MongoDB para aceitar conexões do mundo exterior, ainda existe a possibilidade de quaisquer scripts maliciosos entrarem em seu servidor. Portanto, não hesite em definir um nome de usuário/senha para seu banco de dados e atribuir as permissões necessárias. O controle de acesso habilitado permitirá que os usuários apenas executem ações determinadas por suas funções.

Aqui estão as etapas para criar um usuário e atribuir acesso ao banco de dados com funções específicas.

Em primeiro lugar, criaremos um usuário (neste caso, é admin) para gerenciar todos os usuários e bancos de dados e, em seguida, criaremos um proprietário de banco de dados específico tendo apenas privilégios de leitura e gravação em uma instância do banco de dados MongoDB.

Crie um usuário administrador para gerenciar outros usuários para instâncias de banco de dados

  1. Abra seu shell Mongo e mude para o banco de dados de administração:
    use admin

  2. Criar um usuário para o banco de dados admin
    db.createUser({ user: "admin", pwd: "admin_password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })

  3. Autenticar usuário recém-criado
    db.auth("admin", "admin_password")

  4. Criando usuário de instância específico:
    use database_1
    db.createUser({ user: "user_1", pwd: "your_password", roles: [{ role: "dbOwner", db: "database_1" }] })

  5. Agora verifique se um usuário foi criado com sucesso ou não.
    db.auth("user_1", "your_password")
    show collections

É isso! Você protegeu com êxito suas instâncias de banco de dados com a autenticação adequada. Você pode adicionar quantos usuários quiser seguindo o mesmo procedimento.

9) Criptografia e proteção de dados


Se você estiver usando o Wiredtiger como um mecanismo de armazenamento, poderá usar sua configuração de criptografia em repouso para criptografar seus dados. Caso contrário, a criptografia deve ser executada no host usando um sistema de arquivos, dispositivos ou criptografia física.

10) Monitore sua implantação


Depois de concluir a implantação do MongoDB em produção, você deve acompanhar a atividade de desempenho para evitar possíveis problemas precoces. Há uma variedade de estratégias que você pode adaptar para monitorar o desempenho de seus dados no ambiente de produção.

  • O MongoDB inclui utilitários, que retornam estatísticas sobre o desempenho e a atividade da instância. Os utilitários são usados ​​para identificar problemas e analisar operações normais.

  • Use o mongostat para apreender o arranjo de tipos de operação e planejamento de capacidade.

  • Para relatórios de rastreamento e atividades de leitura e gravação, o mongotop é recomendado.
mongotop 15

Este comando retornará a saída a cada 15 segundos.
                     ns    total    read    write          2018-04-22T15:32:01-05:00
   admin.system.roles      0ms     0ms      0ms
 admin.system.version      0ms     0ms      0ms
             local.me      0ms     0ms      0ms
       local.oplog.rs      0ms     0ms      0ms
   local.replset.minvalid  0ms     0ms      0ms
    local.startup_log      0ms     0ms      0ms
 local.system.indexes      0ms     0ms      0ms
  local.system.namespaces  0ms     0ms      0ms
 local.system.replset      0ms     0ms      0ms     
                     ns    total    read    write          2018-04-22T15:32:16-05:00
   admin.system.roles      0ms     0ms      0ms
 admin.system.version      0ms     0ms      0ms
             local.me      0ms     0ms      0ms
       local.oplog.rs      0ms     0ms      0ms
   local.replset.minvalid  0ms     0ms      0ms
    local.startup_log      0ms     0ms      0ms
 local.system.indexes      0ms     0ms      0ms
  local.system.namespaces  0ms     0ms      0ms
 local.system.replset      0ms     0ms      0ms

O MongoDB Monitoring Service (MMS) é outra opção disponível que monitora seu cluster MongoDB e torna conveniente para você ter uma visão das atividades de implantação de produção.

E, claro, há o ClusterControl by Variousnines, o sistema de automação e gerenciamento para bancos de dados de código aberto. O ClusterControl permite a fácil implantação de clusters com configurações de segurança automatizadas e simplifica a solução de problemas de seu banco de dados, fornecendo automação de gerenciamento fácil de usar que inclui reparo e recuperação de nós quebrados, atualizações automáticas e muito mais. Você pode começar com o Community Edition (gratuito para sempre), com o qual você pode implantar e monitorar o MongoDB, bem como criar orientadores personalizados para ajustar seus esforços de monitoramento aos aspectos específicos da sua configuração. Baixe-o gratuitamente aqui.