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

Um guia do desenvolvedor para conjuntos de réplicas do MongoDB


O MongoDB geralmente envolve trabalhar com um grande conjunto de dados, incluindo arrays incorporados e objetos de array. Portanto, é sempre importante garantir que a taxa de processamento do banco de dados seja a mais rápida possível para aprimorar as operações de leitura e gravação. Além disso, para evitar anomalias de dados que possam surgir devido à inconsistência de dados, você precisa garantir que seus dados estejam com maior disponibilidade caso você queira ter uma recuperação de um evento de falha de hardware ou algumas interrupções de serviço. O MongoDB fornece dois conceitos para esse propósito - ReplicaSets e Sharding.

Replicação no MongoDB

Replicação mestre-escravo


Essa é uma das técnicas mais antigas usadas para garantir que os dados estejam sempre disponíveis para os usuários, mesmo quando um sistema falha. No entanto, a replicação mestre-escravo foi preterida nas versões mais recentes do MongoDB a partir da 3.2 e, portanto, foi substituída por conjuntos de réplicas.

Para fazer esta configuração, inicia-se 2 instâncias do mongod considerando que uma está em modo mestre e a outra em modo escravo.

Para iniciar uma instância no modo mestre, execute:
mongod --master --port portNumber

As opções --master instruem o mongod a criar uma coleção local.oplog.$main com a qual uma lista de operações é enfileirada para os escravos aplicarem na replicação dos dados.

Para iniciar uma instância do mongod no modo escravo, basta executar:
mongod --slave --source <masterhostname><:<port>>

Aqui você precisa especificar o nome do host e a porta da instância mestre para o argumento --source. Esta é uma visão geral resumida do uso da replicação mestre escrava e, como ela está obsoleta, nosso interesse estará nos conjuntos de réplicas.

Conjuntos de réplicas


Este é um grupo de processos do MongoDB conhecidos como instâncias do mongod que basicamente hospedam o mesmo conjunto de dados. É caracterizado por um nó primário e vários nós secundários para dados de rolamento. O nó primário recebe todas as operações de gravação e registra todas as outras alterações em seu conjunto de dados em seu log de operações. Os nós secundários, na outra extremidade, replicam o log de operações do primário e aplicam as operações ao seu conjunto de dados de modo que seus conjuntos de dados reflitam o conjunto de dados do primário. Em palavras simples, podemos dizer que temos a máquina A como nó primário e as máquinas B e C como nós secundários. A máquina A recebe uma operação de gravação e faz alterações em seus dados e, em seguida, faz uma lista das alterações que foram feitas. As máquinas B e C copiarão as operações da lista fornecida, neste caso o oplog, e as executarão para que os dados resultantes sejam os mesmos da máquina A.

Como mencionado anteriormente, é sempre importante garantir a alta disponibilidade dos dados, especialmente no ambiente de produção. A replicação ajuda fornecendo redundância de dados em diferentes instâncias do Mongod. Em caso de perda de dados, como as cópias dos mesmos dados são armazenadas em diferentes bancos de dados em vários locais, é fácil recuperá-los no existente.

Com muitas instâncias em execução, as operações de leitura e gravação de clientes são enviadas para servidores diferentes e, portanto, a taxa de processamento aumenta. A estrutura básica do processo de replicação é mostrada abaixo.

Às vezes, o primário pode não estar disponível, por exemplo, devido à desconexão da Internet ou interrupção do serviço. Nesse caso, o conjunto de réplicas nomeará um secundário para ser o nó primário. Por mais que os pedidos de leitura sejam feitos basicamente para o primário, algumas vezes os pedidos de leitura podem ser enviados para os secundários, mas tome cuidado, pois os dados retornados podem não refletir o que está no primário ou melhor, os dados podem não estar atualizados.

Árbitros


No caso de eleição de um primário, você precisará de uma instância mongod extra ao conjunto de réplicas para adicionar um voto no processo de eleição. Essa instância é chamada de árbitro e suas principais características são:
  1. Ele não tem uma cópia do conjunto de dados, portanto, não requer hardware tão poderoso quanto os nós de suporte de dados.
  2. Não pode ser promovido a principal.
  3. Eles sempre têm 1 voto eleitoral para permitir que o conjunto de réplicas tenha um número ímpar de membros votantes sem a sobrecarga de um membro adicional que replica os dados. Seu papel crucial é, portanto, selecionar um nó primário quando não estiver disponível.
  4. Permanece inalterado.

Ao contrário do árbitro, outros conjuntos de réplicas podem ser convertidos em primário de secundário e vice-versa.

Replicação assíncrona


O processo de replicação ocorre em duas formas de sincronização de dados. Primeiro, os membros do conjunto são preenchidos com dados completos na sincronização inicial. A replicação subsequente ocorre para aplicar alterações avançadas em todo o conjunto de dados.

Na sincronização inicial, os dados são copiados de um membro do conjunto de réplicas para outro. Quando o processo é concluído, o membro faz a transição para o nó secundário.

Failover automático do MongoDB


Pode haver uma interrupção do serviço, como a desconexão da rede, que vem como consequência do término da comunicação entre o primário e os secundários. Se a desconexão demorar mais de 10 segundos ou falhar completamente, o conjunto de réplicas restante votará em um membro para se tornar o novo principal. O nó secundário que obtiver a maioria dos votos torna-se o novo primário.

Na versão 3.0 do MongoDB, um conjunto de réplicas pode ter até 50 membros com 7 membros votantes.

Membros do conjunto de réplicas com prioridade zero


Esses são membros secundários que não podem transitar para serem nós primários nem podem desencadear uma eleição. As funções cruciais no conjunto de dados são:manter cópias do conjunto de dados, eleger um nó primário e executar operações de leitura. Eles agem como um backup onde um novo membro pode não adicionar imediatamente. Assim, ele armazenará os dados atualizados e poderá substituir imediatamente um membro indisponível.

Membros do conjunto de réplicas ocultas do MongoDB


Esses são membros sem conexão com os aplicativos cliente. Eles são usados ​​para cargas de trabalho com requisitos de uso diferentes de outros membros secundários. Eles recebem apenas o tráfego de replicação básico que está durante a sincronização inicial.

Membros do conjunto de réplicas atrasadas do MongoDB


Eles copiam dados do arquivo oplog do nó primário dentro de uma duração especificada. Eles sempre refletem o estado atrasado ou uma forma anterior do conjunto. Eles são, portanto, importantes na detecção de erros e dão uma dica sobre como se pode recuperar desses erros, por exemplo, se houver um banco de dados que foi descartado. Ao escolher a quantidade de atraso, isso deve ser considerado:
  1. A duração deve ser menor que a capacidade do log de operação, que para os mecanismos de armazenamento WiredTiger, MMAPv1 e In-Memory é de 50 GB. Caso contrário, o membro atrasado não poderá replicar operações com êxito.
  2. A duração do atraso deve ser igual ou ligeiramente maior do que as durações esperadas da janela de manutenção.

Configuração


Este é um membro de prioridade zero, está oculto, portanto, não é visível para os aplicativos e, por último, pode participar do processo eleitoral. Portanto, para configurar uma prioridade, digamos que você tenha 10 membros em seu conjunto de réplicas, você pode selecionar um membro na posição n como membro[n] e definir suas propriedades como:
{
    “_id”: <num>, 
    “Host”: <hostname: port>,
    “Priority”: 0,
    “slaveDelay”: <seconds>,
    “Hidden”: true
} 

Ou usando o shell mongo conectado ao primário, você pode executar estes comandos para definir o primeiro membro do conjunto de réplicas como atrasado:
cfg = rs.conf()
cfg.members[0].priority = 0
cfg.members[0].hidden = true
cfg.members[0].slaveDelay = 3600
rs.reconfig(cfg)

Depois de definir essas configurações, o secundário atrasado não pode se tornar um primário e, portanto, oculto dos aplicativos. O Membro será atrasado em 1 hora (3600 segundos) das operações de oplog.
Vários noves Torne-se um DBA do MongoDB - Trazendo o MongoDB para a produçãoSaiba mais sobre o que você precisa saber para implantar, monitorar, gerenciar e dimensionar o MongoDBBaixe gratuitamente

Como iniciar um conjunto de réplicas


Neste guia, veremos passo a passo como podemos configurar um conjunto de réplicas no MongoDB.
  1. Digamos que você tenha 3 mongodb que deseja replicar e eles estão configurados da seguinte forma:
    1. Mongod1.conf em execução na porta 27017
    2. Mongod2.conf em execução na porta 27018
    3. Mongod3.conf em execução na porta 27019

    Certifique-se de adicionar o nome do conjunto de réplicas que não será alterado em cada arquivo. Você pode fazer isso adicionando ou alterando o valor da opção replSet para um nome de sua escolha.

  2. Podemos iniciar a primeira instância executando
    sudo mongod --config /etc/mongo/mongod1.conf

    Isto é, se você não tiver nenhuma instância em execução do mongod. Em seguida, faça o mesmo para as outras instâncias. Para verificar se há instâncias em execução em sua máquina, execute
    ps -ax | grep mongo

    Você obterá uma lista como esta:
    4328 ttys000    0:06.15 mongod
    4950 ttys001    0:00.00 grep mongo
    Isso significa que a primeira instância no MongoDB por padrão é executada na porta 27017, portanto, a temos como a primeira da lista. Se você iniciou os outros, eles também serão descritos na lista com seus URLs de caminho correspondentes. Para se conectar a uma instância no shell do mongo, execute este comando:
    mongo  --port port_number i.e mongo  --port 27017.
    No entanto, em nosso caso, precisamos nos conectar com um nome de conjunto de réplicas, então temos que adicionar o nome ao comando:
    mongod --replSet replicaSetName --dbpath /usr/local/var/mongo/mongod --port 27017
    Neste caso, nosso replicaSetName =“testrep”

  3. Vamos verificar se há algum conjunto de réplicas habilitado executando rs.status()

    Se você obtiver um resultado como:
    {
        "ok" : 0,
        "errmsg" : "not running with --replSet",
        "code" : 76,
        "codeName" : "NoReplicationEnabled"
    }

    Isso significa que não há nenhum conjunto de réplicas habilitado. Caso contrário, se você obtiver o resultado como
    {
        "operationTime" : Timestamp(0, 0),
        "ok" : 0,
        "errmsg" : "no replset config has been received",
        "code" : 94,
        "codeName" : "NotYetInitialized",
        "$clusterTime" : {
            "clusterTime" : Timestamp(0, 0),
            "signature" : {
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            }
        }
    }

    significa que a réplica ainda não foi iniciada.

  4. O método rs.initiate() nos ajudará a iniciar um novo conjunto de réplicas e a instância na qual ele é iniciado se tornará nosso nó principal. Assim, podemos iniciar um em nossa instância executando o método start. rs.initiate().

  5. Verifique o status do conjunto de réplicas novamente executando rs.status().members. Agora você deve ver algo como
    "members" : [
            {
                "_id" : 0,
                "name" : "localhost:27018",
                "health" : 1,
                "state" : 1,
                "stateStr" : "PRIMARY",
                "uptime" : 577,
                "optime" : {
                    "ts" : Timestamp(1535301271, 1),
                    "t" : NumberLong(1)
                },
                "optimeDate" : ISODate("2018-08-26T16:34:31Z"),
                "syncingTo" : "",
                "syncSourceHost" : "",
                "syncSourceId" : -1,
                "infoMessage" : "could not find member to sync from",
                "electionTime" : Timestamp(1535301265, 1),
                "electionDate" : ISODate("2018-08-26T16:34:25Z"),
                "configVersion" : 1,
                "self" : true,
                "lastHeartbeatMessage" : ""
            }
        ]

    Bem, bom para ir. Nosso interesse será a opção de membros, pois podemos ver que é n array com 1 membro nele. Verificando a opção stateStr do primeiro membro, neste caso, ele está definido como Primário, o que significa que isso funcionará como nosso nó principal.

  6. Adicione um novo membro ao conjunto de réplicas usando seu nome de host. Para verificar o nome do host da instância conectada que você deseja adicionar, execute
    db.serverStatus().host

    Você obterá algo como
    ervername.local:27019

    Portanto, a partir do PRIMARY, você pode adicionar outro membro executando este comando no shell do mongo:
    rs.add("servername.local:27019");

  7. Execute o comando de status
    rs.status().members

    Para verificar se as alterações foram feitas.

    Agora você deve ter algo parecido com isso:
    [
        {
            "_id" : 0,
            "name" : "localhost:27018",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 11479,
            "optime" : {
                "ts" : Timestamp(1535312183, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2018-08-26T19:36:23Z"),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "",
            "electionTime" : Timestamp(1535301265, 1),
            "electionDate" : ISODate("2018-08-26T16:34:25Z"),
            "configVersion" : 2,
            "self" : true,
            "lastHeartbeatMessage" : ""
        },
        {
            "_id" : 1,
            "name" : "127.0.0.1:27019",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 15,
            "optime" : {
                "ts" : Timestamp(1535312183, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1535312183, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2018-08-26T19:36:23Z"),
            "optimeDurableDate" : ISODate("2018-08-26T19:36:23Z"),
            "lastHeartbeat" : ISODate("2018-08-26T19:36:26.302Z"),
            "lastHeartbeatRecv" : ISODate("2018-08-26T19:36:27.936Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "localhost:27018",
            "syncSourceHost" : "localhost:27018",
            "syncSourceId" : 0,
            "infoMessage" : "",
            "configVersion" : 2
        }
    ]

    Agora temos 2 membros, um é um nó PRIMARY e o outro é um nó SECONDARY. Você pode adicionar mais membros, mas não excedendo 50. Agora vamos criar um banco de dados na instância na porta 27018 como principal.

    Se desconectarmos o primário, ocorrerá um failover e, como temos apenas 1 primário, ele será automaticamente transferido para um secundário. Agora, se nos conectarmos à porta 27019, você deverá obter os mesmos bancos de dados e coleções com seus documentos.

    Agora, se o nó primário desconectado for reconectado, ele será adicionado como secundário, pois copia as operações do oplog do primário existente.

Preocupação de gravação do conjunto de réplicas do MongoDB


Se o MongoDB retornar uma preocupação de gravação em diário bem-sucedida, os dados serão armazenados no disco, tornando-se disponíveis após a reinicialização do mongod. No entanto, para as operações de gravação, os dados são duráveis ​​somente após serem replicados e confirmados no diário em favor da maioria dos membros votantes do conjunto de réplicas.

Alguns dados podem ser muito grandes para serem atualizados ou inseridos, portanto, pode levar mais tempo do que o esperado para que os dados sejam replicados em outros membros. Por esta razão, é aconselhável editar as configurações de writeConcern para atender à duração na qual uma operação deve ser executada. As configurações writeConcern padrão determinam que o conjunto de réplicas requer confirmação apenas do membro primário. Uma preocupação de gravação padrão confirma as operações de gravação apenas para o primário, mas pode ser substituída para verificar as operações de gravação em alguns membros do conjunto de réplicas, especificando a preocupação de gravação para uma operação de gravação específica. Por exemplo:
db.books.insert({name: “James”,place: “Beijing”},{writeConcern: {w: 3, wtimeout: 3600}})

A opção de gravação neste caso determina que a operação deve retornar uma resposta somente após ela ter sido espalhada para o primário e pelo menos 2 secundários ou se atingir o tempo limite após 3,6 segundos.

Configurando a preocupação de gravação para o MongoDB


A opção getLastErrorDefaults do MongoDB nos fornece os parâmetros para alterar as configurações padrão de preocupação de gravação na configuração do conjunto de réplicas. Isso implica que a operação deve ser concluída na maioria dos membros votantes antes de retornar o resultado.
cfg = rs.conf()
cfg.settings = {},
cfg.settings.getLastErrorDefaults = {w: “majority”, wtimeout: 3600}
rs.reconfig(cfg)

O valor de tempo limite impedirá o bloqueio de operações de gravação, ou seja, se houver 5 membros para reconhecer a preocupação de gravação, mas infelizmente houver 4 ou menos membros no conjunto de réplicas, a operação será bloqueada até que todos os membros estejam disponíveis. Adicionando o limite de tempo limite, o bloqueio da operação será descartado após essa duração.

Bloqueio de replicação


O bloqueio de uma operação, especialmente quando todos os membros foram replicados, garante que não haverá mais perda de tempo esperando que outro membro do conjunto de réplicas esteja disponível para retornar uma resposta. A opção de comando getLastError do MongoDB determina como a atualização da replicação é feita usando o atributo opcional “w”.

Por exemplo, esta consulta
db.runCommand({getLastError: 1, w: N, “wtimeout”: 5000});

requer que o bloqueio ocorra até que um número N de membros tenha replicado a última operação de gravação. Se N estiver disponível ou for menor que 2, a consulta será retornada. Caso contrário, se o valor de N for igual a 2, o mestre equivalente ao primário responderá somente após 1 de seus escravos ter sido replicado para a última operação.

O wtimeout O parâmetro é basicamente definir o tempo em milissegundos após o qual o comando getLastError atingirá o tempo limite e retornará um erro antes que a última opção seja replicada.

Por mais que o bloqueio seja de alguma forma vantajoso, às vezes tem uma limitação. Isso diminui significativamente as operações de leitura, especialmente se você definir o valor “w” como muito grande. Eu recomendaria que você defina o valor “w” para 2 ou 3 para maior segurança e eficiência.

Preferência de leitura no MongoDB


Esta é basicamente a rota adjacente com a qual as operações de leitura do cliente são feitas para o conjunto de réplicas. A configuração padrão do MongoDB configura as operações de leitura para o primário porque é aquele com a versão mais recente do documento que você está buscando. Como mencionado anteriormente, a vantagem suprema de explorar o conjunto de réplicas é melhorar o desempenho do nosso sistema de banco de dados. Assim, é aconselhável distribuir as operações de leitura para muitos membros secundários para reduzir a latência de aplicativos que não exigem necessariamente dados atualizados. No entanto, existem razões mais cruciais pelas quais você também deve usar o primário como sua preferência básica:
  1. Manter a disponibilidade de dados durante o failover.
  2. Para aplicativos distribuídos geograficamente, o primário fornecerá leituras locais para clientes no mesmo datacenter.
  3. Para não afetar os aplicativos front-end, especialmente aqueles que executam operações do sistema.

Mongo.setReadPref() Método


Esse método serve basicamente para definir como o cliente encaminhará todas as consultas para os membros do conjunto de réplicas. Leva 2 argumentos, mode e tagSet.

O argumento mode especifica a preferência de leitura que pode ser primária, primária, primária, secundária, secundária, ou mais próxima.

O modo tagSet especifica a preferência de leitura personalizada. Você também pode especificá-los como uma matriz de objetos. Um exemplo de configuração será:
db.getMongo().setReadPref('primaryPreferred',
                          [ { "dc": "east", "use": "production" },
                            { "dc": "east", "use": "reporting" },
                            { "dc": "east" },
                            {}
                          ] )

O que acontece aqui é que, se o cliente tentar acessar a primeira tag e a requisição não passar, ele optará pela segunda preferência de leitura.

Modos de preferência de leitura

  • Primário:define que todas as operações de leitura lidas de um determinado conjunto de réplicas são primárias e é o modo de leitura de preferência padrão.
  • PrimaryPreferred:se apenas o primário não estiver disponível, as operações de leitura poderão ser feitas a partir dos secundários.
  • Secundário:todas as operações de leitura são feitas a partir dos membros secundários do conjunto de réplicas.
  • SecondaryPreferred:se apenas não houver secundário disponível, as operações de leitura podem ser feitas a partir do primário.
  • Mais próximo:o membro com menor latência de rede é selecionado para a operação de leitura, independentemente de seu tipo.

Conjuntos de tags e suas configurações


Essas são opções que permitem que você modele a maneira como deseja que sua preocupação de gravação e preferência de leitura se pareçam. Eles são armazenados no objeto de configuração do conjunto de réplicas. Se você executar rs.conf().members, você obterá este objeto retornado:
[
    {
        "_id" : 0,
        "host" : "localhost:27018",
        "arbiterOnly" : false,
        "buildIndexes" : true,
        "hidden" : false,
        "priority" : 1,
        "tags" : {
            
        },
        "slaveDelay" : NumberLong(0),
        "votes" : 1
    },
    {
        "_id" : 1,
        "host" : "127.0.0.1:27019",
        "arbiterOnly" : false,
        "buildIndexes" : true,
        "hidden" : false,
        "priority" : 1,
        "tags" : {
            
        },
        "slaveDelay" : NumberLong(0),
        "votes" : 1
    }
]

Como você pode ver, cada membro tem o atributo tags.

A principal diferença entre Read Preferences e Write Concern é que, o primeiro considera o valor de uma tag ao selecionar um membro para ler enquanto o último não.

Digamos que um conjunto de tags para uma operação de leitura seja definido como:
{ "disk": "ssd", "use": "reporting" }

Um membro no conjunto de réplicas precisa preencher essas tags para que a operação de leitura seja realizada. Portanto, dizer que uma configuração como essa
{ "disk": "ssd", "use": "reporting", "rack": "a" }

satisfará a consulta, enquanto este
{ "disk": "ssd", "use": "production", "rack": "k" }

não satisfará a consulta.

Adicionando tags a uma réplica definida


Para o membro selecionado em um conjunto de réplicas, você pode adicionar conjuntos de tags usando o método rs.conf() no MongoDB.

Digamos que você tenha selecionado um membro na posição 1 de sua matriz de conjunto de réplicas, você pode adicionar conjuntos de tags da seguinte maneira.
conf = rs.conf()
conf.members[0].tags = { "dc": "NYK", "use": "production"  }
conf.members[1].tags = { "dc": "LON", "use": "reporting"  }
conf.members[2].tags = { "use": "production"  }
rs.reconfig(conf)

Padrões de implantação para o conjunto de réplicas do MongoDB

  1. Conjunto de réplicas geograficamente distribuído - Melhora a redundância de dados, além de proteger os dados contra falhas, como perda de energia. As instâncias em execução estão localizadas em vários locais.
  2. Conjunto de réplicas de três membros - a arquitetura padrão básica para um conjunto de réplicas.
  3. Conjunto de réplicas de quatro ou mais membros - permite uma redundância mais ampla de dados e também oferece suporte a uma distribuição mais ampla de operações de leitura no conjunto de réplicas.

Técnicas de ajuste de implantação do conjunto de réplicas do MongoDB


Um conjunto de réplicas ideal exigirá uma arquitetura bem definida com pelo menos 3 membros para um sistema de produção. Essas estratégias de implantação ajudarão você a habilitar um ótimo conjunto de réplicas.
  1. Use membros atrasados ​​e ocultos para oferecer suporte a funções dedicadas, como relatórios e backup.
  2. Sempre faça com que o número de membros implantados seja ímpar. Como discutimos acima, um número ímpar de membros será necessário para eleger uma primária. Portanto, certifique-se de ter um número ímpar e, se não, você sempre pode adicionar um árbitro.
  3. Para implantações de leitura intensa, você precisará equilibrar a carga. Portanto, você precisará distribuir leituras para o secundário para melhorar o desempenho de leitura. Além disso, quando os dados crescem com o tempo, você pode adicionar mais membros e distribuí-los, mas lembre-se de que você deve configurá-los de tal forma que o design primordial seja eleger o principal.
  4. Sempre considere a tolerância a falhas. Isso basicamente determina quantos membros podem estar indisponíveis em um determinado momento e quantos permanecerão para sustentar o processo de eleição de uma primária. Se você não tiver um primário, infelizmente o conjunto de réplicas não aceitará nenhuma operação de gravação.
  5. Adicione novos membros ao conjunto de réplicas existente antes que surja a demanda.
  6. Use conjuntos de tags de conjunto de réplicas para garantir que todas as operações sejam replicadas em data centers específicos. Você também pode usar essas tags no roteamento para as operações de leitura para máquinas de implantação específicas.
  7. Implante a maioria de seus membros em um local para evitar o contratempo que surgirá do particionamento de rede. O particionamento de rede pode ser resultado de comunicação desconectada entre data centers, consequentemente dificultando o processo de replicação e o processo de eleição de um primário.
  8. Por motivos de segurança, distribua seus membros geograficamente além de fazer alguns escondidos. Você pode definir a prioridade de pelo menos 2 ou 3 membros como zero para evitar torná-los primários.
  9. Empregue o registro no diário para proteger a perda de dados que pode resultar em algo como uma falha de energia. Isso garante que os dados sejam gravados no disco em caso de desligamento repentino.

O Registro de Operação (Oplog)


O oplog mantém um registro das operações do mestre que devem ser aplicadas aos escravos. Ele é armazenado em um banco de dados chamado local na coleção oplog.$main. Ele é criado quando você inicia um membro do conjunto de réplicas pela primeira vez. No limite superior, o oplog é restrito a um tamanho de 50 GB para todos os mecanismos de armazenamento. O tamanho do oplog pode ser alterado a partir de uma configuração padrão. Se esse tamanho for atingido, por exemplo, em 24 horas de operação, os secundários não poderão copiar confortavelmente durante esse período e podem acabar não copiando. Você pode alterar o tamanho do oplog usando a opção replSetResizeOplog, ou seja,
db.database({replSetResizeOplog:1, size: 16384})

Se você reduzir o tamanho deste oplog, isso resultará na remoção de alguns dados. O principal impacto disso no conjunto de réplicas é que os membros sincronizados com esse nó se tornam obsoletos. Assim, você precisará ressincronizar esses membros.

Padrões de carga de trabalho que exigiriam um tamanho grande de oplog

  1. Atualize para vários documentos de uma só vez. As várias operações de atualização devem ser convertidas em uma operação individual para melhorar os resultados nos nós. Esta operação usará um vasto espaço do espaço oplog.
  2. Número significativo de atualizações no local. Isso geralmente acontece ao atualizar dados de documentos não necessariamente aumentando o tamanho deste documento. O banco de dados registrará um grande número de operações no oplog, aumentando seu tamanho.
  3. As exclusões equivalem à mesma quantidade de dados que as inserções. Isso acontece quando você tenta excluir uma quantidade de dados (quase) igual à quantidade de dados inserida. Esta operação tenderá a aumentar o tamanho do oplog.

Conclusão


A replicação é um aspecto importante dos bancos de dados que os desenvolvedores precisam entender. Garante maior disponibilidade de dados. Seu servidor MongoDB pode ficar inativo, por exemplo, devido a uma queda de energia, mas você ainda gostaria que seus clientes acessassem seus dados. Se você tiver dados replicados em outro servidor, seus clientes poderão continuar acessando dados dele se o servidor primário falhar. Além disso, há um balanceamento de carga aumentado, de modo que, em vez de todos os usuários acessarem um único servidor, vimos as vantagens de servir tráfego de réplicas secundárias.