Níveis de coerência no Azure Cosmos DB

APLICA-SE A: API do SQL API do Cassandra API do Gremlin API de Tabela API do Azure Cosmos DB para MongoDB

Bancos de dados distribuídos que dependem de replicação para alta disponibilidade, baixa latência ou ambos devem realizar uma compensação fundamental entre a coerência de leitura, a disponibilidade, a latência e a taxa de transferência, conforme definido pelo teorema PACLC. A linearizabilidade do modelo de coerência forte é o padrão ouro de programação de dados. Mas ela adiciona um preço alto de latências de gravação maiores, pois os dados devem ser replicados e confirmados em grandes distâncias. A coerência forte também pode ter a disponibilidade reduzida (durante as falhas) porque os dados não podem ser replicados e confirmados em todas as regiões. A coerência eventual oferece maior disponibilidade e melhor desempenho, mas é mais difícil programar aplicativos, pois os dados podem não ser totalmente coerentes em todas as regiões.

Atualmente, a maioria dos bancos de dados NoSQL distribuídos comercialmente disponíveis no mercado fornece uma coerência forte e eventual. O Azure Cosmos DB oferece cinco níveis bem definidos. Do mais forte ao mais fraco, os níveis são:

  • Forte
  • Desatualização Limitada
  • Sessão
  • Prefixo coerente
  • Eventual

Cada nível fornece compensações de desempenho e disponibilidade. A imagem a seguir mostra diferentes níveis de coerência como um espectro.

Consistência como um espectro

Os níveis de coerência da conta são independentes de região e são garantidos para todas as operações, independentemente da região da qual as leituras e gravações são atendidas, o número de regiões associadas à conta do Azure Cosmos ou se a conta está configurada com uma ou várias regiões de gravação.

Níveis de consistência e APIs do Azure Cosmos DB

O Azure Cosmos DB oferece suporte nativo para transmissão compatível com o protocolo de APIs para bancos de dados populares. Eles incluem armazenamento MongoDB, Apache Cassandra, Gremlin e armazenamento de Tabelas do Azure. Ao usar a API do Gremlin e a API de Tabela, o nível de coerência padrão configurado na conta do Azure Cosmos é usado. Para obter detalhes sobre o mapeamento de nível de coerência entre a API do Cassandra ou a API para MongoDB e os níveis de coerência do Azure Cosmos DB, confira Mapeamento de coerência da API do Cassandra e API para mapeamento de coerência do MongoDB.

Escopo da coerência de leitura

A consistência de leitura se aplica a uma única operação de leitura no escopo dentro de uma partição lógica. A operação de leitura pode ser emitida por um cliente remoto ou um procedimento armazenado.

Configurar o nível de consistência padrão

Você pode configurar o nível de coerência padrão em sua conta do Azure Cosmos a qualquer momento. O nível de coerência padrão configurado na conta se aplica a todos os bancos de dados e contêineres do Azure Cosmos nessa conta. Todas as leituras e consultas emitidas em um contêiner ou banco de dados usam o nível de consistência especificado por padrão. Para obter mais informações, consulte configurar o nível de consistência padrão. Você também pode substituir o nível de coerência padrão para uma solicitação específica. Para saber mais, confira o artigo sobre como Substituir o nível de coerência padrão.

Dica

A substituição do nível de consistência padrão aplica-se somente a leituras dentro do cliente do SDK. Uma conta configurada para consistência forte por padrão ainda gravará e replicará dados de modo síncrono em todas as regiões da conta. Quando a instância ou solicitação do cliente do SDK substituir essa opção por Sessão ou por uma consistência mais fraca, as leituras serão executadas com uma só réplica. Confira Níveis de consistência e taxa de transferência para obter mais detalhes.

Importante

É necessário recriar qualquer instância do SDK depois de alterar o nível de coerência padrão. Isso pode ser feito ao reiniciar o aplicativo. Isso garante que o SDK use o novo nível de coerência padrão.

Garantias associadas a níveis de coerência

O Azure Cosmos DB garante que 100% de solicitações de leitura atendam a garantia de coerência para o nível de consistência que você escolher. As definições precisas dos cinco níveis de coerência no Azure Cosmos DB usando a linguagem de especificação TLA + são fornecidas no repositório do GitHub azure-cosmos-tla.

A semântica dos cinco níveis de coerência é descrita nas seções a seguir.

Coerência forte

A coerência forte oferece uma garantia de transação atômica. Transação atômica se refere ao fornecimento de solicitações simultaneamente. As leituras são garantidas para retornar a versão mais recente de um item. Um cliente nunca vê uma gravação não comprometida ou parcial. Os usuários sempre terão a garantia de ler a última gravação confirmada.

O gráfico a seguir ilustra a coerência forte com notas musicais. Depois que os dados são gravados na região "Oeste dos EUA 2", ao ler os dados de outras regiões, você obtém o valor mais recente:

Ilustração do nível de coerência forte

Coerência de desatualização limitada

Na coerência desatualização limitada, as leituras têm a garantia de honrar a garantia de prefixo consistente. As leituras podem atrasar gravações em no máximo versões "K" (que são "atualizações") de um item ou por intervalo de tempo "T" , o que for alcançado primeiro. Ou seja, ao escolher a desatualização limitada, a “desatualização” pode ser configurada de duas maneiras:

  • O número de versões (K) do item
  • O intervalo de tempo (T) pelo qual as leituras podem ficar atrás das gravações

Para uma única conta de região, o valor mínimo de K e T é de 10 operações de gravação ou 5 segundos. Para contas de várias regiões, o valor mínimo de K e T é de 100 mil operações de gravação ou 300 segundos.

A desatualização limitada oferece ordem global total fora da "janela de desatualização". Quando um cliente executa operações de leitura em uma região que aceita gravações, as garantias fornecidas pela coerência de desatualização limitada são idênticas àquelas garantias da coerência forte. À medida que a janela de desatualização se aproxima da hora ou das atualizações, o que for mais próximo, o serviço restringirá novas gravações para permitir que a replicação acompanhe e obedeça à garantia de coerência.

Dentro da janela de desatualização, a desatualização limitada fornece as seguintes garantias de coerência:

  • Coerência para clientes na mesma região para uma conta com uma única região de gravação = forte

  • Coerência para clientes em regiões diferentes para uma conta com uma única região de gravação = prefixo coerente

  • Coerência para clientes que gravam em uma única região para uma conta com várias regiões de gravação = prefixo coerente

  • Coerência para clientes que gravam em regiões diferentes para uma conta com várias regiões de gravação = eventual

    A desatualização limitada é escolhida com mais frequência por aplicativos distribuídos globalmente que esperam baixas latências de gravação, mas exigem uma garantia global total de pedidos. A desatualização limitada é excelente para aplicativos que apresentam colaboração e compartilhamento de grupos, cotação de bolsa, publicar-assinar/consultar, etc. O gráfico a seguir ilustra a coerência de desatualização limitada com notas musicais. Depois que os dados são gravados na região "Oeste dos EUA 2", as regiões "Leste dos EUA 2" e "Leste da Austrália" fazem a leitura do valor escrito com base no tempo de retardo máximo configurado ou no máximo de operações:

    Ilustração do nível de coerência de desatualização limitada

Coerência de sessão

Na coerência da sessão, as leituras em uma única sessão de cliente têm a garantia de obedecer o prefixo coerente, leituras monotônicas, gravações monótonas, leituras de suas gravações e garantias de gravação de seguidas leituras. Isso pressupõe uma única sessão de "gravador" ou o compartilhamento do token de sessão para vários gravadores.

Os clientes fora da sessão que executam gravações verão as seguintes garantias:

  • Coerência para clientes na mesma região para uma conta com uma única região de gravação = prefixo coerente

  • Coerência para clientes em regiões diferentes para uma conta com uma única região de gravação = prefixo coerente

  • Coerência para clientes que gravam em uma única região para uma conta com várias regiões de gravação = prefixo coerente

  • Consistência para clientes que gravam em várias regiões para uma conta com várias regiões de gravação = eventual

    A coerência da sessão é o nível de coerência mais amplamente usado para aplicativos de região única, bem como distribuídos globalmente. Fornece latências de gravação, disponibilidade e taxa de transferência de leitura comparável a essa coerência eventual, mas também fornece garantia de coerência que se adeque às necessidades dos aplicativos gravados para operar no contexto de um usuário. O gráfico a seguir ilustra a coerência de sessão com notas musicais. O "gravador Oeste dos EUA 2" e o "leitor Oeste dos EUA 2" usam a mesma sessão (sessão A) para que possam ler os mesmos dados ao mesmo tempo. A região "Leste da Austrália", por sua vez, usa a "sessão B" e recebe os dados mais tarde, mas na mesma ordem que as gravações.

    Ilustração do nível de coerência da sessão

Coerência de prefixo coerente

Na opção prefixo coerente, as atualizações retornadas contêm algum prefixo de todas as atualizações, sem intervalos. O nível de prefixo coerente garante que as leituras nunca vejam gravações fora de ordem.

Se as gravações tiverem sido realizadas na ordem A, B, C, o cliente verá A, A,B ou A,B,C, mas nunca fora de ordem, como A,C ou B,A,C. O prefixo coerente fornece latências de gravação, disponibilidade e taxa de transferência de leitura comparáveis à de coerência eventual, mas também fornece as garantias de ordem que atendem às necessidades dos cenários em que a ordem importa.

Abaixo estão as garantias de coerência para o prefixo coerente:

  • Coerência para clientes na mesma região para uma conta com uma única região de gravação = prefixo coerente
  • Coerência para clientes em regiões diferentes para uma conta com uma única região de gravação = prefixo coerente
  • Coerência para clientes que gravam em uma única região para uma conta com várias regiões de gravação = prefixo coerente
  • Coerência para clientes que gravam em várias regiões para uma conta com várias regiões de gravação = eventual

O gráfico a seguir ilustra a coerência de prefixo coerente com notas musicais. Em todas as regiões, as leituras nunca encontram gravações fora de ordem:

Ilustração de um prefixo coerente

Coerência eventual

Na coerência eventual, não há garantia de ordem para leituras. Na ausência de qualquer gravação adicional, as réplicas eventualmente convergem.
A coerência eventual é a forma mais fraca de coerência, pois um cliente pode ler valores mais antigos do que aqueles que tinha lido antes. A coerência eventual é ideal quando o aplicativo não exige nenhuma garantia de ordenação. Os exemplos incluem a contagem de retweets, curtidas ou comentários não encadeados. O gráfico a seguir ilustra a coerência eventual com notas musicais.

Ilustração de coerência eventual

Garantias de consistência na prática

Na prática, você pode obter garantias de coerência mais fortes com frequência. Garantias de consistência para uma operação de leitura correspondem à atualização e ordenação do estado do banco de dados que você solicita. Consistência de leitura é vinculada ao pedido e a propagação das operações de gravação/atualização.

Se não houver operações de gravação no banco de dados, é provável que uma operação de leitura com níveis de coerência eventual, de sessão ou prefixo coerente produza os mesmos resultados de uma operação de leitura com um nível de coerência forte.

Se a conta do Azure Cosmos estiver configurada com um nível de coerência diferente da forte, você talvez obtenha a probabilidade de seus clientes receberem leituras fortes e coerentes para as cargas de trabalho observando a métrica PBS Probabilistically Bounded Staleness. Essa métrica é exposta no portal do Azure, para obter mais informações, consulte métrica Monitor Probabilistic Bounded Staleness (PBS).

A desatualização limitada probabilística mostra o quão eventual é a sua coerência eventual. Essa métrica fornece uma percepção da frequência com que você pode obter uma coerência mais forte que o nível configurado atualmente na conta do Azure Cosmos. Em outras palavras, você pode ver a probabilidade (medida em milissegundos) de obter leituras fortemente consistentes para uma combinação de regiões de gravação e leitura.

Níveis de coerência e latência

A latência de leitura para todos os níveis de coerência é sempre asseguradamente menor que 10 milissegundos no 99º percentil contando com suporte do SLA. A latência de leitura média, no 50º percentil, é normalmente 4 milissegundos ou menos.

A latência de gravação para todos os níveis de coerência é sempre asseguradamente menor que 10 milissegundos no 99º percentil. A latência média de gravação, 50 º percentil, geralmente é 5 milissegundos ou menos. Contas do Cosmos do Azure que abrangem várias regiões e são configuradas com coerência forte são uma exceção a essa garantia.

Latência de gravação e coerência forte

Para contas do Azure Cosmos configuradas com coerência forte com mais de uma região, a latência de gravação é igual a duas vezes o RTT (tempo de ida e volta) entre qualquer uma das duas regiões mais distantes, mais 10 milissegundos no 99 º percentil. O RTT alto de rede entre as regiões será convertido em uma latência mais alta para solicitações do Cosmos DB, uma vez que a coerência forte conclui uma operação somente depois de garantir que ela tenha sido confirmada em todas as regiões de uma conta.

A latência RTT é uma função de distância à velocidade da luz e a topologia de rede exata do Azure. A rede do Azure não fornece SLAs de latência para o RTT entre duas regiões do Azure, no entanto, ela publica estatísticas de latência de ida e volta da rede do Azure. Para sua conta do Azure Cosmos, latências de replicação são exibidas no portal do Azure. Você pode usar o portal do Azure (vá para a folha Métricas, selecione a guia Coerência) para monitorar as latências de replicação entre várias regiões associadas à conta do Azure Cosmos.

Importante

A coerência forte para contas com regiões que abrangem mais de 5 mil milhas (8 mil quilômetros) é bloqueada por padrão devido à alta latência de gravação. Para habilitar esse recurso, entre em contato com o suporte.

Níveis de coerência e taxa de transferência

  • Para uma desatualização forte e limitada, as leituras são feitas em relação a duas réplicas em um conjunto de quatro réplicas (quorum minoritário) para fornecer garantias de coerência. Sessão, prefixo coerente e eventual fazem leituras de réplica única. O resultado é que, para o mesmo número de unidades de solicitação, a taxa de transferência de leitura para forte e desatualização limitada é a metade dos outros níveis de coerência.

  • Para um determinado tipo de operação de gravação, como inserir, substituir, submeter, excluir, a taxa de transferência de gravação para unidades de solicitação é idêntica para todos os níveis de consistência.

Nível de coerência Leituras de Quorum Gravações de Quorum
Forte Minoria local Maioria global
Desatualização Limitada Minoria local Maioria local
Sessão Réplica única (usando o token de sessão) Maioria local
Prefixo Coerente Réplica única Maioria local
Eventual Réplica única Maioria local

Observação

O custo das RU/s de leituras para leituras de minoria local é duas vezes maior que os níveis de coerência mais fracos, pois as leituras são feitas de duas réplicas para fornecer garantias de coerência para forte e desatualização limitada.

Níveis de consistência e durabilidade dos dados

Em um ambiente de banco de dados distribuído globalmente, há uma relação direta entre a durabilidade dos dados e o nível de consistência no caso de uma interrupção em toda a região. À medida que você vai desenvolvendo o plano de continuidade dos negócios, precisará saber qual é o tempo máximo aceitável antes que o aplicativo se recupere completamente após um evento de interrupção. O tempo necessário para o aplicativo se recuperar totalmente é conhecido como RTO (objetivo de tempo de recuperação). Também é necessário saber o período máximo de atualizações de dados recentes que o aplicativo pode perder sem maiores problemas durante a recuperação após um evento de interrupção. O período de tempo de atualizações que você pode perder é conhecido como RPO (objetivo de ponto de recuperação).

A tabela abaixo define a relação entre a durabilidade dos dados e o modelo de coerência no caso de uma interrupção em toda a região. É importante observar que em um sistema distribuído, mesmo com coerência forte, é impossível ter um banco de dados distribuído com um RPO e RTO zero, devido ao Teorema de CAP.

Regiões Modo de replicação Nível de coerência RPO RTO
1 Uma ou várias regiões de gravação Qualquer nível de consistência < 240 minutos < 1 semana
> 1 Região única de gravação Sessão, Prefixo Consistente, Eventual < 15 minutos < 15 minutos
> 1 Região única de gravação Desatualização limitada K & T < 15 minutos
> 1 Região única de gravação Forte 0 < 15 minutos
> 1 Várias regiões de gravação Sessão, Prefixo Consistente, Eventual < 15 minutos 0
> 1 Várias regiões de gravação Desatualização limitada K & T 0

K = O número de versões "K" (ou seja, atualizações) de um item.

T = O intervalo de tempo "T" desde a última atualização.

Para uma única conta de região, o valor mínimo de K e T é de 10 operações de gravação ou 5 segundos. Para contas de várias regiões, o valor mínimo de K e T é de 100 mil operações de gravação ou 300 segundos. Isso define o RPO mínimo de dados ao usar a desatualização limitada.

Coerência forte e várias regiões de gravação

As contas do Cosmos configuradas com várias regiões de gravação não podem ser configuradas para uma coerência forte, pois um sistema distribuído não pode fornecer um RPO zero e um RTO zero. Além disso, não há benefícios de latência de gravação com o uso de coerência forte com várias regiões de gravação, pois uma gravação em qualquer região deve ser replicada e confirmada em todas as regiões configuradas na conta. Isso resulta na mesma latência de gravação que uma conta de região única de gravação.

Leituras adicionais

Para saber mais sobre conceitos de coerência, leia os artigos a seguir:

Próximas etapas

Para saber mais sobre os níveis de coerência no Azure Cosmos DB, leia os artigos a seguir: