Níveis de consistência do Apache Cassandra e do Azure Cosmos DB for Apache Cassandra

APLICA-SE A: Cassandra

Ao contrário do Azure Cosmos DB, o Apache Cassandra não fornece nativamente garantias de coerência definidas com precisão. Em vez disso, o Apache Cassandra fornece um nível de coerência de gravação e um nível de coerência de leitura para assim habilitar compensações de alta disponibilidade, coerência e latência. Ao usar o Azure Cosmos DB para Cassandra:

  • O nível de consistência de gravação do Apache Cassandra é mapeado com o nível de coerência padrão configurado na sua conta do Azure Cosmos DB. A coerência de uma operação de gravação (CL) não pode ser alterada com base em solicitações.
  • O Azure Cosmos DB mapeará dinamicamente o nível de consistência de leitura especificado pelo driver do cliente Cassandra. O nível de consistência será mapeado para um dos níveis de consistência do Azure Cosmos DB configurados dinamicamente em uma solicitação de leitura.

Gravações de várias regiões versus gravações de região única

O banco de dados Apache Cassandra é, por padrão, um sistema de vários mestres e não fornece uma opção pronta para uso para gravações de região única com replicação para leituras de várias regiões. No entanto, o Azure Cosmos DB fornece a capacidade turnkey de se ter uma configuração de gravação ou para região única, ou para várias regiões. Algumas das vantagens de se poder escolher a configuração de gravação de região única ao longo de várias regiões são a eliminação de cenários de conflito entre regiões e a opção de manter uma forte coerência ao longo de várias regiões.

Com gravações de região única, é possível manter uma consistência sólida e ainda manter um nível de alta disponibilidade entre regiões com o failover gerenciado pelo serviço. Nessa configuração, ainda é possível explorar a localidade dos dados para reduzir a latência de leitura fazendo o downgrade para a consistência eventual por solicitação. Além dessas funcionalidades, com a plataforma do Azure Cosmos DB oferece a opção de redundância de zona ao selecionar uma região. Portanto, ao contrário do Apache Cassandra nativo, o Azure Cosmos DB permite que você navegue pelo Teorema CAPespectro de compensação com maior granularidade.

Mapeamento de níveis de consistência

A plataforma do Azure Cosmos DB fornece um conjunto de cinco configurações de consistência bem definidas e orientadas a casos de uso de negócios em relação à replicação. As compensações para essas configurações de consistência são definidas pelos teoremas CAP e PACLC. Como essa abordagem difere significativamente do Apache Cassandra, recomendamos que você dedique algum tempo para revisar e entender a consistência do Azure Cosmos DB. Como alternativa, você pode examinar este breve guia de vídeo para entender as configurações de consistência na plataforma do Azure Cosmos DB. A tabela a seguir ilustra os possíveis mapeamentos entre os níveis de consistência do Apache Cassandra e do Azure Cosmos DB ao usar a API para Cassandra. Esta tabela mostra configurações para leituras de região única, leituras de várias regiões com gravações de região única e gravações de várias regiões.

Mapeamentos

Observação

Estes não são mapeamentos exatos. Em vez disso, fornecemos aqueles que fossem mais próximos ao Apache Cassandra e resolvemos ambiguidades em diferenças qualitativas na coluna mais à direita. Conforme mencionado acima, é recomendável revisar as configurações de consistência do Azure Cosmos DB.

Consistência de gravação ALL, EACH_QUOROM, QUOROM, LOCAL_QUORUM ou THREE no Apache Cassandra

Consistência de leitura do Apache Lendo de Nível de consistência do Azure Cosmos DB mais próximo das configurações de leitura/gravação do Apache Cassandra
ALL Região local Strong
EACH_QUOROM Região local Strong
QUOROM Região local Strong
LOCAL_QUORUM Região local Strong
LOCAL_ONE Região local Eventual
ONE Região local Eventual
TWO Região local Strong
THREE Região local Strong

Ao contrário do Apache e do Cassandra DSE, o Azure Cosmos DB confirma permanentemente uma gravação de quorum por padrão. Pelo menos três em cada quatro nós (3/4) confirmam a gravação em disco e NÃO apenas um log de confirmação na memória.

Consistência de gravação ONE, LOCAL_ONE ou ANY no Apache Cassandra

Consistência de leitura do Apache Lendo de Nível de consistência do Azure Cosmos DB mais próximo das configurações de leitura/gravação do Apache Cassandra
ALL Região local Strong
EACH_QUOROM Região local Eventual
QUOROM Região local Eventual
LOCAL_QUORUM Região local Eventual
LOCAL_ONE Região local Eventual
ONE Região local Eventual
TWO Região local Eventual
THREE Região local Eventual

A API do Azure Cosmos DB para Cassandra sempre confirma uma gravação de quorum por padrão e, portanto, todas as consistências de leitura podem ser usadas.

Consistência de gravação TWO no Apache Cassandra

Consistência de leitura do Apache Lendo de Nível de consistência do Azure Cosmos DB mais próximo das configurações de leitura/gravação do Apache Cassandra
ALL Região local Strong
EACH_QUOROM Região local Strong
QUOROM Região local Strong
LOCAL_QUORUM Região local Strong
LOCAL_ONE Região local Eventual
ONE Região local Eventual
TWO Região local Eventual
THREE Região local Strong

O Azure Cosmos DB não tem noção de consistência de gravação apenas para dois nós e, portanto, tratamos essa consistência semelhantemente ao quorum para a maioria dos casos. Para consistência de leitura TWO, essa consistência é equivalente a gravar com QUOROM e ler de ONE.

Consistência de gravação Serial ou Local_Serial no Apache Cassandra

Consistência de leitura do Apache Lendo de Nível de consistência do Azure Cosmos DB mais próximo das configurações de leitura/gravação do Apache Cassandra
ALL Região local Strong
EACH_QUOROM Região local Strong
QUOROM Região local Strong
LOCAL_QUORUM Região local Strong
LOCAL_ONE Região local Eventual
ONE Região local Eventual
TWO Região local Strong
THREE Região local Strong

Serial só se aplica a transações leves. O Azure Cosmos DB segue um algoritmo confirmado permanentemente por padrão e, portanto a consistência Serial é semelhante ao quorum.

Outras regiões para gravação de região única

O Azure Cosmos DB facilita cinco configurações de consistência, incluindo forte, em várias regiões em que as gravações de região única são configuradas. Essa facilitação ocorre desde que as regiões estejam dentro de 2.000 milhas umas das outras.

O Azure Cosmos DB não tem um mapeamento aplicável ao Apache Cassandra, pois todos os nós/regiões são gravações e uma garantia de consistência forte não é possível em todas as regiões.

Outras regiões para gravação de várias regiões

O Azure Cosmos DB facilita apenas quatro configurações de consistência; eventual, consistent prefix, session e bounded staleness em várias regiões em que a gravação de várias regiões está configurada.

O Apache Cassandra só forneceria consistência eventual para leituras em outras regiões, independentemente das configurações.

Substituições dinâmicas com suporte

Configuração da conta do Azure Cosmos DB Substituir o valor na solicitação do cliente Efeito de substituição
Strong All Nenhum efeito (permanecer como strong)
Strong Quorum Nenhum efeito (permanecer como strong)
Strong LocalQuorum Nenhum efeito (permanecer como strong)
Strong Two Nenhum efeito (permanecer como strong)
Strong Three Nenhum efeito (permanecer como strong)
Strong Serial Nenhum efeito (permanecer como strong)
Strong LocalSerial Nenhum efeito (permanecer como strong)
Strong One Alterações de consistência para Eventual
Strong LocalOne Alterações de consistência para Eventual
Strong Any Não permitido (erro)
Strong EachQuorum Não permitido (erro)
Bounded staleness, session ou consistent prefix All Não permitido (erro)
Bounded staleness, session ou consistent prefix Quorum Não permitido (erro)
Bounded staleness, session ou consistent prefix LocalQuorum Não permitido (erro)
Bounded staleness, session ou consistent prefix Two Não permitido (erro)
Bounded staleness, session ou consistent prefix Three Não permitido (erro)
Bounded staleness, session ou consistent prefix Serial Não permitido (erro)
Bounded staleness, session ou consistent prefix LocalSerial Não permitido (erro)
Bounded staleness, session ou consistent prefix One Alterações de consistência para Eventual
Bounded staleness, session ou consistent prefix LocalOne Alterações de consistência para Eventual
Bounded staleness, session ou consistent prefix Any Não permitido (erro)
Bounded staleness, session ou consistent prefix EachQuorum Não permitido (erro)

Métricas

Se sua conta do Azure Cosmos DB estiver configurada com um nível de consistência que não seja de consistência forte, revise a métrica Desatualização limitada probabilisticamente (PBS). A métrica captura a probabilidade de que seus clientes possam obter leituras fortes e consistentes para suas cargas de trabalho. Essa métrica é exposta no portal do Azure. Para encontrar mais informações sobre a métrica PBS, consulte Monitorar a métrica PBS (Monitorar desatualização limitada probabilisticamente).

A desatualização limitada mostra de maneira probabilística se a coerência eventual é 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 DB. Em outras palavras, você pode ver a probabilidade (medida em milissegundos) de obter leituras consistentes para uma combinação de regiões de gravação e leitura.

Consistência forte global para solicitações de gravação no Apache Cassandra

No Apache Cassandra, a configuração de EACH_QUORUM ou QUORUM fornece uma consistência forte. Quando uma solicitação de gravação é enviada para uma região, EACH_QUORUM persiste os dados em um número de quorum de nós em cada data center. Essa persistência exige que todos os data centers estejam disponíveis para que a operação de gravação tenha êxito. QUORUM é um pouco menos restritivo, com um número QUORUM de nós em todos os data centers necessários para persistir os dados antes de reconhecer que a gravação foi bem-sucedida.

O gráfico a seguir ilustra uma configuração de consistência forte global no Apache Cassandra entre duas regiões 1 e 2. Depois que os dados são gravados na região 1, a gravação precisa ser mantida em um número de quorum de nós na região 1 e na região 2 antes que uma confirmação seja recebida pelo aplicativo.

Diagrama de consistência de gravação global no Apache Cassandra.

Consistência forte global para solicitações de gravação no Azure Cosmos DB for Apache Cassandra

No Azure Cosmos DB, a consistência é definida no nível da conta. Com a consistência Strong no Azure Cosmos DB for Cassandra, os dados são replicados de forma síncrona para as regiões de leitura da conta. Quanto mais distantes forem as regiões da conta do Azure Cosmos DB, maior será a latência das operações de gravação consistentes.

Diagrama de consistência de gravação global no Azure Cosmos DB for Apache Cassandra.

Como o número de regiões afeta sua solicitação de leitura ou gravação:

  • Duas regiões: com consistência forte, quorum (N/2 + 1) = 2. Portanto, se a região de leitura ficar inoperante, a conta não poderá mais aceitar gravações com consistência forte, pois um número de quorum de regiões não está disponível para a gravação ser replicada.
  • Três ou mais regiões: para N = 3, quorum = 2. Se uma das regiões de leitura estiver inativa, a região de gravação ainda poderá replicar as gravações em um total de duas regiões que atendam ao requisito de quorum. Da mesma forma, com quatro regiões, quorum = 4/2 + 1 = 3. Mesmo com uma região de leitura inativa, o quorum pode ser atendido.

Observação

Se uma consistência globalmente forte for necessária para todas as operações de gravação, a consistência da conta do Azure Cosmos DB for Cassandra deverá ser definida como forte. O nível de consistência para operações de gravação não pode ser substituído para um nível de consistência mais baixo por solicitação no Azure Cosmos DB.

Consistência mais fraca para solicitações de gravação no Apache Cassandra

Um nível de consistência de ANY, ONE, TWO, THREE, LOCAL_QUORUM, Serial ou Local_Serial? Considere uma solicitação de gravação com LOCAL_QUORUM com um RF de 4 em um datacenter de seis nós. Quorum = 4/2 + 1 = 3.

Diagrama de consistência de gravação não global no Apache Cassandra.

Consistência mais fraca para solicitações de gravação no Azure Cosmos DB for Apache Cassandra

Quando uma solicitação de gravação é enviada com qualquer um dos níveis de consistência inferiores a Strong, uma resposta de êxito é retornada assim que a região local persiste a gravação em pelo menos três de quatro réplicas.

Diagrama de consistência de gravação não global no Azure Cosmos DB for Apache Cassandra.

Consistência forte global para solicitações de leitura no Apache Cassandra

Com uma consistência de EACH_QUORUM, uma leitura consistente pode ser obtida no Apache Cassandra. Em uma configuração de várias regiões para EACH_QUORUM, se o número de quorum de nós não for atendido em cada região, a leitura não será bem-sucedida.

Diagrama de consistência de leitura global no Apache Cassandra.

Consistência forte global para solicitações de leitura no Azure Cosmos DB for Apache Cassandra

A solicitação de leitura é atendida de duas réplicas na região especificada. Como a gravação já se encarregou de persistir em um número de quorum de regiões (e todas as regiões, se cada região estiver disponível), simplesmente a leitura de duas réplicas na região especificada fornece consistência forte. Essa consistência forte requer que EACH_QUORUM seja especificado no driver ao emitir a leitura em uma região para a conta do Cosmos DB, juntamente com a consistência forte como o nível de consistência padrão para a conta.

Diagrama de consistência de leitura global no Azure Cosmos DB for Apache Cassandra.

Consistência forte local no Apache Cassandra

Uma solicitação de leitura com um nível de consistência de TWO, THREE ou LOCAL_QUORUM nos dará uma leitura de consistência forte da região local. Com um nível de consistência de LOCAL_QUORUM, você precisa de uma resposta de dois nós no datacenter especificado para uma leitura bem-sucedida.

Diagrama de consistência de leitura forte local no Apache Cassandra.

Consistência forte local no Azure Cosmos DB for Apache Cassandra

No Azure Cosmos DB for Cassandra, ter um nível de consistência de TWO, THREE ou LOCAL_QUORUM fornecerá uma consistência forte local para uma solicitação de leitura. Como o caminho de gravação garante a replicação para, no mínimo, três em cada quatro réplicas, uma leitura de duas réplicas na região especificada garantirá uma leitura de quorum dos dados nessa região.

Diagrama de consistência de leitura forte local no Azure Cosmos DB for Apache Cassandra.

Consistência eventual do Apache Cassandra

Um nível de consistência de LOCAL_ONE, One e ANY with LOCAL_ONE resultará em consistência eventual. Essa consistência é usada nos casos em que o foco está na latência.

Diagrama de consistência de leitura eventual no Apache Cassandra.

Consistência eventual no Azure Cosmos DB for Apache Cassandra?

Um nível de consistência de LOCAL_ONE, ONE ou Any fornecerá consistência eventual. Com consistência eventual, uma leitura é fornecida de apenas uma das réplicas na região especificada.

Diagrama de consistência de leitura eventual no Azure Cosmos DB for Apache Cassandra.

Substituir o nível de consistência para operações de leitura no Azure Cosmos DB for Cassandra

Anteriormente, o nível de consistência para solicitações de leitura só podia ser substituído para uma consistência inferior ao padrão definido na conta. Por exemplo, com a consistência padrão Forte, as solicitações de leitura podem ser emitidas com Forte por padrão e substituídas por solicitação (se necessário) para um nível de consistência mais fraco que Forte. No entanto, não foi possível emitir solicitações de leitura com um nível de consistência substituído superior ao padrão da conta. Uma conta com consistência eventual não pôde receber solicitações de leitura com um nível de consistência superior a Eventual (que nos drivers do Apache Cassandra são convertidos em TWO, THREE, LOCAL_QUORUM ou QUORUM).

O Azure Cosmos DB for Cassandra agora facilita a substituição da consistência em solicitações de leitura para um valor superior à consistência padrão da conta. Por exemplo, com a consistência padrão na conta do Cosmos DB definida como Eventual (equivalente ao Apache Cassandra de One ou ANY), as solicitações de leitura podem ser substituídas por solicitação para LOCAL_QUORUM. Essa substituição garante que um número de quorum de réplicas dentro da região especificada seja consultado antes de retornar o conjunto de resultados, conforme exigido por LOCAL_QUORUM.

Essa opção também impede a necessidade de definir uma consistência padrão maior que Eventual, quando ela só é necessária para solicitações de leitura.

Próximas etapas

Saber mais sobre a distribuição global e os níveis de coerência do Azure Cosmos DB: