A preferência de leitura descreve como os clientes MongoDB direcionam as operações de leitura para os membros de um conjunto de réplica.
Por padrão, um aplicativo direciona suas operações de leitura para o membro primário em um conjunto de réplicas (ou seja, modo de preferência de leitura "primary"). Mas os clientes podem especificar uma preferência de leitura para enviar operações de leitura para secundários.
A preferência de leitura consiste no modo de preferência de leitura e, opcionalmente, em uma lista de conjunto de tags e na opção maxStalenessSeconds.
Modos de preferência de leitura
A tabela a seguir resume os modos de preferência de leitura.
Modo de preferência de leitura | Descrição |
|---|---|
Modo padrão. As operações são lidas a partir do primário do conjunto de réplicas atual. As transações que contêm operações de leitura devem usar a preferência de leitura | |
As operações são lidas do primário se ele estiver disponível. Caso não esteja, elas são lidas de membros secundários elegíveis. | |
As operações são lidas dos membros secundários elegíveis do conjunto de réplicas. | |
As operações leem dados de membros secundários qualificados do conjunto de réplicas. Se não houver secundários qualificados disponíveis, as operações lerão do membro primário. | |
As operações são lidas de um membro qualificado que tem uma latência de rede dentro da janela de latência, independentemente de ser primário ou secundário. |
Para todos os modos, um membro está disponível quando responde às verificações periódicas de monitoramento do cliente, que confirmam que o membro está acessível pela rede e capaz de responder a solicitações.
Para todos os modos, exceto
primary, um membro é elegível se satisfizer a opção maxStalenessSeconds da preferência de leitura e quaisquer listas de conjuntos de tags especificadas.Para todos os modos, exceto
primary, a opção de string de conexãolocalThresholdMSdefine o limite local que o cliente usa para calcular a janela de latência ao escolher entre os membros qualificados.
Importante
Os modos de preferência de leitura não oferecem nenhuma garantia de que uma operação seja bem-sucedida. A disponibilidade e a elegibilidade determinam quais membros o cliente considera, mas um membro selecionado ainda pode rejeitar uma operação, como quando ele está sob carga.
Para obter uma descrição detalhada dos modos de preferência de leitura, consulte Modos de preferência de leitura.
Comportamento
All read preference modes except
primarymay return stale data because secondaries replicate operations from the primary in an asynchronous process. [1] Ensure that your application can tolerate stale data if you choose to use a non-primarymode.A preferência de leitura não afeta a visibilidade dos dados. Os clientes podem ver os resultados das gravações antes que elas sejam reconhecidas ou propagadas para a maioria dos membros do conjunto de réplicas. Para obter detalhes, consulte Isolamento de leitura, consistência e recência.
A read preference não afeta a consistência causal. As garantias de consistência causal fornecidas por sessões causalmente consistentes para operações de leitura com read concern
"majority"e operações de gravação com write concern"majority"são mantidas em todos os membros da implantação do MongoDB.
Aviso
A partir da versão 8.2 do MongoDB , as leituras secundárias de longa duração em um cluster fragmentado podem ser encerradas automaticamente antes da exclusão do documento órfão após uma migração de partes.
O parâmetro terminateSecondaryReadsOnOrphanCleanup controla este comportamento. Para saber mais sobre como lidar com leituras secundárias de longa duração, consulte Leituras secundárias de longa duração em clusters fragmentados.
Modos de preferência de leitura
primaryAll read operations use only the current replica set primary. [1] This is the default read mode. If the primary is unavailable, read operations produce an error or throw an exception.
O modo de read preference
primarynão é compatível com modos de read preference que utilizam listas de conjunto de tags ou maxStalenessSeconds. Se você especificar listas de conjuntos de tags ou um valormaxStalenessSecondscomprimary, o driver produzirá um erro.As transações que contêm operações de leitura devem usar a preferência de leitura
primary. Todas as operações em uma determinada transação devem ser roteadas para o mesmo nó.
primaryPreferredAs operações são lidas do membro primário do conjunto se ele estiver disponível. Se o primário não estiver disponível, como durante situações de failover, as operações serão lidas de membros secundários que atendam a
maxStalenessSecondse às listas de conjuntos de tags da preferência de leitura.Quando a preferência de leitura
primaryPreferredinclui um valor de maxStalenessSeconds e não há nenhum primário do qual ler, o cliente estima o quão obsoleto cada secundário está comparando a última gravação do secundário com a do secundário com a gravação mais recente. Em seguida, o cliente direcionará a operação de leitura para um secundário cujo atraso estimado seja menor ou igual amaxStalenessSeconds.Quando a read preference inclui uma lista de conjuntos de tags (um array de conjuntos de tags) e não há um primary do qual ler, o cliente tenta encontrar membros secundários com tags correspondentes (tentando os conjuntos de tags em ordem até encontrar uma correspondência). Quando são encontrados secundários correspondentes, o cliente seleciona um secundário aleatório do grupo mais próximo de secundários correspondentes. Se nenhum secundário tiver tags correspondentes, a operação de leitura produz um erro.
Quando a read preference inclui um valor
maxStalenessSecondse uma lista de conjuntos de tags, o cliente filtra primeiro por obsolescência e, em seguida, pelas tags especificadas.As operações de leitura utilizando o modo
primaryPreferredpodem retornar dados obsoletos. Use a opçãomaxStalenessSecondspara evitar a leitura de secundários que o cliente estima estarem excessivamente obsoletos.Em clusters fragmentados que habilitam o limitador de taxa de solicitação de entrada, os nós de fragmento que estão reduzindo carga podem retornar erros rotulados como
SystemOverloadedError.Para clusters que têm
overloadAwareServerSelectionEnableddefinido comotrue, quando um primário responde com um erro repetível rotulado comSystemOverloadedError, o roteador pode rotear temporariamente as leituras para secundários qualificados em vez do servidor sobrecarregado. Isso se aplica a qualquer preferência de leitura que possa selecionar vários servidores. Por padrão,overloadAwareServerSelectionEnabledestá configurado parafalse.
secondaryAs operações são lidas somente dos membros secundários do conjunto. Se nenhum secundário estiver disponível, essa operação de leitura produz um erro ou exceção.
A maioria dos conjuntos de réplicas tem pelo menos um secundário, mas há situações em que pode não haver um secundário disponível. Por exemplo, um conjunto de réplicas com um primário, um secundário e um árbitro pode não ter nenhum secundário se um membro estiver em estado de recuperação ou indisponível.
Quando a preferência de leitura
secondaryinclui um valor maxStalenessSeconds, o cliente estima a obsolescência de cada secundário comparando a última gravação do secundário com a do primário. Em seguida, o cliente direcionará a operação de leitura para um secundário cujo atraso estimado seja menor ou igual amaxStalenessSeconds. Se não houver um primário, o cliente usará o secundário com a gravação mais recente para comparar.Quando a read preference inclui uma lista de conjuntos de tags (um array de conjuntos de tags), o cliente tenta encontrar membros secundários com tags correspondentes (tentando os conjuntos de tags em ordem até encontrar uma correspondência). Quando são encontrados secundários correspondentes, o cliente seleciona um secundário aleatório do grupo mais próximo de secundários correspondentes. Se nenhum secundário tiver tags correspondentes, a operação de leitura produz um erro.
Quando a read preference inclui um valor
maxStalenessSecondse uma lista de conjuntos de tags, o cliente filtra primeiro por obsolescência e, em seguida, pelas tags especificadas.As operações de leitura utilizando o modo
secondarypodem retornar dados obsoletos. Use a opçãomaxStalenessSecondspara evitar a leitura de secundários que o cliente estima estarem excessivamente obsoletos.
secondaryPreferredAs operações leem dados de membros secundários qualificados do conjunto de réplicas. Se não houver secundários qualificados disponíveis, as operações lerão do membro primário.
Quando a preferência de leitura
secondaryPreferredinclui um valor maxStalenessSeconds, o cliente estima a obsolescência de cada secundário comparando a última gravação do secundário com a do primário. Em seguida, o cliente direcionará a operação de leitura para um secundário cujo atraso estimado é menor ou igual amaxStalenessSeconds. Se não houver um primário, o cliente usará o secundário com a gravação mais recente para a comparação. Se não houver secundários com atraso estimado menor ou igual amaxStalenessSeconds, o cliente direcionará a operação de leitura para o primário do conjunto de réplicas.Quando a read preference inclui uma lista de conjuntos de tags (um array de conjuntos de tags), o cliente tenta encontrar membros secundários com tags correspondentes (tentando os conjuntos de tags em ordem até encontrar uma correspondência). Quando são encontrados secundários correspondentes, o cliente seleciona um secundário aleatório do grupo mais próximo de secundários correspondentes. Se nenhum secundário tiver tags correspondentes, o cliente ignora as tags e leituras do primary.
Quando a read preference inclui um valor
maxStalenessSecondse uma lista de conjuntos de tags, o cliente filtra primeiro por obsolescência e, em seguida, pelas tags especificadas.As operações de leitura utilizando o modo
secondaryPreferredpodem retornar dados obsoletos. Use a opçãomaxStalenessSecondspara evitar a leitura de secundários que o cliente estima estarem excessivamente obsoletos.
nearestO driver lê de um membro cuja latência de rede recai dentro da janela de latência aceitável. As leituras no modo
nearestnão consideram se um membro é um primário ou secundário ao rotear operações de leitura: primários e secundários são tratados de forma equivalente.Defina esse modo para minimizar o efeito da latência de rede nas operações de leitura sem preferência por dados atuais ou obsoletos.
Quando a read preference inclui um valor maxStalenessSeconds, o cliente estima o quanto cada secundário está obsoleto comparando a última gravação do secundário com a do primary, se disponível, ou com o secundário com a gravação mais recente se não houver nenhum primary. Em seguida, o cliente filtra qualquer secundário cuja defasagem estimada seja maior que
maxStalenessSecondse direciona aleatoriamente a leitura para um membro restante (primary ou secundário) cuja latência de rede esteja dentro da janela de latência aceitável.Se você especificar uma lista de conjuntos de tags, o cliente tentará encontrar um membro do conjunto de réplicas que corresponda às listas de conjuntos de tags especificadas e direcionará as leituras para um membro arbitrário do grupo mais próximo.
Quando a read preference inclui um valor
maxStalenessSecondse uma lista de conjuntos de tags, o cliente filtra primeiro por obsolescência e, em seguida, pelas tags especificadas. Das instânciasmongodrestantes, o cliente direciona aleatoriamente a leitura para uma instância que esteja dentro da janela de latência aceitável. A documentação da seleção de membro da read preference descreve o processo em detalhes.As operações de leitura utilizando o modo
nearestpodem retornar dados obsoletos. Use a opçãomaxStalenessSecondspara evitar a leitura de secundários que o cliente estima estarem excessivamente obsoletos.
Dica
Para saber mais sobre casos de uso de configurações específicas de preferências de leitura, consulte Casos de uso de preferências de leitura.
Configurar read preference
Ao usar um driver do MongoDB, é possível especificar a preferência de leitura usando a API de preferência de leitura do driver. Consulte a documentação da API do driver. Você também pode definir a preferência de leitura ao se conectar ao conjunto de réplicas ou ao cluster fragmentado. Por exemplo,consulte string de conexão.
Para uma determinada preferência de leitura, os drivers MongoDB usam a mesma lógica de seleção de membros.
Ao usar mongosh, consulte cursor.readPref() e Mongo.setReadPref().
Read preference e transações
As transações que contêm operações de leitura devem usar a preferência de leitura primary. Todas as operações em uma determinada transação devem ser roteadas para o mesmo nó.
Considerações adicionais
Considere os seguintes pontos ao usar os estágios $merge ou $out em um pipeline de agregação:
A partir do MongoDB 5.0, os pipelines com um estágio
$mergepoderão ser executados em nós secundários do conjunto de réplicas se todos os nós do cluster tiverem a featureCompatibilityVersion definida como5.0ou superior e a preferência de leitura permitir leituras secundárias.nas versões anteriores do MongoDB , os pipelines com estágios
$outou$mergesempre são executados no nó principal, e a preferência de leitura não é considerada.
Para as operações mapReduce, somente as operações "inline" mapReduce que não gravam dados são compatíveis com a read preference. Caso contrário, as operações mapReduce serão executadas no membro principal.
| [1] | (1, 2) Em alguns casos, dois nós em um conjunto de réplicas podem acreditar transitoriamente que são os primários, mas somente um deles poderá realizar gravações com restrição de gravação |