Zattera o no? La soluzione migliore per la consistenza dei dati nei database cloud-nativi
Immagine di copertina
Questo articolo è stato scritto da Xiaofan Luan e trascritto da Angela Ni.
La replica basata sul consenso è una strategia ampiamente adottata in molti database distribuiti cloud-native. Tuttavia, presenta alcune carenze e non è sicuramente la soluzione migliore.
Questo post si propone di spiegare innanzitutto i concetti di replica, consistenza e consenso in un database cloud-nativo e distribuito, quindi di chiarire perché gli algoritmi basati sul consenso come Paxos e Raft non sono la soluzione ideale e infine di proporre una soluzione alla replica basata sul consenso.
Vai a:
- Capire la replica, la consistenza e il consenso
- Replica basata sul consenso
- Una strategia di replica dei log per database cloud-nativi e distribuiti
- Sommario
Capire la replica, la coerenza e il consenso
Prima di approfondire i pro e i contro di Paxos e Raft e di proporre la strategia di replica dei log più adatta, dobbiamo innanzitutto demistificare i concetti di replica, consistenza e consenso.
Si noti che questo articolo si concentra principalmente sulla sincronizzazione di dati/log incrementali. Pertanto, quando si parla di replica di dati/log, si fa riferimento solo alla replica di dati incrementali e non di dati storici.
La replica
La replica è il processo di creazione di più copie di dati e di memorizzazione in dischi, processi, macchine, cluster, ecc. diversi, allo scopo di aumentare l'affidabilità dei dati e accelerare le interrogazioni. Poiché nella replica i dati vengono copiati e memorizzati in più posizioni, i dati sono più affidabili in caso di guasti ai dischi, guasti alle macchine fisiche o errori dei cluster. Inoltre, le repliche multiple dei dati possono aumentare le prestazioni di un database distribuito, accelerando notevolmente le interrogazioni.
Esistono diverse modalità di replica, come la replica sincrona/asincrona, la replica con consistenza forte/eventuale, la replica leader-follower/decentrata. La scelta della modalità di replica ha un effetto sulla disponibilità e sulla consistenza del sistema. Pertanto, come proposto nel famoso teorema CAP, l'architetto di un sistema deve trovare un compromesso tra consistenza e disponibilità quando la partizione della rete è inevitabile.
Consistenza
In breve, la consistenza in un database distribuito si riferisce alla proprietà che garantisce che ogni nodo o replica abbia la stessa visione dei dati quando scrive o legge i dati in un determinato momento. Per un elenco completo dei livelli di consistenza, leggere il documento qui.
Per chiarire, qui si parla di consistenza come nel teorema CAP, non di ACID (atomicità, consistenza, isolamento, durabilità). La consistenza nel teorema CAP si riferisce a ogni nodo del sistema che ha gli stessi dati, mentre la consistenza in ACID si riferisce a un singolo nodo che applica le stesse regole a ogni potenziale commit.
In generale, i database OLTP (online transaction processing) richiedono una forte coerenza o linearizzazione per garantire che:
- Ogni lettura possa accedere agli ultimi dati inseriti.
- Se dopo una lettura viene restituito un nuovo valore, tutte le letture successive, indipendentemente dallo stesso client o da client diversi, devono restituire il nuovo valore.
L'essenza della linearizzazione è garantire la ricorrenza di più repliche di dati: una volta che un nuovo valore viene scritto o letto, tutte le letture successive possono visualizzare il nuovo valore fino a quando il valore non viene sovrascritto in seguito. Un sistema distribuito che fornisce la linearizzazione può risparmiare agli utenti la fatica di tenere d'occhio più repliche e può garantire l'atomicità e l'ordine di ogni operazione.
Il consenso
Il concetto di consenso viene introdotto nei sistemi distribuiti perché gli utenti desiderano che i sistemi distribuiti funzionino come i sistemi autonomi.
In parole povere, il consenso è un accordo generale su un valore. Ad esempio, Steve e Frank volevano mangiare qualcosa. Steve ha suggerito di mangiare dei panini. Frank ha accettato il suggerimento di Steve ed entrambi hanno mangiato dei panini. Hanno raggiunto un consenso. Più precisamente, un valore (i panini) proposto da uno dei due è accettato da entrambi ed entrambi compiono azioni basate sul valore. Allo stesso modo, il consenso in un sistema distribuito significa che quando un processo propone un valore, tutti gli altri processi del sistema concordano e agiscono in base a questo valore.
Il consenso
Replica basata sul consenso
I primi algoritmi basati sul consenso sono stati proposti nel 1988 insieme alla replicazione viewstamped. Nel 1989, Leslie Lamport propose Paxos, un algoritmo basato sul consenso.
Negli ultimi anni, abbiamo assistito alla diffusione di un altro algoritmo basato sul consenso: Raft. È stato adottato da molti database NewSQL mainstream come CockroachDB, TiDB, OceanBase, ecc.
In particolare, un sistema distribuito non supporta necessariamente la linearizzazione anche se adotta una replica basata sul consenso. Tuttavia, la linearizzabilità è il prerequisito per la costruzione di database distribuiti ACID.
Quando si progetta un sistema di database, si deve prendere in considerazione l'ordine di commit dei registri e delle macchine a stati. È inoltre necessaria una maggiore cautela per mantenere il leader lease di Paxos o Raft e per evitare uno split-brain in caso di partizione della rete.
Macchina a stati della replica Raft
Pro e contro
In effetti, Raft, ZAB e il protocollo di log basato sul quorum di Aurora sono tutte varianti di Paxos. La replica basata sul consenso presenta i seguenti vantaggi:
- Sebbene la replica basata sul consenso si concentri maggiormente sulla consistenza e sulla partizione della rete nel teorema CAP, fornisce una disponibilità relativamente migliore rispetto alla tradizionale replica leader-follower.
- Raft è un'innovazione che ha semplificato notevolmente gli algoritmi basati sul consenso. Esistono molte librerie Raft open-source su GitHub (ad esempio, sofa-jraft).
- Le prestazioni della replica basata sul consenso possono soddisfare la maggior parte delle applicazioni e delle aziende. Con la copertura di SSD ad alte prestazioni e NIC (scheda di interfaccia di rete) da gigabyte, l'onere di sincronizzare più repliche è alleggerito, rendendo gli algoritmi Paxos e Raft il mainstream del settore.
Un'idea sbagliata è che la replica basata sul consenso sia la soluzione migliore per ottenere la coerenza dei dati in un database distribuito. Tuttavia, questa non è la verità. Le sfide in termini di disponibilità, complessità e prestazioni che l'algoritmo basato sul consenso deve affrontare gli impediscono di essere la soluzione perfetta.
Disponibilità compromessa L'algoritmo Paxos o Raft ottimizzato dipende fortemente dalla replica leader, che ha una scarsa capacità di contrastare i guasti grigi. Nella replica basata sul consenso, una nuova elezione della replica leader non ha luogo finché il nodo leader non risponde per un lungo periodo. Pertanto, la replica basata sul consenso non è in grado di gestire situazioni in cui il nodo leader è lento o si verifica un thrashing.
Elevata complessità Sebbene esistano già molti algoritmi estesi basati su Paxos e Raft, l'emergere di Multi-Raft e Parallel Raft richiede ulteriori considerazioni e test sulla sincronizzazione tra log e macchine a stati.
Prestazioni compromesse In un'era cloud-native, lo storage locale viene sostituito da soluzioni di storage condivise come EBS e S3 per garantire l'affidabilità e la coerenza dei dati. Di conseguenza, la replica basata sul consenso non è più un obbligo per i sistemi distribuiti. Inoltre, la replica basata sul consenso comporta il problema della ridondanza dei dati, poiché sia la soluzione che EBS hanno più repliche.
Per la replica multi-datacenter e multi-cloud, la ricerca della coerenza compromette non solo la disponibilità ma anche la latenza, con un conseguente calo delle prestazioni. Pertanto, la linearizzazione non è un requisito indispensabile per la tolleranza ai disastri di più data center nella maggior parte delle applicazioni.
Una strategia di replica dei log per database cloud-nativi e distribuiti
È innegabile che gli algoritmi basati sul consenso, come Raft e Paxos, siano ancora gli algoritmi principali adottati da molti database OLTP. Tuttavia, osservando gli esempi del protocollo PacificA, di Socrates e di Rockset, possiamo notare che la tendenza si sta spostando.
Esistono due principi fondamentali per una soluzione che possa servire al meglio un database distribuito cloud-native.
1. La replica come servizio
È necessario un microservizio separato dedicato alla sincronizzazione dei dati. Il modulo di sincronizzazione e quello di archiviazione non devono più essere strettamente accoppiati all'interno dello stesso processo.
Ad esempio, Socrates disaccoppia storage, log e computing. Esiste un servizio di log dedicato (servizio XLog al centro della figura sottostante).
Architettura di Socrates
Il servizio XLog è un servizio individuale. La persistenza dei dati è ottenuta con l'aiuto di uno storage a bassa latenza. La zona di atterraggio di Socrates è incaricata di mantenere tre repliche a velocità accelerata.
Servizio Socrates XLog
Il nodo leader distribuisce i log al log broker in modo asincrono e scarica i dati su Xstore. La cache SSD locale può accelerare la lettura dei dati. Una volta che il flush dei dati ha avuto successo, i buffer nella landing zone possono essere puliti. Ovviamente, tutti i dati di log sono suddivisi in tre livelli: landing zone, SSD locale e XStore.
2. Principio della bambola russa
Un modo per progettare un sistema è seguire il principio della bambola russa: ogni livello è completo e perfettamente adatto a ciò che fa, in modo che gli altri livelli possano essere costruiti sopra o intorno ad esso.
Quando progettiamo un database cloud-native, dobbiamo sfruttare abilmente altri servizi di terze parti per ridurre la complessità dell'architettura del sistema.
Sembra che non si possa fare a meno di Paxos per evitare il single point failure. Tuttavia, possiamo semplificare notevolmente la replica dei log affidando l'elezione del leader a Raft o ai servizi Paxos basati su Chubby, Zk e etcd.
Ad esempio, l'architettura di Rockset segue il principio della bambola russa e utilizza Kafka/Kineses per i log distribuiti, S3 per lo storage e la cache SSD locale per migliorare le prestazioni delle query.
Architettura di Rockset
L'approccio di Milvus
La consistenza sintonizzabile in Milvus è di fatto simile alla lettura di follower nella replica basata sul consenso. La funzione di lettura follower si riferisce all'utilizzo di repliche follower per eseguire operazioni di lettura dei dati con la premessa di una forte coerenza. Lo scopo è quello di migliorare il throughput del cluster e ridurre il carico sul leader. Il meccanismo alla base della funzione di lettura follower consiste nell'interrogare l'indice di commit dell'ultimo log e nel fornire un servizio di query finché tutti i dati dell'indice di commit non vengono applicati alle macchine a stati.
Tuttavia, il progetto di Milvus non ha adottato la strategia follower. In altre parole, Milvus non interroga l'indice di commit ogni volta che riceve una richiesta di interrogazione. Invece, Milvus adotta un meccanismo simile alla filigrana di Flink, che notifica al nodo di interrogazione la posizione dell'indice di commit a intervalli regolari. Il motivo di questo meccanismo è che gli utenti di Milvus di solito non hanno grandi esigenze di coerenza dei dati e possono accettare un compromesso nella visibilità dei dati per migliorare le prestazioni del sistema.
Inoltre, Milvus adotta anche microservizi multipli e separa l'archiviazione dall'elaborazione. Nell'architettura di Milvus, per lo storage vengono utilizzati S3, MinIo e Azure Blob.
Architettura Milvus
Sintesi
Oggi un numero crescente di database cloud-native fa della replica dei log un servizio individuale. In questo modo, è possibile ridurre il costo dell'aggiunta di repliche di sola lettura e di repliche eterogenee. L'uso di più microservizi consente di utilizzare rapidamente un'infrastruttura matura basata sul cloud, cosa impossibile per i database tradizionali. Un singolo servizio di log può affidarsi alla replica basata sul consenso, ma può anche seguire la strategia della bambola russa per adottare vari protocolli di consistenza insieme a Paxos o Raft per ottenere la linearizzazione.
Riferimenti
- Lamport L. Paxos reso semplice[J]. ACM SIGACT News (Distributed Computing Column) 32, 4 (numero intero 121, dicembre 2001), 2001: 51-58.
- Ongaro D, Ousterhout J. Alla ricerca di un algoritmo di consenso comprensibile[C]//2014 USENIX Annual Technical Conference (Usenix ATC 14). 2014: 305-319.
- Oki B M, Liskov B H. Viewstamped replication: A new primary copy method to support highly-available distributed systems[C]//Proceedings of the seventh annual ACM Symposium on Principles of distributed computing. 1988: 8-17.
- Lin W, Yang M, Zhang L, et al. PacificA: Replication in log-based distributed storage systems[J]. 2008.
- Verbitski A, Gupta A, Saha D, et al. Amazon aurora: On avoiding distributed consensus for i/os, commits, and membership changes[C]//Proceedings of the 2018 International Conference on Management of Data. 2018: 789-796.
- Antonopoulos P, Budovski A, Diaconu C, et al. Socrates: The new sql server in the cloud[C]//Proceedings of the 2019 International Conference on Management of Data. 2019: 1743-1756.
- Capire la replica, la coerenza e il consenso
- Replica basata sul consenso
- Una strategia di replica dei log per database cloud-nativi e distribuiti
- Sintesi
- Riferimenti
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word