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, na opção maxStalenessSeconds e na opção de leituras distribuĂdas . A opção de leitura protegida estĂĄ disponĂvel para clusters fragmentados para leituras que usam preferĂȘncia de leitura nĂŁoprimary .
Modos de preferĂȘncia de leitura
A tabela a seguir resume os modos de read preference:
Observação
Os modos de preferĂȘncia de leitura nĂŁoprimary suportam leitura distribuĂda em clusters fragmentados.
Modo de preferĂȘncia de leitura | Descrição |
|---|---|
Modo padrĂŁo. Todas as operaçÔes sĂŁo lidas a partir do conjunto de rĂ©plicas atual principal. As transaçÔes que contĂȘm operaçÔes de leitura devem usar a preferĂȘncia de leitura | |
Na maioria das situaçÔes, as operaçÔes sĂŁo lidas a partir do principal, mas se estiverem indisponĂveis, as operaçÔes sĂŁo lidas de nĂłs secundĂĄrios. A preferĂȘncia de leitura | |
Todas as operaçÔes sĂŁo lidas a partir dos nĂłs secundĂĄrios do conjunto de rĂ©plica. A preferĂȘncia de leitura | |
OperaçÔes normalmente leem dados de nĂłs secundĂĄrios do conjunto de rĂ©plica. Se o conjunto de rĂ©plica tiver somente um Ășnico nĂł primĂĄrio e nenhum outro nĂł, as operaçÔes lerĂŁo os dados do nĂł primĂĄrio. A preferĂȘncia de leitura | |
As operaçÔes lidas de um nĂł aleatĂłrio qualificado do conjunto de rĂ©plicas, independentemente de esse nĂł ser primĂĄrio ou secundĂĄrio, com base em um limite de latĂȘncia especificado. A operação considera o seguinte ao calcular latĂȘncia:
A preferĂȘncia de leitura |
Para obter uma descrição detalhada dos modos de preferĂȘncia de leitura, consulte Modos de preferĂȘncia de leitura.
Comportamento
Todos os modos de preferĂȘncia de leitura, exceto
primary, podem retornar dados obsoletos porque os secundĂĄrios replicam as operaçÔes do primĂĄrio em um processo assĂncrono. [1] Certifique-se de que seu aplicativo possa tolerar dados obsoletos se vocĂȘ optar por usar um modo nĂŁo-primary.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
Leituras secundårias em um cluster fragmentado com migraçÔes podem perder documentos
As leituras secundårias de longa duração em um cluster fragmentado podem perder documentos se estiverem ocorrendo migraçÔes.
Antes de excluir uma parte durante a migração de parte, o MongoDB aguarda que as queries em andamento envolvendo a parte sejam concluĂdas no fragmento primĂĄrio e, em seguida, aguarda mais orphanCleanupDelaySecs segundos. As queries que foram inicialmente executadas em um nĂł que era primĂĄrio, mas continuam depois que o nĂł passa para secundĂĄrio, serĂŁo tratadas como se fossem inicialmente executadas em um secundĂĄrio. Ou seja, o servidor sĂł aguarda orphanDelayCleanupSecs se nĂŁo houver queries direcionando a parte no primĂĄrio atual.
As queries que tĂȘm como alvo a parte e sĂŁo executadas em rĂ©plicas secundĂĄrias podem perder documentos se levarem mais de orphanCleanupDelaySecs.
Modos de preferĂȘncia de leitura
primaryTodas as operaçÔes de leitura usam somente o conjunto de rĂ©plicas primĂĄrio atual. [1] Este Ă© o modo de leitura padrĂŁo. Se o primĂĄrio nĂŁo estiver disponĂvel, as operaçÔes de leitura produzem um erro ou geram uma exceção.
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ó.
primaryPreferredNa maioria das situaçÔes, as operaçÔes sĂŁo lidas do nĂł primĂĄrio do conjunto. No entanto, se o primĂĄrio nĂŁo estiver disponĂvel, como Ă© o caso em situaçÔes de failover, as operaçÔes sĂŁo lidas de nĂłs secundĂĄrios que satisfazem as read preferences de
maxStalenessSecondse as listas de conjuntos de tags.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.Observação
A preferĂȘncia de leitura
primaryPreferredĂ© compatĂvel com leituras distribuĂdas em clusters fragmentados.
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 primary, um secundĂĄrio e um arbiter 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.Observação
A preferĂȘncia de leitura
secondaryĂ© compatĂvel com leituras distribuĂdas em clusters fragmentados.
secondaryPreferredOperaçÔes normalmente leem dados de nĂłs secundĂĄrios do conjunto de rĂ©plica. Se o conjunto de rĂ©plica tiver somente um Ășnico nĂł primĂĄrio e nenhum outro nĂł, as operaçÔes lerĂŁo os dados do nĂł 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.Observação
A preferĂȘncia de leitura
secondaryPreferredĂ© compatĂvel com leituras distribuĂdas em clusters fragmentados.
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.Observação
A preferĂȘncia de leitura
nearest, por padrĂŁo, especifica o uso de leituras distribuĂdas para leituras em um cluster fragmentado.
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 (exceto para a opção de leitura protegida) 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 nĂł primĂĄrio.
| [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 |