Cos'è la coerenza causale in Nosql

Pubblicato: 2022-12-13

I database NoSQL sono diventati sempre più popolari negli ultimi anni poiché le organizzazioni cercano alternative ai tradizionali database relazionali. Un vantaggio chiave dei database NoSQL è che possono fornire un elevato grado di flessibilità in termini di modalità di archiviazione e accesso ai dati. Tuttavia, questa flessibilità ha un costo e uno dei compromessi è che la coerenza causale spesso non è garantita. La coerenza causale è un modello di coerenza forte che viene spesso utilizzato nei sistemi distribuiti. In un sistema causalmente coerente, tutte le scritture causalmente correlate devono essere visualizzate nello stesso ordine da tutti i client. Ciò significa che se due client eseguono operazioni di scrittura correlate in modo causale, tali scritture devono essere visualizzate nello stesso ordine da tutti gli altri client. Il compromesso per questa flessibilità è che la coerenza causale spesso non è garantita nei database NoSQL. Ciò significa che se due client eseguono operazioni di scrittura che sono causalmente correlate, non vi è alcuna garanzia che tali scritture vengano visualizzate nello stesso ordine da tutti gli altri client. Ciò può portare a incoerenze nei dati archiviati nel database. Esistono numerosi fattori che possono contribuire alle incoerenze causali in un database NoSQL. Uno è l'uso della coerenza finale, che è un modello di coerenza che viene spesso utilizzato nei database NoSQL. In un sistema eventualmente coerente, le scritture potrebbero non essere immediatamente visibili a tutti i client, ma alla fine verranno propagate a tutte le repliche. Ciò significa che c'è una finestra temporale in cui le scritture possono essere viste fuori servizio da diversi client. Un altro fattore che può contribuire alle incoerenze causali è l'uso della risoluzione dei conflitti che vince l'ultimo scrittore. In un sistema last-writer-wins, quando due client eseguono operazioni di scrittura che sono in conflitto tra loro, la scrittura dal client che ha eseguito l'operazione per ultimo avrà la precedenza. Ciò può portare a incoerenze se l'ordine in cui vengono eseguite le scritture non è lo stesso su tutti i client. La risoluzione dei conflitti last-writer-wins viene spesso utilizzata nei sistemi che alla fine sono coerenti, in quanto può aiutare a garantire che la scrittura più recente sia quella visibile a tutti i client. Tuttavia, può anche portare a incoerenze se l'ordine in cui vengono eseguite le scritture non è lo stesso su tutti i client. In generale, il compromesso per la flessibilità dei database NoSQL è che non garantiscono la coerenza causale. Ciò significa che esiste il rischio di incoerenze nei dati archiviati

In questo articolo, dimostrerò come le garanzie di coerenza causale di MongoDB possono essere violate in tempo reale. La maggioranza viene utilizzata anche per risolvere il problema, con il primo tentativo di utilizzare le letture e le scritture della maggioranza. Successivamente, esamineremo intervalli di clock logici e sessioni caotiche in Mongo. Userò il driver Mongo C# per la codifica in questo caso, ma dipende interamente da me. La maggior parte dei membri del set di repliche ha riconosciuto i dati restituiti da una query in una lettura maggioritaria. L'idea di utilizzare una scrittura maggioritaria seguita da una lettura maggioritaria può sembrare una soluzione allettante al nostro problema Scrivi la tua scrittura. Quando la maggior parte delle scritture viene riconosciuta, ogni server secondario mantiene un'istantanea in memoria della maggior parte delle scritture più recenti.

A ogni oggetto viene assegnato un timestamp in più parti nel modello di coerenza causale , che viene implementato utilizzandolo. Questi timestamp sono archiviati in un vettore che contiene il numero di versione dell'oggetto in ogni replica.

C'è una definizione. La coerenza garantisce che tutti i processi osservino le operazioni commutative nello stesso ordine catturando qualsiasi potenziale relazione causale tra le operazioni. In altre parole, tutti i processi nel sistema hanno una comprensione comune di come eseguire le operazioni causalmente correlate.

Di seguito sono riportati i passaggi verso la coerenza sequenziale: a) ordine coerente delle scritture sequenziali; b) ordine coerente delle scritture sequenziali; e c) ordine coerente di scritture sequenziali. Quando si scrive in coerenza causale, è necessario mantenere le letture causalmente correlate nello stesso ordine.

Cos'è la coerenza in Nosql?

Cos'è la coerenza in Nosql?
Fonte immagine: https://slidesharecdn.com

Di conseguenza, i database NoSQL richiedono una quantità significativa di coerenza per mantenere un'elevata disponibilità. Non raggiungono una forte consistenza; piuttosto, portano a una coerenza a lungo termine. La mancata restituzione del risultato della scrittura più recente può verificarsi occasionalmente, poiché i datastore che garantiscono la funzionalità Base potrebbero non essere in grado di farlo.

L'implementazione di un archivio dati di documenti sarà molto più difficile da modificare rispetto all'implementazione di un modello relazionale. Inoltre, la complessità del refactoring dei dati in un archivio in transito è significativamente maggiore di quella delle semplici trasformazioni ETL di RDBMS. Gli sviluppatori e gli architetti che non sono consapevoli o non capiscono o temono di perdere il lavoro se commettono un errore perderanno questa opportunità. Suddivideranno le transazioni atomiche in pezzi logici piuttosto che ricordare che la replica e la latenza sono processi e, peggio, trascinare sistemi di terze parti nel processo. Alla fine sarà esternalizzato e qualcun altro continuerà a dirigere il dipartimento.

Le incoerenze nei database sono causate da una varietà di fattori, inclusi dati errati o incompleti, vincoli mancanti, trigger non validi o cascate configurate in modo errato. A causa di tutti questi problemi, nel database potrebbero essere memorizzati dati errati. Di conseguenza, possono esserci conseguenze significative per l'accuratezza e l'efficacia dell'analisi e del processo decisionale. Uno schema di database completo e coerente è il passo più importante per garantire l'accuratezza e la coerenza dei dati. Inoltre, uno schema ben definito assicurerà che i dati siano inseriti correttamente in un database e che le regole che governano i dati siano correttamente interpretate. Ciò consente all'analisi di riflettere accuratamente i dati nel database prevenendo le incoerenze.

Database Nosql non adatti per transazioni bancarie e bancomat

L'affidabilità del database non è così fluida con nosql come lo è con SQL perché la maggior parte di essi utilizza il modello di coerenza successivo. Di conseguenza, non sono adatti per transazioni come i prelievi bancari e bancomat, poiché a volte i dati potrebbero non essere sempre coerenti.

Cos'è la coerenza concorrente e causalmente correlata?

Cos'è la coerenza concorrente e causalmente correlata?
Fonte immagine: https://slideserve.com

La coerenza concorrente e causalmente correlata è un tipo di coerenza che esiste quando due o più eventi si verificano contemporaneamente e sono correlati tra loro. Questo tipo di coerenza è importante in molti campi, come la fisica e l'ingegneria, dove è necessario garantire che gli eventi avvengano in modo coerente.

Un sistema distribuito è costituito da molti nodi di elaborazione in cui i dati vengono condivisi e replicati. La coerenza è una proprietà del sistema distribuito che garantisce che i nodi e le repliche dispongano contemporaneamente della stessa visualizzazione dei dati. È un metodo sperimentale per mantenere l'ordine nelle operazioni causalmente correlate utilizzando una forma debole di coerenza. La principale distinzione tra coerenza causale e coerenza sequenziale è che la coerenza causale non richiede un ordine di grandezza totale. Un senso intuitivo di coerenza implica che le letture sono fresche solo quando le scritture sono causalmente dipendenti. Di seguito viene fornito un esempio di sistema distribuito, composto da quattro processi: P1, P2, P3 e P4.

È una proprietà che può essere calcolata prendendo il numero di processi che concordano sull'ordine delle operazioni che svolgono il compito di stabilire la causalità. Qualsiasi processo che soddisfi i seguenti requisiti si dice consistente: per qualsiasi coppia di processi P e Q, se P causa Q e Q causa R, allora P causa R in qualsiasi altro processo. È una misura del numero di processi che concordano sull'ordine in cui vengono eseguite tutte le operazioni causalmente correlate. Un processo è coerente se soddisfa i seguenti requisiti: P causa Q e Q causa R, quindi P causa R. Il requisito di coerenza è uno dei requisiti. Processi coerenti hanno maggiori probabilità di produrre le conclusioni corrette se utilizzati in modo coerente. La coerenza di un processo può essere misurata in vari modi. Un modo per esaminarlo è considerare quanti processi concordano sull'ordine in cui si verificano le operazioni causalmente correlate. Di conseguenza, esiste un indice di coerenza . L'indice di coerenza è una misura della coerenza con cui viene mantenuto un processo. Per essere coerente, un processo deve soddisfare i seguenti requisiti: per due processi qualsiasi, P causa Q e Q causa R, quindi P causa R così come Q e Q. L'indice di coerenza di un processo è una misura di quanto sia stabile. Se un processo soddisfa questi requisiti, si dice che è coerente con quanto segue: se P causa Q e Q causa R, P causa R per qualsiasi coppia di processi P e Q. Se un processo non soddisfa il requisito di coerenza, viene considerato incoerente. È più probabile che un processo incoerente si traduca in una conclusione errata. L'indice di coerenza può essere utilizzato per valutare la coerenza di un processo. È un metodo per misurare la coerenza di un processo e identificare i processi che producono conclusioni causali più accurate.

Coerenza causale vs coerenza finale

Esistono due tipi principali di coerenza nei sistemi distribuiti: coerenza causale e coerenza finale. La coerenza causale garantisce che se due eventi sono correlati, verranno visualizzati nello stesso ordine da tutti i processi. La coerenza finale garantisce che, dato un tempo sufficiente, tutti i processi vedranno lo stesso stato finale del sistema, anche se non vedono gli stessi stati intermedi.

Coerenza causale nel sistema distribuito

Un criterio di coerenza di coerenza può essere utilizzato per determinare la causalità [1] nei database distribuiti. Se un'operazione è causalmente correlata, ogni nodo di un sistema distribuito visualizza gli stessi dati nello stesso ordine in cui vengono letti e scritti.

Sono noti anche altri modelli di consistenza, come quelli eventuali e causali. Nei sistemi distribuiti, sono più comuni che nei database tradizionali. Un modello coerente è un modo elegante per dire che un sistema e i suoi utenti hanno un accordo coerente. Quando si verifica un'interazione, queste caratteristiche descrivono come si comporterà il sistema. Se il nostro sistema afferma di essere serializzabile, deve apparire come un'unica posizione globale con tutte le operazioni che appaiono a tutti i processi nel loro ordine globale, indipendentemente dalla posizione. È consentito interlacciare le operazioni come ritenuto opportuno dal sistema. Sebbene l'ordine reale del processo non sia garantito (secondo la definizione), lo è quando viene preservato un ordine di operazione.

È possibile che alcune operazioni sembrino persino avvenute anni fa. Il fatto che le operazioni (scrittura/scrittura) siano causalmente correlate significa che l'ordine in cui sono distribuite dovrebbe essere uniforme per tutti i processi. Non c'è garanzia di ordine perché entrambi i processi scrivono valori diversi in x, come mostrato nell'immagine qui sotto. Quando smettiamo di scrivere nuove scritture, il sistema alla fine convergerà in uno stato più coerente. L' eventuale garanzia di coerenza afferma che non verranno apportati aggiornamenti (scritture) al sistema e tutti i client saranno in grado di vedere esattamente come funziona. Se scrivi caratteri monotoni su un account da $ 100, ti verranno addebitati $ 165. Quando un client aggiorna un elemento nella lettura delle tue scritture (RYW), il valore di tale elemento viene restituito al termine dell'aggiornamento. La PRAM è un tipo di memoria della pipeline che consente ai processi di esaminare tutte le operazioni da un singolo processo allo stesso modo.

Consistenza finale di MongoDB

Significa che i dati che stai leggendo potrebbero non essere coerenti al momento, ma alla fine lo saranno. Ciò si ottiene utilizzando uno qualsiasi dei readPreferences in grado di leggere da un oggetto secondario.

In MongoDB, i dati primari vengono sempre replicati in modo asincrono, mentre i dati secondari vengono replicati contemporaneamente. Il valore predefinito di MongoDB è w1: (scrittura corretta su primary) e j:false per l'inserimento nel journal. A causa della replica asincrona , quando una partizione viene partizionata sul lato di minoranza o perde il suo primario, di solito si verifica una perdita di coerenza. Durante la partizione, possiamo regolare i valori w e j per ottenere diversi livelli di latenza e garanzie coerenti su tutta la linea. Quando non c'è una partizione, la velocità di scrittura diminuisce e quando c'è una scrittura, la scrittura non attende la replica. Se stai usando una combinazione di w &j, la lettura/non lettura dai secondari può avere un impatto significativo sui livelli di coerenza. MongoDB ha quattro diversi livelli di coerenza.

Il momento migliore per scrivere è quando non ci sono partizioni e tutti i nodi sono attivi; MongoDB è coerente e ha una bassa latenza. Quando l'agente primario è stato perso e la partizione è stata riempita, è il tipo più comune di scrittura che fallisce (errore writeTimeout). Abbiamo la disponibilità Best Effort in MongoDB perché, indipendentemente da come partizioniamo il cluster, ne perderemo sempre una parte, almeno una percentuale. In CAP e CP/EC del teorema PACELC, w:majority, j:true e READ from primary possono essere usati solo per classificare MongoDB come CP.

In che modo MongoDB mantiene la coerenza?

Più client possono leggere e scrivere gli stessi dati MongoDB contemporaneamente. MongoDB utilizza il blocco e la gestione della concorrenza per impedire ai suoi client di modificare gli stessi dati contemporaneamente. Quando scriviamo su un singolo documento, lo scriviamo completamente o non lo scriviamo affatto e il cliente vede sempre risultati coerenti.

Che cos'è la coerenza finale in Nosql?

Il concetto di coerenza finale nella modellazione dei dati è garantire che le modifiche apportate ai database NoSQL distribuiti su più nodi si riflettano in tutti. Di conseguenza, la stessa query del database restituirà gli stessi risultati nel tempo.