O seguinte documento explica casos de uso comuns para vĂĄrios modos de preferĂȘncia de leitura, bem como contraindicaçÔes descrevendo quando vocĂȘ nĂŁo deve alterar a preferĂȘncia de leitura do primary padrĂŁo.
Modos de preferĂȘncia de leitura
Modo de preferĂȘncia de leitura | Descrição |
|---|---|
modo padrĂŁo. As operaçÔes 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 | |
As operaçÔes sĂŁo lidas do primĂĄrio, se estiverem disponĂveis. Caso contrĂĄrio, eles leem de membros secundĂĄrios qualificados. | |
As operaçÔes leem dados de nĂłs secundĂĄrios elegĂveis do conjunto de rĂ©plicas. Se nenhum secundĂĄrio qualificado estiver disponĂvel, as operaçÔes serĂŁo lidas do nĂł primĂĄrio. | |
As operaçÔes lidas de um membro qualificado que tenha 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 de monitoramento periĂłdicas do cliente, que confirmam que o membro estĂĄ acessĂvel pela rede e Ă© capaz de responder Ă s solicitaçÔes.
Para todos os modos, exceto
primary, um membro Ă© elegĂvel se satisfizer a opção maxStalenessSeconds da read preference e qualquer lista de conjunto de tags especificada.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 read preference não garantem 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 ela estå sob carga.
IndicaçÔes para usar preferĂȘncia de leitura nĂŁo primĂĄria
Confira a seguir casos de uso comuns para usar modos de read preference nĂŁo primary:
Execução de operaçÔes de sistemas que não afetam o aplicativo front-end.
Observação
As read preferences nĂŁo sĂŁo relevantes para conexĂ”es diretas com uma Ășnica instĂąncia do
mongod. No entanto, para executar operaçÔes de leitura em uma conexĂŁo direta com um membro secundĂĄrio de um conjunto de rĂ©plicas, Ă© necessĂĄrio definir uma read preference, como secundĂĄria.Fornecimento de leituras locais para aplicativos distribuĂdos geograficamente.
Se vocĂȘ tiver servidores de aplicativos em vĂĄrios centros de dados, considere ter um conjunto de rĂ©plicas distribuĂdo geograficamente e usar uma preferĂȘncia de leitura nĂŁo primĂĄria ou
nearest. Isso permite que o cliente leia a partir dos membros de menor latĂȘncia, em vez de sempre ler a partir do principal.Como manter a disponibilidade durante um failover.
Use
primaryPreferredse quiser que um aplicativo leia a partir do primĂĄrio em circunstĂąncias normais, mas permita leituras obsoletas dos secundĂĄrios quando o primĂĄrio nĂŁo estiver disponĂvel.
ContraindicaçÔes para PreferĂȘncia de Leitura NĂŁo PrimĂĄria
Em geral, nĂŁo use secondary e secondaryPreferred para fornecer capacidade extra para leituras, porque:
Todos os membros de uma rĂ©plica tĂȘm trĂĄfego de gravação aproximadamente equivalente; com isso, os secundĂĄrios servirĂŁo leituras aproximadamente na mesma taxa que o primĂĄrio.
A replicação Ă© assĂncrona e hĂĄ algum atraso entre uma operação de gravação bem-sucedida e sua replicação para secundĂĄrios. A leitura de um secundĂĄrio pode retornar dados obsoletos; A leitura de diferentes secundĂĄrios pode resultar em leituras nĂŁo monotĂŽnicas.
Observação
Os clientes podem usar SessĂ”es de cliente e garantias de consistĂȘncia causal para garantir leituras monotĂŽnicas.
A distribuição de operaçÔes de leitura para secundĂĄrios pode comprometer a disponibilidade se qualquer membro do conjunto ficar indisponĂvel porque os membros restantes do conjunto precisam ser capazes de lidar com todas as solicitaçÔes do aplicativo.
A fragmentação aumenta a capacidade de leitura e gravação ao distribuir as operaçÔes de leitura e gravação em um grupo de måquinas e, geralmente, é uma estratégia melhor para aumentar a capacidade.
Consulte Algoritmo de seleção de servidor para obter mais informaçÔes sobre a aplicação interna das preferĂȘncias de leitura.
Maximizar a consistĂȘncia
Para evitar leituras obsoletas, use primary preferĂȘncia de leitura e "majority" readConcern. Se o primĂĄrio nĂŁo estiver disponĂvel, por exemplo, durante as eleiçÔes ou quando a maioria do conjunto de rĂ©plicas nĂŁo estiver acessĂvel, as operaçÔes de leitura usando primary preferĂȘncia de leitura produzirĂŁo um erro ou lançarĂŁo uma exceção.
Em algumas circunstĂąncias, pode ser possĂvel que um conjunto de rĂ©plicas tenha temporariamente duas primĂĄrias; no entanto, apenas uma primĂĄria serĂĄ capaz de confirmar gravaçÔes com a write concern "majority".
Uma partição de rede parcial pode segregar uma primåria (
Pantigo) em uma partição com uma minoria dos nĂłs, enquanto o outro lado da partição contĂ©m a maioria dos nĂłs. A partição com a maioria elegerĂĄ uma nova primĂĄria (Pnova), mas por um breve perĂodo, a primĂĄria antiga (Pantigo) ainda pode continuar a servir leituras e gravaçÔes, pois ainda nĂŁo detectou que sĂł pode ver uma minoria de nĂłs no conjunto de rĂ©plicas.Durante esse perĂodo, se a primĂĄria antiga (Pantiga) ainda estiver visĂvel para os clientes como principal, as leituras dessa primĂĄria podem refletir dados obsoletos.uma primĂĄria (
Pantiga) pode deixar de responder, o que desencadearĂĄ uma eleição e uma nova primĂĄria (Pnova) poderĂĄ ser eleita, servindo leituras e gravaçÔes.Se a primĂĄria que nĂŁo responde (Pantiga) começar a responder novamente, duas primĂĄrias ficarĂŁo visĂveis por um breve perĂodo.O breve perĂodo terminarĂĄ quandoPantiga parar de funcionar. No entanto, durante um breve perĂodo, os clientes podem ler a antiga primĂĄriaPantiga, que pode fornecer dados obsoletos.
Para aumentar a consistĂȘncia, vocĂȘ pode desabilitar o failover automĂĄtico; no entanto, desabilitar o failover automĂĄtico sacrifica a disponibilidade.
Maximizar a disponibilidade
Para permitir operaçÔes de leitura, quando possĂvel, utilize primaryPreferred. Quando houver um primary, vocĂȘ obterĂĄ leituras consistentes [1], mas se nĂŁo houver um primary, vocĂȘ ainda poderĂĄ fazer uma query dos secundĂĄrios. No entanto, ao usar esse modo de leitura , considere a situação descrita em secondary vs secondaryPreferred.
| [1] | Em algumas circunstùncias, dois nós em um conjunto de réplicas podem acreditar transitoriamente que são os principais, mas, no måximo, um deles poderå concluir gravaçÔes com a preocupação de gravação |
Minimizar a LatĂȘncia
To always read from a low-latency node, use nearest. The driver or mongos will read from the nearest member and those no more than 15 milliseconds [2] further away than the nearest member.
nearest nĂŁo garante consistĂȘncia. Se o membro mais prĂłximo do seu servidor de aplicativos for uma secundĂĄria com algum atraso de replicação, as consultas poderĂŁo retornar dados obsoletos. nearest reflete apenas a distĂąncia da rede e nĂŁo reflete a carga de E/S ou CPU.
| [2] | Este limite é configuråvel. Consulte localPingThresholdMs para mongos ou a documentação do driver para obter a configuração apropriada. |
Consulta de Membros DistribuĂdos Geograficamente
Se os membros de um conjunto de rĂ©plicas estiverem geograficamente distribuĂdos, vocĂȘ poderĂĄ criar marcaçÔes de rĂ©plicas baseadas que reflitam a localização da instĂąncia e, entĂŁo, configurar seu aplicativo para realizar consultas dos membros prĂłximos.
Por exemplo, se os membros dos centros de dados "leste" e "oeste" estiverem marcados {'dc': 'east'} como e {'dc': 'west'}, seus servidores de aplicativos no centro de dados leste poderĂŁo ler de membros prĂłximos com a seguinte preferĂȘncia de leitura:
db.collection.find().readPref('nearest', [ { 'dc': 'east' } ])Embora o nearest jĂĄ favoreça membros com baixa latĂȘncia de rede, incluir a tag torna a escolha mais previsĂvel.
secondary vs secondaryPreferred
For specific dedicated queries (e.g. ETL, reporting), you may shift the read load from the primary by using the secondary read preference mode. For this use case, the secondary mode is preferable to the secondaryPreferred mode because secondaryPreferred risks the following situation: if all secondaries are unavailable and your replica set has enough arbiters [3] to prevent the primary from stepping down, then the primary will receive all traffic from the clients. If the primary is unable to handle this load, the queries will compete with the writes. For this reason, use read preference secondary to distribute these specific dedicated queries instead of secondaryPreferred.
| [3] | Em geral, evite implantar ĂĄrbitros em conjuntos de rĂ©plicas e, em vez disso, use um nĂșmero Ămpar de nĂłs portadores de dados. Se vocĂȘ precisar implantar ĂĄrbitros, evite implantar mais de um ĂĄrbitro por conjunto de rĂ©plicas. |