Å betjene en stor brukerbase med pålitelige, konsistente data med lav latens er en veldig vanskelig utfordring for ethvert backend-team. Hos Ledger tok vi det strategiske valget å være vert for våre egne kjernedatatjenester for blockchain. Ved å ikke stole på tredjeparter, kan vi administrere våre klienters data selv, og sikre at underliggende prosesser overholder våre sikkerhetsretningslinjer og ytelsesorienterte tjenestenivåmål (SLO).
Men denne strategien gir også sine egne utfordringer.
Vår første utfordring er å migrere disse kjernedataleverandørene bort fra kule og skinnende noSQL-verktøy. I denne artikkelen vil jeg dykke ned i hvorfor vi tok denne vanskelige avgjørelsen, kompleksiteten vi møtte og fordelene vi høstet.
Målet med denne artikkelen er å vise de tekniske aspektene som førte til at vi valgte PostgreSQL som vårt nye baseline-lagringslag for blokkjededata.
Dypdykk i Blockchain Data
Blokkjededata har flere nøkkelfunksjoner.
For det første vokser den stadig, og ingenting blir noen gang slettet fra den. Men i praksis, selv om det meste av en blokkjede er uforanderlig, kan den yngste delen av blokkjeden endre seg på grunn av konflikter som må løses. Faktisk, siden kjeden er et peer-to-peer-nettverk, kan flere legitime blokker eksistere samtidig. Vanligvis slettes den eldre, noe som resulterer i det vi kaller en omorganisering. Lang historie kort, dataene er delt mellom en uforanderlig kald hale og en sjeldent skiftende hodetilstand.
Problemet vi prøver å løse er at selv om blokkjeder er gode for å ha bysantinske feiltolerante data, er de mindre effektive for å kutte og kutte dem over mange akser. Det er nemlig svært vanskelig å få tak i listen over operasjoner som påvirket en konto. Selv å få en kontosaldo på en blokkjede som bitcoin er en utfordring når du ikke allerede har listen over transaksjoner.
For å overvinne disse utfordringene, indekserer Ledger Explorer Services hele blokkjeden.. Det er en stor, kritisk og ytelsessensitiv tjeneste fullt skrevet i Scala, ved hjelp av katteeffekt høy ytelse kjøretid. Vi er over 10k rps på bitcoin, mens vi opprettholder en hale p95 latency under 100ms. Vi rekrutterer også 😊.
Litt historie
I begynnelsen av historien vår, lenge før jeg begynte i selskapet, ble Ledger-datatjenestelaget håndtert av en innebygd Neo4j-database. Hver serveringsboks indekserte sine egne data og serverte dem lokalt, noe som forårsaket mange problemer.
Datakonsistens mellom forekomster ble ikke garantert, og selve størrelsen på staten som måtte indekseres, kombinert med neo4j-disk- og rambruk, var ikke skalerbar. Dette problemet ble bare verre etter hvert som selskapet vokste, noe som gjorde det stadig mer utfordrende å skape nye forekomster.
Cassandra ble deretter valgt som hoveddriveren for dette nye oppsettet: det er en klynget, horisontalt skalerbar database som er på AP-siden av CAP-teoremet. Det løser problemene knyttet til datadeling og gir et klart skille mellom indeksering, blokkjedebevisste komponent og de hodeløse API-serverne.
Men hva er vitsen med å ha hele den historiske staten tilgjengelig hvis vi aldri kommer til å faktisk lese fra den?
Når det gjelder brukstilfellet vårt, er det sjelden behov for rå historiske data fordi brukerens kontostatus kan aggregeres fra den. Dette førte til at vi utfordret den eksisterende datalagringsløsningen som er basert på den distribuerte Cassandra-databasen.
Volumet av data vi trenger å lagre per blokkjede, selv om det er i terabyte-området, er ikke det man kan kalle "big data". Dessuten er delen av if som vil bli brukt til å svare på de fleste spørsmålene (a.k.a. The hot path) enda mindre. I dag kan man enkelt finne råvareservere med mer enn 16 TB NVMe SSD-lagring. Vertikal skalering er et veldig kraftig verktøy, og en relasjonsdatabase er det også.
Til slutt var hovedproblemet vi hadde med det nåværende cassandra-oppsettet verken den sløsede lagringsmodellen eller den dårlig tilpassede databrukssaken, men mangelen på utviklervennlighet. Å utvikle en ny databasert funksjon på Cassandra har vist seg å være unødvendig tidkrevende. Vi strebet etter å implementere hver ny akse som vi trenger å levere data på.
Gitt teamets ekspertise innen datamodelleringsferdigheter og SQL-ferdigheter, PostgreSQL var den perfekte kandidaten. Denne løsningen er kamptestet, robust, enkel å utvide, noe som gjør den til et ideelt valg.
Hvorfor vi valgte SQL fremfor NoSQL:
- Leser / skriver saldoer: brukssaken for blokkjededata har vært sterkt skjev over lesninger i stedet for skriving (blockchain skriver svært få data til en svært rimelig hastighet, selv for en blokkjede som Polygon). Cassandra har evnen til å absorbere en veldig stor mengde skriv – lesebanen er faktisk det lenger enn skrivebanen.
- Støtte for indeksering: Indekser er en nøkkelkomponent i et DBMS for å svare på spørsmål og nye forretningssaker eller muligheter. Cassandra har begrenset støtte for indeksering. Indekser er bare effektive hvis spørringen allerede spesifiserer en måte å begrense partisjonen som spørringen skal kjøres på. Vi betaler her kostnaden for å ha en vilkårlig distribuert database. PostgreSQL-støtte for indekser er effektiv, utvidbar og på kanten.
- Aggregasjonsstøtte: Samme tilfelle for aggregering; siden Cassandra ikke tillater multi-partisjon aggregering og tolererer ingen GROUP BY-klausul i søkespråket, er støtten på en måte mangelfull. PostgreSQL foreslår en omfattende aggregeringsstøtte, selv på eksotiske datatyper som områder og jsonb-blobs.
- Datamodellering: Cassandra er veldig, veldig begrensende i måten datamodellering er mulig på. En tabell må opprettes for nesten hver forespørsel du vil svare på, og data må denormaliseres til store rader (ved å bruke bred kolonnebutikk aspekt av C* og også det faktum at forfattere er skittbillige). PostgreSQL lar oss utnytte det relasjonelle aspektet av blokkjeden (anrop, transaksjoner, blokkeringer) og spare diskplass, og oppmuntre til gjenbruk av data.
- Ad-hoc forespørsler og revisjon: Å kunne bruke den fulle standarden for SQL og gjøre vilkårlige spørringer betyr at vi kan utforske og søke etter potensiell feilårsak eller ha utforskende data for fremtidig bruk. Vi kan virkelig bruke databasen som et interaktivt og smart verktøy i stedet for en dum lagring. Å gjøre det på Cassandra uten en omfattende og kostbar analysedataklynge som Presto, Spark, etc. (og siden vi kjører på bare metal-servere, har vi ikke tilgang til distribuerte dataanalyseverktøy som EMR som er lett tilgjengelige).
- Lagringsforbruk: Cassandra antagelse er at lagring er veldig billig og at klyngen enkelt kan utvides med nye maskiner. Det betyr det alle begrensningene på både indekser og aggregeringer må betales med lagring. Ingen globalt effektive indekser og tilkoblingsstøtte betyr at vi må denormalisere og lagre en kopi av hele tabellen for hver akse vi ønsker å spørre etter. PostgreSQL sparer oss for terabyte med lagringsplass.
- Konsistens: Ettersom Cassandra er en distribuert, AP-orientert database (kommunikasjon gjøres med sladder mellom noder), er konsistens bare endelig når det gjelder skrivinger. Du kan justere konsistenspolicyen for hver uttalelse for både lesing og skriving, men målet med denne databasen var aldri å ha sterk konsistens. PostgreSQL har en sterk historie om å bli brukt til kritiske oppdrag og er svært motstandsdyktig. Å være sentralisert betyr også at det ikke er noe nettverk involvert i skrivebanen.
- Transaksjoner og MVCC:
- Transaksjoner: Cassandra støtter bare lette transaksjoner på DML-spørringer. Noe batching kan brukes (doc), men det er mange forbehold, nemlig at radene må være på samme server (= partisjon) for ikke å ha fryktelig ytelse.
- MVCC: Cassandra støtter radtidsstempling, men hele MVCC er ikke garantert. En komprimering kan slette foreldede data, og det er ingen måte å fortelle C* at det ikke skal gjøre det (som for eksempel med en transaksjon i PG).
- PostgreSQL støtter en sterk MVCC-modell som sikrer en konsistent lesevei for brukerne våre.
- Verktøy: PostgreSQL har mange flere verktøy som er mye brukt for å enkelt betjene databasen. Dessuten et verktøy som flyway sikrer at vi opprettholder en sterk versjonering av databaseskjemaet. Vi har allerede integrert den med kodebasen vår. Det er ingen tilsvarende med dette modenhetsnivået på Cassandra.
- Horisontal skalerbarhet: Dette er det viktigste salgsargumentet til Cassandra. Bare legg til flere maskiner etter hvert som dataene dine utvides. Ingen tilsvarende for PostgreSQL da sharding og partisjonering må gjøres manuelt.
Hvordan vi planlegger å skalere
Som vi har sett, er den eneste ulempen med å bruke et Postgres-oppsett skalering både på lesing og lagring. Hva kan vi gjøre for å overvinne denne begrensningen?
Det første effektive verktøyet vi har er å separere hver protokoll eller blokkjede vi støtter inn i sin egen database, som dermed kan skaleres riktig gitt volumet og trafikken. Segmentering etter forretningsdomene sikrer et første lag med skalering.
Ved å ta dette konseptet videre, kan vi også segmentere kalde, historiske data i tidsmessig partisjon. De siste versjonene av Postgres har forbedret brukervennligheten til partisjonerte tabeller mye, som kan gjøre det mulig å flytte sømløst data på tvers av en klynge av maskiner. For eksempel kan vi bruke billigere maskiner med mindre datakraft for å være vert for de fleste historiske data, samtidig som vi beholder kraftige brukerserverende RAM-stablede storheter for å være vert for aggregerte tabeller og brukerens siste operasjoner.
Denne tilnærmingen fungerer veldig bra i vårt brukstilfelle fordi det ikke er noen utenlandske nøkler på tvers av partisjoner i historisk lagring (alt er til slutt knyttet til blokken). Fra hovedserverens perspektiv kan historiske data til og med åpnes transparent ved hjelp av partisjonering og postgres_fdw-utvidelsen.
For å hjelpe med å få alt dette på plass, har vi også sett på TimescaleDB-utvidelsen. Denne utvidelsen legger til mange funksjoner til baseline postgres, og de fleste av disse passer perfekt for våre brukstilfeller:
- Automatisk partisjonering av tabeller basert på en tidslignende kolonne (i vårt tilfelle tilpasser vi den ved å ta blokkjedehøyden som referanse).
- Automatisk, datatypebevisst og kolonnebasert komprimering av eldre biter. Dette sikrer et nesten perfekt komprimeringsforhold ved å bruke toppmoderne algoritmer på data som er svært like.
- Effektiv tidsrammebasert aggregering for enkelt å beregne historiske saldoer og markedsdatagrafer.
Vi er bare i begynnelsen av eksperimentering angående lagring, og dette låser opp mange brukssaker. Konseptbevis ved bruk av en liten mengde data (~10k blokker på ethereum-nettverket, så rundt 2 dager med data) viste diskplassreduksjon så høy som 40 %.
Som vi har sett, er ikke datavolum, forutsatt at vi bruker riktig strategi, et problem. Men hvordan skalere med størrelsen på brukerbasen vår?
Vi har allerede en god fordel her: vi indekserer hele blokkjededataene. Dermed vil lagringen som trengs ikke vokse som antall brukere, men som den totale blokkjedestørrelsen. Lagrings- og leseoptimaliseringer er helt ortogonale i oppløsningen.
Dette oppsettet, kombinert med det svært lave skrivebehovet i forhold til lesevolumet som må betjenes, er drømmeoppsettet for et klassifiseringsleder-følger replikamønster. For å forbedre ytterligere ytelse og gjennomstrømning, kan vi også plassere postgres read-replikaene på de samme maskinene som API-serverne og dra nytte av UNIX-domenekontaktene for å hoppe over nettverksrundturene.
Her er et eksempel på en datareplikeringsstrategi som vi kan bruke for å skalere avlesningene våre. Lysegrå bokser representerer enkeltservere. Vi kan se her at API-poder er direkte samlokalisert med replikaer av de hotteste dataene for å sikre en minimal overføringstid mellom lagring og brukere. Arkivforekomster beskrevet tidligere er ikke representert for ikke å komplisere skjemaet for mye.
Avsluttende kommentarer
Som en langsiktig Cassandra-bruker vil jeg understreke at det er en flott database i sin design, som passer til et bredt spekter av applikasjoner. Dessverre ble valget som ble tatt hos Ledger om å bruke det tatt på en databrukssak som aldri ble noe av.
Teamets produktivitet ble påvirket, og vi gledet oss til utfordringene vi må løse, og vi valgte å bite i kulen og ikke falle for feilslutningen med sunkne kostnader.
I mange tilfeller er ikke dataene dine big data. Å administrere datadistribusjon er ikke en vanskelig oppgave i de fleste tilfeller, og avveiningene til en fullverdig distribuert database må virkelig vurderes nøye. Det viktigste er utvikleropplevelsen, siden det frigjør verdifull tid til å bygge noe annet. Dette er den virkelige brukssaken vi må investere mye i.
- SEO-drevet innhold og PR-distribusjon. Bli forsterket i dag.
- PlatoAiStream. Web3 Data Intelligence. Kunnskap forsterket. Tilgang her.
- Minting the Future med Adryenn Ashley. Tilgang her.
- Kjøp og selg aksjer i PRE-IPO-selskaper med PREIPO®. Tilgang her.
- kilde: https://www.ledger.com/blog/serving-web3-at-web2-scale
- : har
- :er
- :ikke
- $OPP
- 10
- 10K
- 20
- a
- evne
- I stand
- adgang
- aksesseres
- Logg inn
- tvers
- faktisk
- tilpasse
- legge til
- Legger
- overholde
- Fordel
- aggregering
- algoritmer
- Alle
- tillate
- tillater
- allerede
- også
- Selv
- beløp
- an
- analyse
- analytics
- og
- besvare
- noen
- hva som helst
- api
- søknader
- anvendt
- tilnærming
- hensiktsmessig
- Arkiv
- ER
- rundt
- Kunst
- Artikkel
- AS
- aspektet
- aspekter
- forutsetningen
- At
- tilgjengelig
- klar
- borte
- AKSER
- Axis
- Backend
- Balansere
- balanserer
- basen
- basert
- Baseline
- BE
- fordi
- vært
- før du
- Begynnelsen
- kjemper
- være
- Fordeler
- mellom
- Stor
- Store data
- Bit
- Bitcoin
- Blokker
- blockchain
- blockchain-data
- blokkjeder
- Blocks
- både
- Eske
- bokser
- Bringer
- Bug
- bygge
- virksomhet
- men
- by
- ring
- Samtaler
- CAN
- kandidat
- lokk
- nøye
- saken
- saker
- Årsak
- forårsaket
- sentralisert
- kjede
- utfordre
- utfordringer
- utfordrende
- endring
- endring
- billig
- billigere
- billigere maskiner
- valg
- Velg
- valgte
- valgt ut
- fjerne
- Cluster
- kode
- kodebase
- forkjølelse
- Kolonne
- kombinert
- handelsvare
- Kommunikasjon
- Selskapet
- kompleksiteten
- komponent
- Beregn
- konsept
- konsepter
- hensyn
- ansett
- konsistent
- Kul
- Kjerne
- Kostnad
- kunne
- opprettet
- kritisk
- Gjeldende
- dato
- dataanalyse
- datadeling
- datalagring
- Database
- Dager
- avgjørelse
- beskrevet
- utforming
- Utvikler
- utvikle
- vanskelig
- direkte
- skitt
- distribueres
- distribusjon
- Divided
- do
- gjør
- gjør
- domene
- ikke
- ulempen
- drøm
- sjåfør
- to
- e
- hver enkelt
- lett
- lett
- Edge
- Effektiv
- effektiv
- ellers
- innebygd
- understreke
- muliggjøre
- oppmuntrende
- forbedre
- sikre
- sikrer
- sikrer
- Tilsvarende
- etc
- ethereum
- ETHEREUM MAINNET
- Selv
- eventuell
- NOEN GANG
- Hver
- alt
- eksempel
- eksisterende
- Eksotisk
- utvides
- erfaring
- ekspertise
- utforske
- explorer
- utvide
- forlengelse
- omfattende
- Faktisk
- Fall
- Trekk
- Egenskaper
- Noen få
- Finn
- Først
- passer
- Til
- utenlandske
- Forward
- vennlighet
- fra
- fullt
- fullverdig
- fullt
- funksjonalitet
- videre
- framtid
- få
- gitt
- Globalt
- mål
- skal
- grafer
- grå
- flott
- Gruppe
- Grow
- Økende
- garantert
- retningslinjer
- HAD
- Hard
- maskinvare
- Ha
- å ha
- hode
- tungt
- høyde
- hjelpe
- her.
- Høy
- svært
- historisk
- vert
- HOT
- hotteste
- Hvordan
- Hvordan
- Men
- HTML
- HTTPS
- i
- ideell
- if
- uforanderlige
- påvirket
- implementere
- forbedret
- in
- stadig
- indeks
- Indekser
- f.eks
- integrert
- interaktiv
- inn
- Investere
- involvert
- utstedelse
- saker
- IT
- DET ER
- bli medlem
- ble med
- jpg
- bare
- holde
- nøkkel
- nøkler
- Type
- maling
- Språk
- stor
- Ventetid
- siste
- lag
- Led
- Ledger
- legitim
- mindre
- Nivå
- Leverage
- lett
- lettvekt
- i likhet med
- begrensning
- begrensninger
- Begrenset
- Liste
- lite
- lokalt
- Lang
- så
- ser
- Lot
- Lav
- maskiner
- laget
- Hoved
- hovednettet
- vedlikeholde
- Flertall
- Making
- administrer
- administrerende
- manuelt
- mange
- marked
- Market data
- modenhet
- max bredde
- Kan..
- midler
- metall
- migrere
- minimal
- oppdrag
- modell
- modellering
- mer
- Videre
- mest
- flytte
- mye
- må
- nemlig
- nesten
- Trenger
- nødvendig
- behov
- Ingen
- nettverk
- aldri
- Ny
- fint
- Nei.
- noder
- ingenting
- Antall
- mange
- mål
- of
- on
- ONE
- bare
- betjene
- Drift
- Muligheter
- or
- rekkefølge
- vår
- oss selv
- enn
- Overcome
- egen
- betalt
- del
- parter
- banen
- Mønster
- Betale
- likemann
- Likemann til likemann
- perfekt
- ytelse
- perspektiv
- Sted
- fly
- plato
- Platon Data Intelligence
- PlatonData
- pods
- Point
- politikk
- polygon
- mulig
- postgresql
- potensiell
- makt
- kraftig
- praksis
- Problem
- Prosesser
- produktivitet
- bevis
- Andelen
- foreslår
- protokollen
- utprøvd
- gi
- forutsatt
- sette
- spørsmål
- RAM
- område
- Sats
- heller
- ratio
- Raw
- Lese
- ekte
- virkelig
- rimelig
- reduksjon
- om
- i slekt
- pålitelig
- omorganisering
- svare
- replikering
- representere
- representert
- anmode
- spenstig
- oppløsning
- løst
- resulterende
- gjenbruk
- ikke sant
- robust
- root
- runde
- RAD
- Kjør
- rennende
- samme
- Skala
- skalerbar
- Skala
- skalering
- sømløst
- Søk
- sikkerhet
- se
- sett
- segmentet
- segmentering
- Å Sell
- salgspunkt
- tjeneste
- Tjenester
- servering
- sett
- oppsett
- flere
- skjæring
- deling
- Kort
- Vis
- side
- lignende
- siden
- enkelt
- Størrelse
- ferdigheter
- liten
- mindre
- Smart
- So
- løsning
- LØSE
- løser
- noen
- Rom
- Spark
- Gyte
- SQL
- Standard
- Tilstand
- Uttalelse
- lagring
- oppbevare
- Story
- Strategisk
- Strategi
- sterk
- sterk
- vellykket
- støtte
- Støtter
- bord
- Ta
- ta
- Oppgave
- lag
- Teknisk
- fortelle
- vilkår
- enn
- Det
- De
- Blokken
- Staten
- deres
- deretter
- Der.
- Disse
- de
- Tredje
- tredjeparter
- denne
- gjennomstrømning
- tid
- til
- også
- verktøy
- verktøy
- Totalt
- HELT KLART
- trafikk
- Transaksjonen
- Transaksjoner
- overføre
- transparent
- typen
- typer
- Til syvende og sist
- etter
- underliggende
- dessverre
- unix
- låser opp
- unødvendig
- us
- brukervennlighet
- bruk
- bruke
- bruk sak
- brukt
- Bruker
- Brukere
- ved hjelp av
- vanligvis
- Verdifull
- variasjon
- vertikal
- veldig
- volum
- ønsker
- var
- Vei..
- we
- Web2
- Web3
- VI VIL
- Hva
- Hva er
- når
- hvilken
- mens
- Mens
- hele
- hvorfor
- bred
- allment
- vil
- med
- uten
- virker
- skrive
- skrevet
- du
- Yngste
- Din
- zephyrnet