Servire un'ampia base di utenti con dati affidabili, coerenti e a bassa latenza è una sfida molto difficile per qualsiasi team di backend. In Ledger, abbiamo fatto la scelta strategica di ospitare i nostri servizi dati core blockchain. Non facendo affidamento su terze parti, possiamo gestire noi stessi i dati dei nostri clienti, garantendo che i processi sottostanti rispettino le nostre linee guida di sicurezza e gli obiettivi del livello di servizio (SLO) orientati alle prestazioni.
Ma questa strategia comporta anche una serie di sfide.
La nostra prima sfida è migrare questi servizi fondamentali di fornitura di dati lontano da strumenti noSQL interessanti e brillanti. In questo articolo approfondirò il motivo per cui abbiamo preso questa difficile decisione, le complessità che abbiamo incontrato e i benefici che abbiamo ottenuto.
L'obiettivo di questo articolo è mostrare gli aspetti tecnici che ci hanno portato a scegliere PostgreSQL come nostro nuovo livello di archiviazione di base per i dati blockchain.
Approfondimento sui dati Blockchain
I dati blockchain hanno diverse caratteristiche chiave.
Innanzitutto, è in continua crescita e non viene mai cancellato nulla da esso. Tuttavia, in pratica, sebbene la maggior parte della blockchain sia immutabile, la parte più giovane della blockchain potrebbe cambiare a causa di conflitti che devono essere risolti. Infatti, poiché la catena è una rete peer to peer, possono coesistere temporaneamente più blocchi legittimi. Di solito, il più vecchio viene eliminato, determinando quella che chiamiamo riorganizzazione. Per farla breve, i dati sono divisi tra una coda fredda immutabile e uno stato della testa che cambia raramente.
Il problema che stiamo cercando di risolvere è che, sebbene le blockchain siano ottime per avere dati bizantini con tolleranza agli errori, sono meno efficaci per suddividerli e tagliarli su molti assi. Ovvero, ottenere l'elenco delle operazioni che hanno interessato un account è molto difficile. Anche ottenere il saldo del conto su una blockchain come Bitcoin è una sfida quando non si dispone già dell'elenco delle transazioni.
Per superare queste sfide, Ledger Explorer Services indicizza l'intera blockchain. Si tratta di un servizio ampio, critico e sensibile alle prestazioni, completamente scritto in Scala, utilizzando il metodo effetto gatti autonomia ad alte prestazioni. Siamo oltre i 10k rps su bitcoin, pur mantenendo una latenza tail p95 inferiore a 100ms. Stiamo anche reclutando .
Un po 'di storia
All'inizio della nostra storia, molto prima che entrassi in azienda, il livello di servizio dati Ledger era gestito da un database Neo4j incorporato. Ciascuna scatola di servizio indicizzava i propri dati e li forniva localmente, il che causava molti problemi.
La coerenza dei dati tra le istanze non era garantita e la dimensione dello stato che doveva essere indicizzato, combinata con l'utilizzo del disco neo4j e della ram, non era scalabile. Questo problema è solo peggiorato con la crescita dell’azienda, rendendo sempre più difficile la creazione di nuove istanze.
Cassandra è stato quindi scelto come motore principale di questa nuova configurazione: si tratta di un database clusterizzato e scalabile orizzontalmente che si trova sul lato AP del teorema CAP. Risolve i problemi relativi alla condivisione dei dati e consente una chiara separazione tra l'indicizzazione, la componente blockchain e i server API headless.
Ma che senso ha avere a disposizione l'intero stato storico se poi non riusciremo mai a leggerlo?
Per quanto riguarda il nostro caso d'uso, i dati storici grezzi sono raramente necessari perché da essi è possibile aggregare lo stato dell'account del nostro utente. Ciò ci ha portato a mettere in discussione la soluzione di archiviazione dei dati esistente che si basa sul database distribuito Cassandra.
Il volume di dati che dobbiamo archiviare per blockchain, sebbene nell’ordine dei terabyte, non è ciò che si può chiamare “big data”. Inoltre, la parte di if che verrà utilizzata per rispondere alla maggior parte delle domande (ovvero The hot path) è ancora più piccola. Al giorno d'oggi è possibile trovare facilmente server hardware di base con più di 16 TB di spazio di archiviazione SSD NVMe. Il ridimensionamento verticale è uno strumento molto potente, così come lo è un database relazionale.
Infine, il problema principale che abbiamo riscontrato con l'attuale configurazione di Cassandra non era né il modello di archiviazione dispendioso né il caso d'uso dei dati inadeguato, ma la mancanza di facilità d'uso per gli sviluppatori. Lo sviluppo di una nuova funzionalità basata sui dati su Cassandra si è rivelato un dispendio di tempo inutilmente. Ci siamo impegnati per implementare ogni nuovo asse su cui dobbiamo fornire dati.
Data l'esperienza del nostro team nelle capacità di modellazione dei dati e nella competenza SQL, PostgreSQL era il candidato perfetto. Questa soluzione è testata in battaglia, robusta, facile da estendere, il che la rende la scelta ideale.
Perché abbiamo scelto SQL invece di NoSQL:
- Legge/scrive i saldi: il caso d'uso dei dati blockchain è stato fortemente distorto rispetto alle letture piuttosto che alle scritture (la blockchain scrive pochissimi dati a una velocità molto ragionevole, anche per una blockchain come Polygon). Cassandra ha la capacità di assorbire una quantità molto elevata di scritture: il percorso di lettura lo è effettivamente più a lungo rispetto al percorso di scrittura.
- Supporto per l'indicizzazione: Gli indici sono un componente chiave di un DBMS per rispondere a domande e nuovi casi aziendali o opportunità. Cassandra ha un supporto limitato per l'indicizzazione. Gli indici sono efficaci solo se la query specifica già un modo per limitare la partizione su cui verrà eseguita la query. Paghiamo qui il costo per avere un distribuito arbitrariamente Banca dati. Il supporto PostgreSQL per gli indici è efficiente, estensibile e all'avanguardia.
- Supporto di aggregazione: Stesso caso per l'aggregazione; poiché Cassandra non consente l'aggregazione multi-partizione e non tollera alcuna clausola GROUP BY nel suo linguaggio di query, il suo supporto è piuttosto carente. PostgreSQL propone un ampio supporto di aggregazione, anche su tipi di dati esotici come intervalli e blob jsonb.
- Modellazione dei dati: Cassandra è molto, molto limitante nel modo in cui è possibile la modellazione dei dati. È necessario creare una tabella per quasi ogni richiesta a cui si desidera rispondere e i dati devono essere denormalizzati in righe di grandi dimensioni (utilizzando completamente la ampio negozio di colonne aspetto di C* e anche il fatto che gli scrittori costano pochissimo). PostgreSQL ci consente di sfruttare l’aspetto relazionale della blockchain (chiamate, transazioni, blocchi) e di risparmiare spazio su disco, incoraggiando il riutilizzo dei dati.
- Query e controlli ad hoc: Essere in grado di utilizzare lo standard completo di SQL ed eseguire query arbitrarie significa che possiamo esplorare e cercare la potenziale causa principale del bug o disporre di dati esplorativi per casi d'uso futuri. Possiamo davvero utilizzare il database come uno strumento interattivo e intelligente piuttosto che come uno stupido archivio. Farlo su Cassandra senza un cluster di calcolo di analisi esteso e costoso come Presto, Spark, ecc. (e poiché operiamo su server bare metal, non abbiamo accesso a strumenti di analisi dei dati distribuiti facilmente generati come EMR).
- Utilizzo dello storage: Il presupposto di Cassandra è che lo storage sia molto economico e che il cluster possa essere facilmente esteso con nuove macchine. Ciò significa che tutte le limitazioni sia sugli indici che sulle aggregazioni dovranno essere pagate con lo stoccaggio. Nessun indice efficiente a livello globale e il supporto del join significa che dobbiamo denormalizzare e archiviare una copia dell'intera tabella per ciascun asse che vogliamo interrogare. PostgreSQL ci risparmia terabyte di spazio di archiviazione.
- Consistenza: Poiché Cassandra è un database distribuito e orientato agli AP (la comunicazione avviene tramite pettegolezzi tra i nodi), la coerenza è solo eventuale in termini di scritture. È possibile ottimizzare la politica di coerenza di ciascuna istruzione sia per le letture che per le scritture, ma l'obiettivo di questo database non è mai stato quello di avere una coerenza elevata. PostgreSQL ha una lunga storia di utilizzo per missioni critiche ed è altamente resiliente. Essere centralizzati significa anche che non vi è alcuna rete coinvolta nel percorso di scrittura.
- Transazioni e MVCC:
- Transazioni: Cassandra supporta solo transazioni leggere sulle query DML. È possibile applicare alcuni batch (doc) ma ci sono numerosi avvertimenti, vale a dire che le righe devono trovarsi nello stesso server (= partizione) per non avere prestazioni orrende.
- MVCC: Cassandra supporta il timestamp delle righe ma l'MVCC completo non è garantito. Una compattazione può cancellare i dati obsoleti e non c'è modo di dire a C* che non dovrebbe (come ad esempio con una transazione in PG).
- PostgreSQL supporta un potente modello MVCC che garantisce un percorso di lettura coerente per i nostri utenti.
- Tooling: PostgreSQL dispone di molti altri strumenti ampiamente utilizzati per gestire facilmente il database. Inoltre, uno strumento come Vola via garantisce il mantenimento di un forte controllo delle versioni dello schema del database. L'abbiamo già integrato con successo con la nostra base di codice. Non esiste un equivalente con questo livello di maturità su Cassandra.
- Scalabilità orizzontale: Questo è il punto di forza di Cassandra. Basta aggiungere più macchine man mano che i tuoi dati si espandono. Nessun equivalente per PostgreSQL poiché lo sharding e il partizionamento devono essere eseguiti manualmente.
Come intendiamo crescere
Come abbiamo visto, l'unico svantaggio dell'utilizzo di una configurazione Postgres è il ridimensionamento sia in lettura che in archiviazione. Cosa possiamo fare per superare questa limitazione?
Il primo strumento efficace che abbiamo è separare ogni protocollo o blockchain che supportiamo nel proprio database, in modo che possa essere scalato in modo appropriato in base al volume e al traffico. La segmentazione per dominio aziendale garantisce un primo livello di scalabilità.
Approfondendo ulteriormente questo concetto, possiamo anche segmentare i dati storici freddi in una partizione temporale. Le ultime versioni di Postgres hanno migliorato molto l'usabilità delle tabelle partizionate, che potrebbero consentire di spostare i dati senza problemi attraverso un cluster di macchine. Ad esempio, potremmo utilizzare macchine più economiche con meno potenza di calcolo per ospitare la maggior parte dei dati storici, mantenendo al contempo robusti colossi impilati in RAM al servizio degli utenti per ospitare tabelle aggregate e le ultime operazioni dell'utente.
Questo approccio funziona molto bene nel nostro caso d'uso perché non sono presenti chiavi esterne con partizioni incrociate nell'archivio storico (tutto è in definitiva collegato al blocco). Dal punto di vista del server principale, è possibile accedere in modo trasparente ai dati storici anche utilizzando il partizionamento e l'estensione postgres_fdw.
Per contribuire a mettere in atto tutto questo, abbiamo anche esaminato l'estensione TimescaleDB. Questa estensione aggiunge molte funzionalità ai postgre di base e la maggior parte di queste si adatta perfettamente ai nostri casi d'uso:
- Partizionamento automatico delle tabelle in base a una colonna di tipo temporale (nel nostro caso, lo adattiamo prendendo come riferimento l'altezza della blockchain).
- Compressione automatica, compatibile con il tipo di dati e basata su colonne dei blocchi più vecchi. Ciò garantisce un rapporto di compressione quasi perfetto utilizzando algoritmi all'avanguardia su dati molto simili.
- Aggregazione efficiente basata su intervalli di tempo per calcolare facilmente saldi storici e grafici di dati di mercato.
Siamo solo all'inizio della sperimentazione relativa allo storage e questo apre molti casi d'uso. Prova di concetto utilizzando una piccola quantità di dati (~ 10 blocchi sulla rete principale di Ethereum, quindi circa 2 giorni di dati) ha mostrato una riduzione dello spazio su disco fino al 40%.
Come abbiamo visto, il volume dei dati, a patto di utilizzare la giusta strategia, non è un problema. Ma come adattarci alle dimensioni della nostra base utenti?
Abbiamo già un bel vantaggio qui: indicizziamo tutti i dati blockchain. Pertanto, lo spazio di archiviazione necessario non crescerà con il numero di utenti, ma con la dimensione totale della blockchain. Le ottimizzazioni di archiviazione e lettura sono totalmente ortogonali nella loro risoluzione.
Questa configurazione, combinata con la necessità di scrittura molto bassa in proporzione al volume di lettura che deve essere servito, è la configurazione da sogno per un modello di replica di classificazione leader-follower. Per migliorare ulteriormente le prestazioni e il throughput, possiamo anche posizionare le repliche di lettura postgres sulle stesse macchine dei server API e sfruttare i socket del dominio UNIX per saltare i viaggi di andata e ritorno della rete.
Ecco un esempio di una strategia di replica dei dati che potremmo utilizzare per ridimensionare le nostre letture. Le caselle grigio chiaro rappresentano i singoli server. Qui possiamo vedere che i pod API sono direttamente posizionati insieme alle repliche dei dati più importanti per garantire un tempo di trasferimento minimo tra lo spazio di archiviazione e gli utenti. Le istanze di archivio descritte in precedenza non sono rappresentate per non complicare troppo lo schema.
Osservazioni conclusive
Essendo un utente di Cassandra di lunga data, voglio sottolineare che si tratta di un ottimo database nel suo design, che si adatta a un'ampia varietà di applicazioni. Sfortunatamente, la scelta fatta da Ledger di utilizzarlo è stata fatta su un caso di utilizzo dei dati che non si è mai materializzato.
La produttività del nostro team è stata influenzata e, in attesa delle sfide che dobbiamo risolvere, abbiamo scelto di stringere i denti e di non cadere nella fallacia dei costi sommersi.
In molti casi, i tuoi dati non sono big data. Gestire la distribuzione dei dati non è un compito difficile nella maggior parte dei casi e i compromessi di un database distribuito completo devono essere considerati attentamente. La considerazione chiave è l'esperienza dello sviluppatore in quanto consente di risparmiare tempo prezioso per creare qualsiasi altra cosa. Questo è il caso d'uso reale in cui dobbiamo investire molto.
- Distribuzione di contenuti basati su SEO e PR. Ricevi amplificazione oggi.
- PlatoAiStream. Intelligenza dei dati Web3. Conoscenza amplificata. Accedi qui.
- Coniare il futuro con Adryenn Ashley. Accedi qui.
- Acquista e vendi azioni in società PRE-IPO con PREIPO®. Accedi qui.
- Fonte: https://www.ledger.com/blog/serving-web3-at-web2-scale
- :ha
- :È
- :non
- $ SU
- 10
- 10K
- 20
- a
- capacità
- capace
- accesso
- accessibile
- Il mio account
- operanti in
- effettivamente
- adattare
- aggiungere
- Aggiunge
- aderire
- Vantaggio
- aggregazione
- Algoritmi
- Tutti
- consentire
- consente
- già
- anche
- Sebbene il
- quantità
- an
- .
- analitica
- ed
- rispondere
- in qualsiasi
- nulla
- api
- applicazioni
- applicato
- approccio
- appropriatamente
- Archivio
- SONO
- in giro
- Arte
- articolo
- AS
- aspetto
- aspetti
- assunzione
- At
- disponibile
- consapevole
- lontano
- ASSI
- Axis
- BACKEND
- Equilibrio
- saldi
- base
- basato
- Linea di base
- BE
- perché
- stato
- prima
- Inizio
- Behemoth
- essendo
- vantaggi
- fra
- Big
- Big Data
- Po
- Bitcoin
- Bloccare
- blockchain
- dati blockchain
- blockchains
- Blocchi
- entrambi
- Scatola
- scatole
- Porta
- Insetto
- costruire
- affari
- ma
- by
- chiamata
- Bandi
- Materiale
- candidato
- berretto
- attentamente
- Custodie
- casi
- Causare
- ha causato
- centralizzata
- catena
- Challenge
- sfide
- impegnativo
- il cambiamento
- cambiando
- economico
- più economico
- macchine più economiche
- scegliere
- Scegli
- ha scelto
- scelto
- pulire campo
- Cluster
- codice
- base del codice
- freddo
- Colonna
- combinato
- merce
- Comunicazione
- azienda
- complessità
- componente
- Calcolare
- concetto
- concetti
- considerazione
- considerato
- coerente
- Froids
- Nucleo
- Costo
- potuto
- creato
- critico
- Corrente
- dati
- analisi dei dati
- condivisione dei dati
- memorizzazione dei dati
- Banca Dati
- Giorni
- decisione
- descritta
- Design
- Costruttori
- in via di sviluppo
- difficile
- direttamente
- lo sporco
- distribuito
- distribuzione
- Diviso
- do
- effettua
- fare
- dominio
- Dont
- svantaggio
- hotel
- autista
- dovuto
- e
- ogni
- facilmente
- facile
- bordo
- Efficace
- efficiente
- altro
- incorporato
- enfatizzare
- enable
- incoraggiando
- accrescere
- garantire
- assicura
- assicurando
- Equivalente
- eccetera
- Ethereum
- RETE PRINCIPALE DI ETHEREUM
- Anche
- eventuale
- EVER
- Ogni
- qualunque cosa
- esempio
- esistente
- Esotico
- espande
- esperienza
- competenza
- esplora
- esploratore
- estendere
- estensione
- estensivo
- fatto
- Autunno
- caratteristica
- Caratteristiche
- pochi
- Trovare
- Nome
- in forma
- Nel
- estero
- Avanti
- cordialità
- da
- pieno
- a tutti gli effetti
- completamente
- funzionalità
- ulteriormente
- futuro
- ottenere
- dato
- Globalmente
- scopo
- andando
- grafici
- grigio
- grande
- Gruppo
- Crescere
- Crescita
- garantito
- linee guida
- ha avuto
- Hard
- Hardware
- Avere
- avendo
- capo
- pesantemente
- altezza
- Aiuto
- qui
- Alta
- vivamente
- storico
- host
- HOT
- più caldo
- Come
- Tutorial
- Tuttavia
- HTML
- HTTPS
- i
- ideale
- if
- immutabile
- impattato
- Implementazione
- migliorata
- in
- sempre più
- Index
- Indici
- esempio
- integrato
- interattivo
- ai miglioramenti
- Investire
- coinvolto
- problema
- sicurezza
- IT
- SUO
- join
- congiunto
- jpg
- ad appena
- conservazione
- Le
- Tasti
- Genere
- Dipingere
- Lingua
- grandi
- Latenza
- con i più recenti
- strato
- Guidato
- Ledger
- legittimo
- meno
- Livello
- Leva
- leggera
- leggero
- piace
- limitazione
- limiti
- Limitato
- Lista
- piccolo
- a livello locale
- Lunghi
- guardò
- cerca
- lotto
- Basso
- macchine
- fatto
- Principale
- mainnet
- mantenere
- Maggioranza
- Fare
- gestire
- gestione
- manualmente
- molti
- Rappresentanza
- Dati di mercato
- maturità
- max-width
- Maggio..
- si intende
- metallo
- migrare
- minimo
- missioni
- modello
- modellismo
- Scopri di più
- Inoltre
- maggior parte
- cambiano
- molti
- devono obbligatoriamente:
- cioè
- quasi
- Bisogno
- di applicazione
- esigenze
- Nessuno dei due
- Rete
- mai
- New
- bello
- no
- nodi
- Niente
- numero
- numerose
- Obiettivi d'Esame
- of
- on
- ONE
- esclusivamente
- operare
- Operazioni
- Opportunità
- or
- minimo
- nostro
- noi stessi
- ancora
- Superare
- proprio
- pagato
- parte
- parti
- sentiero
- Cartamodello
- Paga le
- pera
- peer to peer
- perfetta
- performance
- prospettiva
- posto
- piano
- Platone
- Platone Data Intelligence
- PlatoneDati
- baccelli
- punto
- politica
- Poligono
- possibile
- Postgresql
- potenziale
- energia
- potente
- pratica
- Problema
- i processi
- della produttività
- prova
- proporzione
- propone
- protocollo
- comprovata
- fornire
- purché
- metti
- query
- RAM
- gamma
- tasso
- piuttosto
- rapporto
- Crudo
- Leggi
- di rose
- veramente
- ragionevole
- riduzione
- per quanto riguarda
- relazionato
- affidabile
- riorganizzazione
- replica
- replicazione
- rappresentare
- rappresentato
- richiesta
- elastico
- Risoluzione
- risoluto
- risultante
- riutilizzare
- destra
- robusto
- radice
- tondo
- RIGA
- Correre
- running
- stesso
- Scala
- scalabile
- Scala
- scala
- senza soluzione di continuità
- Cerca
- problemi di
- vedere
- visto
- segmento
- segmentazione
- Vendita
- punto vendita
- servizio
- Servizi
- servizio
- set
- flessibile.
- alcuni
- sharding
- compartecipazione
- Corti
- mostrare attraverso le sue creazioni
- lato
- simile
- da
- singolo
- Taglia
- abilità
- piccole
- inferiore
- smart
- So
- soluzione
- RISOLVERE
- risolve
- alcuni
- lo spazio
- Scintilla
- Deporre le uova
- SQL
- Standard
- Regione / Stato
- dichiarazione
- conservazione
- Tornare al suo account
- Storia
- Strategico
- Strategia
- forte
- fortemente
- Con successo
- supporto
- supporti
- tavolo
- Fai
- presa
- Task
- team
- Consulenza
- dire
- condizioni
- di
- che
- I
- Il blocco
- Lo Stato
- loro
- poi
- Là.
- Strumenti Bowman per analizzare le seguenti finiture:
- di
- Terza
- terzi
- questo
- portata
- tempo
- a
- pure
- strumenti
- Totale
- COMPLETAMENTE
- traffico
- delle transazioni
- Le transazioni
- trasferimento
- in modo trasparente
- Digitare
- Tipi di
- in definitiva
- per
- sottostante
- purtroppo
- unix
- sblocca
- inutilmente
- us
- usabilità
- Impiego
- uso
- caso d'uso
- utilizzato
- Utente
- utenti
- utilizzando
- generalmente
- Prezioso
- varietà
- verticale
- molto
- volume
- volere
- Prima
- Modo..
- we
- Web2
- Web3
- WELL
- Che
- Che cosa è l'
- quando
- quale
- while
- Mentre
- tutto
- perché
- largo
- ampiamente
- volere
- con
- senza
- lavori
- scrivere
- scritto
- Tu
- Minore
- Trasferimento da aeroporto a Sharm
- zefiro