Livelli di coerenza di Apache Cassandra e di Azure Cosmos DB for Apache Cassandra.

SI APPLICA A: Cassandra

A differenza di Azure Cosmos DB, Apache Cassandra non offre in modo nativo garanzie di coerenza definite con precisione, ma fornisce un livello di coerenza di scrittura e uno di lettura, per consentire compromessi in termini di disponibilità elevata, coerenza e latenza. Quando si usa Azure Cosmos DB for Apache Cassandra:

  • Il livello di coerenza di scrittura in Apache Cassandra viene mappato al livello di coerenza predefinito configurato per l'account Azure Cosmos DB. La coerenza per un'operazione di scrittura (CL) non può essere modificata per singole richieste.
  • Il livello di coerenza di lettura specificato dal driver client Cassandra viene mappato dinamicamente a uno dei livelli di coerenza di Azure Cosmos DB configurati in modo dinamico in una richiesta di lettura.

Scritture in più aree e in area singola a confronto

Il database Apache Cassandra è per impostazione predefinita un sistema multimaster e non offre un'opzione predefinita per le scritture in area singola con replica in più aree per le operazioni di lettura. Al contrario, Azure Cosmos DB offre la possibilità di avere configurazioni di scrittura in area singola o in più aree. Uno dei vantaggi della possibilità di scegliere una configurazione di scrittura in area singola per più aree è quello di evitare scenari di conflitto tra aree, oltre a mantenere una coerenza Strong tra più aree.

Con le scritture in area singola, è possibile mantenere una coerenza Strong, assicurando al contempo un livello di disponibilità elevata tra aree con failover gestito dal servizio. In questa configurazione è comunque possibile sfruttare la posizione dei dati per ridurre la latenza di lettura eseguendo il downgrade a una coerenza Eventual per singole richieste. Oltre a queste funzionalità, la piattaforma Azure Cosmos DB offre l'opzione di ridondanza della zona al momento della selezione di un'area. Di conseguenza, a differenza di Apache Cassandra nativo, Azure Cosmos DB consente di spostarsi all'interno dello spettro di compromessi del teorema CAP con maggiore granularità.

Mapping dei livelli di coerenza

La piattaforma Azure Cosmos DB offre un set di cinque impostazioni di coerenza, ben definite e orientate ai casi d'uso aziendali in relazione alla replica. I compromessi rispetto a queste impostazioni di coerenza sono definiti dai teoremi CAP e PACLC. Poiché questo approccio differisce in modo significativo da Apache Cassandra, è consigliabile dedicare del tempo alla revisione e alla comprensione della coerenza di Azure Cosmos DB. In alternativa, è possibile guardare questa breve guida video per conoscere le impostazioni di coerenza nella piattaforma Azure Cosmos DB. La tabella seguente illustra i possibili mapping tra i livelli di coerenza di Apache Cassandra e quelli di Azure Cosmos DB quando viene usata l'API per Cassandra. Nella tabella sono riportate le configurazioni per area singola, le letture in più aree con scritture in area singola e le scritture in più aree.

Mapping

Nota

I mapping non sono del tutto esatti. Vengono però suggerite le analogie più vicine ad Apache Cassandra e disambiguate eventuali differenze qualitative nella colonna più a destra. Come già accennato, è consigliabile rivedere le impostazioni di coerenza di Azure Cosmos DB.

Coerenza di scrittura ALL, EACH_QUOROM, QUOROM, LOCAL_QUORUM o THREE in Apache Cassandra

Coerenza di lettura in Apache Lettura da Livello di coerenza di Azure Cosmos DB più vicino alle impostazioni di lettura/scrittura in Apache Cassandra
ALL Area locale Strong
EACH_QUOROM Area locale Strong
QUOROM Area locale Strong
LOCAL_QUORUM Area locale Strong
LOCAL_ONE Area locale Eventual
ONE Area locale Eventual
TWO Area locale Strong
THREE Area locale Strong

A differenza di Apache e DSE Cassandra, Azure Cosmos DB esegue il commit duraturo di una scrittura quorum per impostazione predefinita. Almeno tre nodi su quattro (3/4) eseguono il commit della scrittura su disco e NON creano solo un log di commit in memoria.

Coerenza di scrittura ONE, LOCAL_ONE o ANY in Apache Cassandra

Coerenza di lettura in Apache Lettura da Livello di coerenza di Azure Cosmos DB più vicino alle impostazioni di lettura/scrittura in Apache Cassandra
ALL Area locale Strong
EACH_QUOROM Area locale Eventual
QUOROM Area locale Eventual
LOCAL_QUORUM Area locale Eventual
LOCAL_ONE Area locale Eventual
ONE Area locale Eventual
TWO Area locale Eventual
THREE Area locale Eventual

L'API Azure Cosmos DB for Apache Cassandra esegue sempre il commit duraturo di una scrittura quorum per impostazione predefinita, pertanto possono essere usate tutte le coerenze di lettura.

Coerenza di scrittura TWO in Apache Cassandra

Coerenza di lettura in Apache Lettura da Livello di coerenza di Azure Cosmos DB più vicino alle impostazioni di lettura/scrittura in Apache Cassandra
ALL Area locale Strong
EACH_QUOROM Area locale Strong
QUOROM Area locale Strong
LOCAL_QUORUM Area locale Strong
LOCAL_ONE Area locale Eventual
ONE Area locale Eventual
TWO Area locale Eventual
THREE Area locale Strong

Azure Cosmos DB non prevede coerenza di scrittura in soli due nodi, pertanto questa coerenza viene considerata simile al quorum nella maggior parte dei casi. Per la coerenza di lettura TWO, questa coerenza equivale a scrivere con QUOROM e a leggere da ONE.

Coerenza di scrittura Serial o Local_Serial in Apache Cassandra

Coerenza di lettura in Apache Lettura da Livello di coerenza di Azure Cosmos DB più vicino alle impostazioni di lettura/scrittura in Apache Cassandra
ALL Area locale Strong
EACH_QUOROM Area locale Strong
QUOROM Area locale Strong
LOCAL_QUORUM Area locale Strong
LOCAL_ONE Area locale Eventual
ONE Area locale Eventual
TWO Area locale Strong
THREE Area locale Strong

La coerenza di scrittura Serial si applica solo alle transazioni leggere. Azure Cosmos DB segue un algoritmo con commit duraturo per impostazione predefinita e pertanto la coerenza Serial è simile al quorum.

Altre aree per la scrittura in area singola

Azure Cosmos DB facilita cinque impostazioni di coerenza, inclusa la coerenza Strong, in più aree in cui è configurata la scrittura in area singola. Questa facilitazione è possibile purché le aree si trovino entro 2000 miglia l'una dall'altra.

Azure Cosmos DB non ha un mapping applicabile ad Apache Cassandra perché tutti i nodi o le aree sono in scrittura e una garanzia di coerenza Strong non è possibile in tutte le aree.

Altre aree per la scrittura in più aree

Azure Cosmos DB facilita solo quattro impostazioni di coerenza: eventual, consistent prefix, sessione bounded staleness in più aree dove è configurata la scrittura in più aree.

Apache Cassandra fornisce solo coerenza Eventual per le letture in altre aree, indipendentemente dalle impostazioni.

Sostituzioni dinamiche supportate

Impostazione dell'account Azure Cosmos DB Valore sostitutivo nella richiesta client Effetto della sostituzione
Strong All Nessun effetto (rimane come strong)
Strong Quorum Nessun effetto (rimane come strong)
Strong LocalQuorum Nessun effetto (rimane come strong)
Strong Two Nessun effetto (rimane come strong)
Strong Three Nessun effetto (rimane come strong)
Strong Serial Nessun effetto (rimane come strong)
Strong LocalSerial Nessun effetto (rimane come strong)
Strong One La coerenza cambia in Eventual
Strong LocalOne La coerenza cambia in Eventual
Strong Any Non consentita (errore)
Strong EachQuorum Non consentita (errore)
Bounded staleness, session o consistent prefix All Non consentita (errore)
Bounded staleness, session o consistent prefix Quorum Non consentita (errore)
Bounded staleness, session o consistent prefix LocalQuorum Non consentita (errore)
Bounded staleness, session o consistent prefix Two Non consentita (errore)
Bounded staleness, session o consistent prefix Three Non consentita (errore)
Bounded staleness, session o consistent prefix Serial Non consentita (errore)
Bounded staleness, session o consistent prefix LocalSerial Non consentita (errore)
Bounded staleness, session o consistent prefix One La coerenza cambia in Eventual
Bounded staleness, session o consistent prefix LocalOne La coerenza cambia in Eventual
Bounded staleness, session o consistent prefix Any Non consentita (errore)
Bounded staleness, session o consistent prefix EachQuorum Non consentita (errore)

Metrica

Se l'account Azure Cosmos DB è configurato con un livello di coerenza diverso dalla coerenza Strong, esaminare la metrica di decadimento ristretto probabilistico (Probabilistically Bounded Staleness, PBS). La metrica acquisisce la probabilità che i client possano ottenere letture complesse e coerenti per i carichi di lavoro. Questa metrica viene esposta nel portale di Azure. Per altre informazioni sulla metrica PBS, vedere Monitorare la metrica del decadimento ristretto probabilistico (Probabilistic Bounded Staleness, PBS).

Il decadimento ristretto probabilistico mostra il livello di finalità della coerenza finale. Questa metrica offre informazioni dettagliate sulla frequenza con cui si ottiene una coerenza più elevata rispetto al livello di coerenza attualmente configurato per l'account Azure Cosmos DB. In altre parole, è possibile visualizzare la probabilità (misurata in millisecondi) di ottenere operazioni di lettura coerenti per una combinazione di aree di scrittura e lettura.

Coerenza Strong globale per le richieste di scrittura in Apache Cassandra

In Apache Cassandra l'impostazione di EACH_QUORUM o QUORUM garantisce una coerenza Strong. Quando una richiesta di scrittura viene inviata a un'area, EACH_QUORUM rende persistenti i dati in un numero quorum di nodi in ogni data center. Con questa persistenza, è necessario che ogni data center sia disponibile affinché l'operazione di scrittura abbia esito positivo. QUORUM è leggermente meno restrittivo. È infatti necessario un numero QUORUM di nodi in tutti i data center per rendere persistenti i dati prima che venga riconosciuto l'esito positivo della scrittura.

L'immagine seguente illustra un'impostazione di coerenza Strong globale in Apache Cassandra tra due aree, 1 e 2. Dopo che i dati sono stati scritti nell'area 1, è necessario rendere persistente la scrittura in un numero quorum di nodi in entrambe le aree 1 e 2 prima che venga ricevuto un riconoscimento dall'applicazione.

Diagram of global write consistency in Apache Cassandra.

Coerenza Strong globale per le richieste di scrittura in Azure Cosmos DB for Apache Cassandra

In Azure Cosmos DB la coerenza è impostata a livello di account. Con la coerenza Strong in Azure Cosmos DB for Cassandra, i dati vengono replicati in modo sincrono nelle aree di lettura per l'account. Quanto più lontane sono le aree per l'account Azure Cosmos DB, tanto maggiore è la latenza delle operazioni di scrittura coerenti.

Diagram of global write consistency in Azure Cosmos DB for Apache Cassandra.

Impatto del numero di aree sulla richiesta di lettura o scrittura:

  • Due aree: con coerenza Strong, quorum (N/2 + 1) = 2. In questo caso, se l'area di lettura diventa inattiva, l'account non può più accettare scritture con coerenza Strong perché non è disponibile un numero quorum di aree per la replica della scrittura.
  • Tre o più aree: per N = 3, quorum = 2. Se una delle aree di lettura è inattiva, l'area di scrittura può comunque replicare le scritture in un totale di due aree che soddisfano il requisito del quorum. Il concetto è analogo per quattro aree, quorum = 4/2 + 1 = 3. Anche con una sola area di lettura inattiva, il quorum può essere soddisfatto.

Nota

Se è necessaria una coerenza Strong globale per tutte le operazioni di scrittura, la coerenza per l'account Azure Cosmos DB for Apache Cassandra deve essere impostata su Strong. Il livello di coerenza per le operazioni di scrittura non può essere sostituito con un livello di coerenza inferiore per singole richieste in Azure Cosmos DB.

Coerenza più debole per le richieste di scrittura in Apache Cassandra

Il livello di coerenza è ANY, ONE, TWO, THREE, LOCAL_QUORUM, Serial o Local_Serial? Valutare una richiesta di scrittura con LOCAL_QUORUM con un RF di 4 in un data center a sei nodi. Quorum = 4/2 + 1 = 3.

Diagram of non-global write consistency in Apache Cassandra.

Coerenza più debole per le richieste di scrittura in Azure Cosmos DB for Apache Cassandra

Quando una richiesta di scrittura viene inviata con uno dei livelli di coerenza inferiori a Strong, viene restituita una risposta di esito positivo non appena l'area locale rende persistente la scrittura in almeno tre repliche su quattro.

Diagram of non-global write consistency in Azure Cosmos DB for Apache Cassandra.

Coerenza Strong globale per le richieste di lettura in Apache Cassandra

Con una coerenza EACH_QUORUM, è possibile ottenere una lettura coerente in Apache Cassandra. In una configurazione in più aree per EACH_QUORUM, se il numero quorum di nodi non viene soddisfatto in ogni area, la lettura avrà esito negativo.

Diagram of global read consistency in Apache Cassandra.

Coerenza Strong globale per le richieste di lettura in Azure Cosmos DB for Apache Cassandra

La richiesta di lettura viene gestita da due repliche nell'area specificata. Poiché la scrittura si è già occupata di rendere persistente un numero quorum di aree (e tutte le aree, se disponibili), la semplice lettura da due repliche nell'area specificata garantisce coerenza Strong. Per ottenere questa coerenza è necessario che nel driver sia specificato EACH_QUORUM quando si esegue la lettura in un'area per l'account Cosmos DB insieme alla coerenza Strong come livello di coerenza predefinito per l'account.

Diagram of global read consistency in Azure Cosmos DB for Apache Cassandra.

Coerenza Strong locale in Apache Cassandra

Una richiesta di lettura con livello di coerenza TWO, THREE o LOCAL_QUORUM offre una lettura con coerenza Strong dall'area locale. Con un livello di coerenza LOCAL_QUORUM, per l'esito positivo di una lettura è necessaria una risposta da due nodi nel data center specificato.

Diagram of local strong read consistency in Apache Cassandra.

Coerenza Strong locale in Azure Cosmos DB for Apache Cassandra

In Azure Cosmos DB per Cassandra, un livello di coerenza TWO, THREE o LOCAL_QUORUM offre una coerenza Strong locale per una richiesta di lettura. Poiché il percorso di scrittura garantisce la replica in almeno tre repliche su quattro, una lettura da due repliche nell'area specificata assicura una lettura quorum dei dati in tale area.

Diagram of local strong read consistency in Azure Cosmos DB for Apache Cassandra.

Coerenza Eventual in Apache Cassandra

Un livello di coerenza LOCAL_ONE, One e ANY with LOCAL_ONE ha per effetto una coerenza Eventual, che viene usata nei casi in cui l'attenzione è concentrata sulla latenza.

Diagram of eventual read consistency in Apache Cassandra.

Coerenza Eventual in Azure Cosmos DB for Apache Cassandra

Un livello di coerenza LOCAL_ONE, ONE e Any dà origine a una coerenza Eventual. Con questa coerenza, una lettura viene gestita da una sola replica nell'area specificata.

Diagram of eventual read consistency in Azure Cosmos DB for Apache Cassandra.

Sostituire il livello di coerenza per le operazioni di lettura in Azure Cosmos DB for Apache Cassandra

In precedenza, il livello di coerenza per le richieste di lettura poteva essere sostituito solo con una coerenza inferiore rispetto al set predefinito nell'account. Ad esempio, con la coerenza predefinita Strong, le richieste di lettura potevano essere eseguite con Strong per impostazione predefinita e sostituite per singole occorrenze (se necessario) da richieste con un livello di coerenza più debole di Strong. Non era invece possibile eseguire richieste di lettura con un livello di coerenza sostitutivo superiore a quello predefinito dell'account. Un account con coerenza Eventual non poteva ricevere richieste di lettura con un livello di coerenza superiore a Eventual (che nei driver Apache Cassandra si traduce in TWO, THREE, LOCAL_QUORUM o QUORUM).

Azure Cosmos DB for Apache Cassandra ora semplifica la sostituzione della coerenza delle richieste di lettura con un valore superiore rispetto alla coerenza predefinita dell'account. Se, ad esempio, la coerenza predefinita nell'account Cosmos DB è impostata su Eventual (equivalente a One o ANY in Apache Cassandra), le richieste di lettura possono essere sostituite per singole richieste con LOCAL_QUORUM. La sostituzione garantisce che venga consultato un numero quorum di repliche all'interno dell'area specificata prima della restituzione del set di risultati, come richiesto da LOCAL_QUORUM.

Questa opzione evita anche la necessità di impostare una coerenza predefinita superiore a Eventual, quando questo livello di coerenza è necessario solo per le richieste di lettura.

Passaggi successivi

Altre informazioni sulla distribuzione globale e sui livelli di coerenza per Azure Cosmos DB: