At betjene en stor brugerbase med pålidelige, konsistente data med lav latenstid er en meget svær udfordring for ethvert backend-team. Hos Ledger traf vi det strategiske valg at være vært for vores egne blockchain-kernedatatjenester. Ved ikke at stole på tredjeparter kan vi selv administrere vores kunders data og sikre, at underliggende processer overholder vores sikkerhedsretningslinjer og præstationsorienterede serviceniveaumål (SLO).
Men denne strategi bringer også sit eget sæt af udfordringer.
Vores første udfordring er at migrere disse kernedataleverende tjenester væk fra seje og skinnende noSQL-værktøjer. I denne artikel vil jeg dykke ned i, hvorfor vi tog denne svære beslutning, de kompleksiteter, vi mødte, og de fordele, vi høstede.
Målet med denne artikel er at vise de tekniske aspekter, der fik os til at vælge PostgreSQL som vores nye baseline-lagerlag for blockchain-data.
Dyb dyk ned i Blockchain Data
Blockchain-data har flere nøglefunktioner.
For det første vokser den konstant, og der bliver aldrig slettet noget fra den. Men i praksis, selvom det meste af en blockchain er uforanderlig, kan den yngste del af blockchain ændre sig på grund af konflikter, der skal løses. Da kæden er et peer-to-peer-netværk, kan adskillige legitime blokke faktisk eksistere sammen midlertidigt. Normalt slettes den ældre, hvilket resulterer i, hvad vi kalder en omorganisering. Lang historie kort, dataene er delt mellem en uforanderlig kold hale og en sjældent skiftende hovedtilstand.
Problemet, vi forsøger at løse, er, at selvom blockchains er gode til at have byzantinske fejltolerante data, er de mindre effektive til at skære og skære dem over mange akser. Det er nemlig meget svært at få listen over operationer, der har påvirket en konto. Selv at få en kontosaldo på en blockchain som bitcoin er en udfordring, når du ikke allerede har listen over transaktioner.
For at overvinde disse udfordringer indekserer Ledger Explorer Services hele blockchain.. Det er en stor, kritisk og præstationsfølsom tjeneste, der er fuldt skrevet i Scala, ved hjælp af katte-effekt høj ydeevne køretid. Vi er over 10k rps på bitcoin, mens vi opretholder en hale p95 latency under 100ms. Vi rekrutterer også 😊.
Lidt historie
I begyndelsen af vores historie, længe før jeg kom til virksomheden, blev Ledger-dataservicelaget håndteret af en indlejret Neo4j-database. Hver serveringsboks indekserede sine egne data og serverede dem lokalt, hvilket forårsagede en masse problemer.
Datakonsistens mellem forekomster blev ikke garanteret, og selve størrelsen af den tilstand, der skulle indekseres, kombineret med neo4j-disk- og ram-brug, var ikke skalerbar. Dette problem forværredes kun, efterhånden som virksomheden voksede, hvilket gjorde det stadig mere udfordrende at skabe nye tilfælde.
Cassandra blev derefter valgt som hoveddriveren for denne nye opsætning: det er en klynget, horisontalt skalerbar database, der er på AP-siden af CAP-sætningen. Det løser problemerne relateret til datadeling og giver mulighed for en klar adskillelse mellem indeksering, blockchain-bevidste komponent og de hovedløse API-servere.
Men hvad er meningen med at have hele den historiske stat tilgængelig, hvis vi aldrig rent faktisk kommer til at læse fra den?
Med hensyn til vores use case, er rå historiske data sjældent nødvendige, fordi vores brugers kontotilstand kan aggregeres fra dem. Dette fik os til at udfordre den eksisterende datalagringsløsning, som er baseret på den distribuerede Cassandra-database.
Mængden af data, vi skal gemme pr. blockchain, selvom det er i terabyte-området, er ikke, hvad man kan kalde "big data". Desuden er den del af if, der vil blive brugt til at besvare de fleste af forespørgslerne (alias The hot path) endnu mindre. I dag kan man nemt finde råvare-hardwareservere med mere end 16 TB NVMe SSD-lagring. Vertikal skalering er et meget kraftfuldt værktøj, og en relationel database er det også.
Endelig var hovedproblemet, vi havde med den nuværende cassandra-opsætning, hverken den spildte lagringsmodel eller den dårligt tilpassede databrugssag, men manglen på udviklervenlighed. At udvikle en ny databaseret funktion på cassandra har vist sig at være unødvendigt tidskrævende. Vi stræbte efter at implementere hver ny akse, som vi skal levere data på.
I betragtning af vores teams ekspertise inden for datamodellering og SQL-færdigheder, PostgreSQL var den perfekte kandidat. Denne løsning er kamptestet, robust, nem at udvide, hvilket gør den til et ideelt valg.
Hvorfor vi valgte SQL frem for NoSQL:
- Læser / skriver saldi: brugssagen af blockchain-data er blevet stærkt skæv over læsninger frem for skrivninger (blockchain skriver meget få data til en meget rimelig hastighed, selv for en blockchain som Polygon). Cassandra har evnen til at absorbere en meget stor mængde skrivninger - læsestien er faktisk længere end skrivestien.
- Indekseringsstøtte: Indeks er en nøglekomponent i et DBMS til at besvare forespørgsler og nye forretningscases eller muligheder. Cassandra har begrænset støtte til indeksering. Indeks er kun effektive, hvis forespørgslen allerede angiver en måde at begrænse den partition, som forespørgslen skal køre på. Vi betaler her omkostningerne for at have en vilkårligt fordelt database. PostgreSQL-understøttelse af indekser er effektiv, udvidelsesbar og på kanten.
- Aggregationsstøtte: Samme tilfælde for aggregering; da Cassandra ikke tillader aggregering af flere partier og ikke tolererer GROUP BY-klausuler i dets forespørgselssprog, mangler dens support på en måde. PostgreSQL foreslår en omfattende aggregeringsunderstøttelse, selv på eksotiske datatyper som områder og jsonb-blobs.
- Datamodellering: Cassandra er meget, meget begrænsende i den måde, datamodellering er mulig på. Der skal oprettes en tabel for næsten hver anmodning, du vil besvare, og data skal denormaliseres i store rækker (ved at bruge bred søjlebutik aspekt af C* og også det faktum, at forfattere er billige). PostgreSQL giver os mulighed for at udnytte det relationelle aspekt af blockchain (opkald, transaktioner, blokeringer) og spare diskplads, hvilket tilskynder til genbrug af data.
- Ad hoc forespørgsler og revision: At være i stand til at bruge den fulde standard for SQL og lave vilkårlige forespørgsler betyder, at vi kan udforske og søge efter potentiel fejlårsag eller have udforskende data til fremtidige brugssager. Vi kan virkelig bruge databasen som et interaktivt og smart værktøj frem for en dum lagring. Gør vi det på Cassandra uden en omfattende og kostbar analysecomputerklynge som Presto, Spark osv. (og da vi kører på bare metal-servere, har vi ikke adgang til let afledte distribuerede dataanalyseværktøjer som EMR).
- Opbevaring skik: Cassandra antagelse er, at opbevaring er meget billig, og at klyngen nemt kan udvides med nye maskiner. Det betyder det alle begrænsninger på både indekser og aggregeringer skal betales med opbevaring. Ingen globalt effektive indekser og joinsupport betyder, at vi er nødt til at denormalisere og gemme en kopi af hele tabellen for hver akse, vi ønsker at forespørge på. PostgreSQL skåner os for terabytes lagerplads.
- Sammenhæng: Da Cassandra er en distribueret, AP-orienteret database (kommunikation foregår med sladder mellem noder), er konsistens kun endelig med hensyn til skrivninger. Du kan justere konsistenspolitikken for hver erklæring for både læsning og skrivning, men målet med denne database var aldrig at have stærk konsistens. PostgreSQL har en stærk historie om at blive brugt til kritiske missioner og er meget modstandsdygtig. At være centraliseret betyder også, at der ikke er noget netværk involveret i skrivestien.
- Transaktioner og MVCC:
- Transaktioner: Cassandra støtter kun lette transaktioner på DML-forespørgsler. Nogle batching kan anvendes (dock), men der er adskillige forbehold, nemlig at rækkerne skal være på den samme server (= partition) for ikke at have forfærdelig ydeevne.
- MVCC: Cassandra understøtter rækketidsstempling, men den fulde MVCC er ikke garanteret. En komprimering kan slette forældede data, og der er ingen måde at fortælle C*, at det ikke skal (som f.eks. en transaktion i PG).
- PostgreSQL understøtter en stærk MVCC-model, der sikrer en ensartet læsesti for vores brugere.
- Tooling: PostgreSQL har mange flere værktøjer, der er meget brugt til nemt at betjene databasen. Desuden et værktøj som flyvevej sikrer, at vi opretholder en stærk versionering af databaseskemaet. Vi har allerede integreret det med vores kodebase med succes. Der er ingen ækvivalent med dette modenhedsniveau på Cassandra.
- Horisontal skalerbarhed: Dette er det vigtigste salgsargument for Cassandra. Du skal bare tilføje flere maskiner, efterhånden som dine data udvides. Intet tilsvarende for PostgreSQL, da sharding og partitionering skal foretages manuelt.
Hvordan vi planlægger at skalere
Som vi har set, er den eneste ulempe ved at bruge en Postgres-opsætning skalering både på læsninger og lagring. Hvad kan vi gøre for at overvinde denne begrænsning?
Det første effektive værktøj, vi har, er at adskille hver protokol eller blockchain, vi understøtter, i sin egen database, da den kan skaleres passende i betragtning af mængden og trafikken. Segmentering efter forretningsdomæne sikrer et første lag af skalering.
Ved at tage dette koncept videre, kan vi også segmentere kolde, historiske data i tidsmæssig opdeling. De seneste versioner af Postgres har forbedret meget anvendeligheden af partitionerede tabeller, som kunne gøre det muligt at flytte data problemfrit på tværs af en klynge af maskiner. For eksempel kunne vi bruge billigere maskiner med mindre regnekraft til at hoste størstedelen af historiske data, mens vi beholder kraftige brugerserverende RAM-stablede giganter til at være vært for aggregerede tabeller og brugernes seneste handlinger.
Denne tilgang fungerer meget godt i vores brugstilfælde, fordi der ikke er nogen fremmednøgler på tværs af partitioner i historisk lager (alt er i sidste ende knyttet til blokken). Fra hovedserverens perspektiv kunne historiske data endda tilgås transparent ved hjælp af partitionering og postgres_fdw-udvidelsen.
For at hjælpe med at få alt dette på plads, har vi også kigget på TimescaleDB-udvidelsen. Denne udvidelse tilføjer en masse funktionaliteter til baseline postgres, og de fleste af disse passer perfekt til vores use cases:
- Automatisk opdeling af tabeller baseret på en tidslignende kolonne (i vores tilfælde tilpasser vi den ved at tage blockchain-højden som vores reference).
- Automatisk, datatypebevidst og kolonnebaseret komprimering af ældre bidder. Dette sikrer et næsten perfekt komprimeringsforhold ved at bruge state of the art algoritmer på data, der er meget ens.
- Effektiv tidsspand-baseret aggregering til nemt at beregne historiske saldi og markedsdatagrafer.
Vi er lige i begyndelsen af eksperimenter med opbevaring, og dette låser op for mange use cases. Bevis for koncepter ved hjælp af en lille mængde data (~10 blokke på ethereum-netværket, så omkring 2 dages data) viste diskpladsreduktion så høj som 40 %.
Som vi har set, er datamængden, forudsat at vi bruger den rigtige strategi, ikke et problem. Men hvordan skalerer man med størrelsen af vores brugerbase?
Vi har allerede en god fordel her: vi indekserer hele blockchain-dataene. Den nødvendige lagerplads vil således ikke vokse som antallet af brugere, men som den samlede blockchain-størrelse. Lager- og læseoptimeringer er fuldstændig ortogonale i deres opløsning.
Denne opsætning, kombineret med det meget lave skrivebehov i forhold til den læsevolumen, der skal betjenes, er drømmeopsætningen for et klassificeret leder-følger-replikmønster. For at forbedre ydeevnen og gennemløbet yderligere kan vi også placere postgres read-replikaerne på de samme maskiner som API-serverne og drage fordel af UNIX-domæne-sockets til at springe netværket rundt.
Her er et eksempel på en datareplikeringsstrategi, som vi kunne bruge til at skalere vores læsninger. Lysegrå kasser repræsenterer enkelte servere. Vi kan se her, at API-pods er direkte placeret sammen med replikaer af de hotteste data for at sikre en minimal overførselstid mellem lager og brugere. Arkivforekomster beskrevet tidligere er ikke repræsenteret for ikke at komplicere skemaet for meget.
Afsluttende bemærkninger
Som en langsigtet Cassandra-bruger vil jeg understrege, at det er en fantastisk database i sit design, der passer til en lang række applikationer. Desværre blev valget, der blev truffet hos Ledger om at bruge det, truffet på en databrugssag, som aldrig blev til noget.
Vores teams produktivitet blev påvirket, og ser frem til de udfordringer, vi skal løse, valgte vi at bide i spidsen og ikke falde for den forsinkede omkostningsfejl.
I mange tilfælde er dine data ikke big data. Håndtering af datadistribution er ikke en vanskelig opgave i de fleste tilfælde, og afvejningen af en fuldgyldig distribueret database skal virkelig overvejes nøje. Nøgleovervejelsen er udvikleroplevelsen, da det frigør værdifuld tid til at bygge noget andet. Dette er den virkelige use case, vi skal investere kraftigt i.
- SEO Powered Content & PR Distribution. Bliv forstærket i dag.
- PlatoAiStream. Web3 Data Intelligence. Viden forstærket. Adgang her.
- Udmøntning af fremtiden med Adryenn Ashley. Adgang her.
- Køb og sælg aktier i PRE-IPO-virksomheder med PREIPO®. Adgang her.
- Kilde: https://www.ledger.com/blog/serving-web3-at-web2-scale
- :har
- :er
- :ikke
- $OP
- 10
- 10K
- 20
- a
- evne
- I stand
- adgang
- af udleverede
- Konto
- tværs
- faktisk
- tilpasse
- tilføje
- Tilføjer
- klæbe
- Fordel
- aggregering
- algoritmer
- Alle
- tillade
- tillader
- allerede
- også
- Skønt
- beløb
- an
- analyse
- analytics
- ,
- besvare
- enhver
- noget
- api
- applikationer
- anvendt
- tilgang
- passende
- Arkiv
- ER
- omkring
- Kunst
- artikel
- AS
- udseende
- aspekter
- antagelse
- At
- til rådighed
- opmærksom på
- væk
- AKSER
- Axis
- Bagende
- Balance
- saldi
- bund
- baseret
- Baseline
- BE
- fordi
- været
- før
- Begyndelse
- giganter
- være
- fordele
- mellem
- Big
- Big data
- Bit
- Bitcoin
- Bloker
- blockchain
- blockchain-data
- blockchains
- Blocks
- både
- Boks
- kasser
- Bringer
- Bug
- bygge
- virksomhed
- men
- by
- ringe
- Opkald
- CAN
- kandidat
- kasket
- omhyggeligt
- tilfælde
- tilfælde
- Årsag
- forårsagede
- centraliseret
- kæde
- udfordre
- udfordringer
- udfordrende
- lave om
- skiftende
- billig
- billigere
- billigere maskiner
- valg
- Vælg
- valgte
- valgt
- klar
- Cluster
- kode
- kodebase
- forkølelse
- Kolonne
- kombineret
- råvare
- Kommunikation
- selskab
- kompleksiteter
- komponent
- Compute
- Konceptet
- begreber
- overvejelse
- betragtes
- konsekvent
- Cool
- Core
- Koste
- kunne
- oprettet
- kritisk
- Nuværende
- data
- dataanalyse
- datadeling
- data opbevaring
- Database
- Dage
- beslutning
- beskrevet
- Design
- Udvikler
- udvikling
- svært
- direkte
- snavs
- distribueret
- fordeling
- Divided
- do
- gør
- gør
- domæne
- Dont
- downside
- drøm
- driver
- grund
- e
- hver
- nemt
- let
- Edge
- Effektiv
- effektiv
- andet
- indlejret
- understrege
- muliggøre
- tilskynde
- forbedre
- sikre
- sikrer
- sikring
- Ækvivalent
- etc.
- ethereum
- ETHEREUM MAINNET
- Endog
- eventuel
- NOGENSINDE
- Hver
- at alt
- eksempel
- eksisterende
- Exotic
- udvider
- erfaring
- ekspertise
- udforske
- opdagelsesrejsende
- udvide
- udvidelse
- omfattende
- Faktisk
- Fall
- Feature
- Funktionalitet
- få
- Finde
- Fornavn
- passer
- Til
- udenlandsk
- Videresend
- venlighed
- fra
- fuld
- fuldgyldigt
- fuldt ud
- funktionaliteter
- yderligere
- fremtiden
- få
- given
- Globalt
- mål
- gå
- grafer
- grå
- stor
- gruppe
- Grow
- Dyrkning
- garanteret
- retningslinjer
- havde
- Hård Ost
- Hardware
- Have
- have
- hoved
- stærkt
- højde
- hjælpe
- link.
- Høj
- stærkt
- historisk
- host
- HOT
- hotteste
- Hvordan
- How To
- Men
- HTML
- HTTPS
- i
- ideal
- if
- uforanderlige
- påvirket
- gennemføre
- forbedret
- in
- stigende
- indeks
- Indeks
- instans
- integreret
- interaktiv
- ind
- Invest
- involverede
- spørgsmål
- spørgsmål
- IT
- ITS
- deltage
- sluttede
- jpg
- lige
- holde
- Nøgle
- nøgler
- Venlig
- Mangel
- Sprog
- stor
- Latency
- seneste
- lag
- Led
- Ledger
- legitim
- mindre
- Niveau
- Leverage
- lys
- letvægt
- ligesom
- begrænsning
- begrænsninger
- Limited
- Liste
- lidt
- lokalt
- Lang
- kiggede
- leder
- Lot
- Lav
- Maskiner
- lavet
- Main
- mainnet
- vedligeholde
- Flertal
- Making
- administrere
- styring
- manuelt
- mange
- Marked
- Markedsdata
- modenhed
- max-bredde
- Kan..
- midler
- metal
- migrere
- mindste
- missioner
- model
- modellering
- mere
- Desuden
- mest
- bevæge sig
- meget
- skal
- nemlig
- næsten
- Behov
- behov
- behov
- Ingen
- netværk
- aldrig
- Ny
- rart
- ingen
- noder
- intet
- nummer
- talrige
- målsætninger
- of
- on
- ONE
- kun
- betjene
- Produktion
- Muligheder
- or
- ordrer
- vores
- os selv
- i løbet af
- Overvind
- egen
- betalt
- del
- parter
- sti
- Mønster
- Betal
- peer
- peer to peer
- perfekt
- ydeevne
- perspektiv
- Place
- fly
- plato
- Platon Data Intelligence
- PlatoData
- bælg
- Punkt
- politik
- Polygon
- mulig
- postgresql
- potentiale
- magt
- vigtigste
- praksis
- Problem
- Processer
- produktivitet
- bevis
- andel
- foreslår
- protokol
- gennemprøvet
- give
- forudsat
- sætte
- forespørgsler
- RAM
- rækkevidde
- Sats
- hellere
- forholdet
- Raw
- Læs
- ægte
- virkelig
- rimelige
- reduktion
- om
- relaterede
- pålidelig
- reorganisering
- svar
- replikation
- repræsentere
- repræsenteret
- anmode
- elastisk
- Løsning
- løst
- resulterer
- genbruge
- højre
- robust
- rod
- rundt
- RÆKKE
- Kør
- kører
- samme
- Scala
- skalerbar
- Scale
- skalering
- problemfrit
- Søg
- sikkerhed
- se
- set
- segment
- segmentering
- Salg
- salgsargument
- tjeneste
- Tjenester
- servering
- sæt
- setup
- flere
- sharding
- deling
- Kort
- Vis
- side
- lignende
- siden
- enkelt
- Størrelse
- færdigheder
- lille
- mindre
- Smart
- So
- løsninger
- SOLVE
- Løser
- nogle
- Space
- Spark
- Spawn
- SQL
- standard
- Tilstand
- Statement
- opbevaring
- butik
- Story
- Strategisk
- Strategi
- stærk
- kraftigt
- Succesfuld
- support
- Understøtter
- bord
- Tag
- tager
- Opgaver
- hold
- Teknisk
- fortælle
- vilkår
- end
- at
- Blokken
- Staten
- deres
- derefter
- Der.
- Disse
- de
- Tredje
- tredje partier
- denne
- kapacitet
- tid
- til
- også
- værktøj
- værktøjer
- I alt
- HELT
- Trafik
- transaktion
- Transaktioner
- overførsel
- gennemskueligt
- typen
- typer
- Ultimativt
- under
- underliggende
- desværre
- unix
- låser op
- unødigt
- us
- usability
- Brug
- brug
- brug tilfælde
- anvendte
- Bruger
- brugere
- ved brug af
- sædvanligvis
- Værdifuld
- række
- lodret
- meget
- bind
- ønsker
- var
- Vej..
- we
- Web2
- Web3
- GODT
- Hvad
- Hvad er
- hvornår
- som
- mens
- Mens
- Hele
- hvorfor
- bred
- bredt
- vilje
- med
- uden
- virker
- skriver
- skriftlig
- dig
- yngste
- Din
- zephyrnet