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
, session
e 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.
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.
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
.
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.
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.
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.
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.
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.
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.
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.
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.