Att betjäna en stor användarbas med pålitlig, konsekvent och låg latensdata är en mycket svår utmaning för alla backend-team. På Ledger gjorde vi det strategiska valet att vara värd för våra egna kärndatatjänster för blockchain. Genom att inte förlita oss på tredje part kan vi hantera våra kunders data själva och säkerställa att underliggande processer följer våra säkerhetsriktlinjer och prestationsorienterade servicenivåmål (SLO).
Men den här strategin medför också sina egna utmaningar.
Vår första utmaning är att migrera dessa kärndatatillhandahållande tjänster bort från coola och glänsande noSQL-verktyg. I den här artikeln kommer jag att dyka ner i varför vi tog detta svåra beslut, komplexiteten vi mötte och fördelarna vi skördade.
Målet med denna artikel är att visa de tekniska aspekterna som ledde till att vi valde PostgreSQL som vårt nya baslinjelager för blockchain-data.
Djupdyka in i Blockchain Data
Blockchain-data har flera nyckelfunktioner.
För det första växer den ständigt, och ingenting tas någonsin bort från den. Men i praktiken, även om det mesta av en blockkedja är oföränderlig, kan den yngsta delen av blockkedjan förändras på grund av konflikter som måste lösas. Faktum är att eftersom kedjan är ett peer-to-peer-nätverk kan flera legitima block existera tillfälligt. Vanligtvis raderas den äldre, vilket resulterar i vad vi kallar en omorganisation. Lång historia kort, uppgifterna är uppdelade mellan en oföränderlig kall svans och ett sällan föränderligt huvudtillstånd.
Problemet vi försöker lösa är att även om blockkedjor är bra för att ha bysantinska feltoleranta data, är de mindre effektiva för att skära och tärna dem över många axlar. Det är nämligen väldigt svårt att få fram listan över operationer som påverkade ett konto. Även att få ett kontosaldo på en blockchain som bitcoin är en utmaning när du inte redan har listan över transaktioner.
För att övervinna dessa utmaningar indexerar Ledger Explorer Services hela blockkedjan. Det är en stor, kritisk och prestationskänslig tjänst helt skriven i Scala, med hjälp av katteffekt körtid med hög prestanda. Vi är över 10k rps på bitcoin, samtidigt som vi behåller en tail p95 latens under 100ms. Vi rekryterar också 😊.
Lite historia
I början av vår historia, långt innan jag gick med i företaget, hanterades Ledger-datatjänstlagret av en inbäddad Neo4j-databas. Varje serveringsbox indexerade sin egen data och serverade den lokalt, vilket orsakade många problem.
Datakonsistens mellan instanser garanterades inte, och själva storleken på tillståndet som behövde indexeras, kombinerat med neo4j disk- och ramanvändning, var inte skalbar. Detta problem förvärrades bara när företaget växte, vilket gjorde det allt svårare att skapa nya instanser.
Cassandra valdes sedan som huvuddrivkraften för denna nya uppsättning: det är en klustrad, horisontellt skalbar databas som finns på AP-sidan av CAP-satsen. Det löser problemen relaterade till datadelning och möjliggör en tydlig separation mellan indexeringen, blockchain-medvetna komponenten och de huvudlösa API-servrarna.
Men vad är poängen med att ha hela det historiska tillståndet tillgängligt om vi aldrig faktiskt kommer att läsa ur det?
När det gäller vårt användningsfall behövs sällan rå historisk data eftersom vår användares kontostatus kan sammanställas från den. Detta ledde till att vi utmanade den befintliga datalagringslösningen som är baserad på den distribuerade databasen Cassandra.
Mängden data vi behöver lagra per blockkedja, även om den ligger i terabyteintervallet, är inte vad man kan kalla "big data". Dessutom är den del av if som kommer att användas för att svara på de flesta frågorna (alias The hot path) ännu mindre. Nuförtiden kan man enkelt hitta hårdvaruservrar med mer än 16 TB NVMe SSD-lagring. Vertikal skalning är ett mycket kraftfullt verktyg, och en relationsdatabas är det också.
Slutligen var huvudproblemet vi hade med den nuvarande Cassandra-konfigurationen varken den slösaktiga lagringsmodellen eller det dåligt anpassade dataanvändningsfallet, utan bristen på utvecklarvänlighet. Att utveckla en ny databaserad funktion på cassandra har visat sig vara onödigt tidskrävande. Vi strävade efter att implementera varje ny axel som vi behöver tillhandahålla data på.
Med tanke på vårt teams expertis inom datamodelleringsfärdigheter och SQL-kunskaper, PostgreSQL var den perfekta kandidaten. Denna lösning är stridstestad, robust, lätt att förlänga, vilket gör den till ett idealiskt val.
Varför vi valde SQL framför NoSQL:
- Läser / skriver saldon: användningsfallet för blockkedjedata har varit kraftigt snedställt över läsningar snarare än skrivningar (blockchain skriver väldigt få data i en mycket rimlig takt, även för en blockkedja som Polygon). Cassandra har förmågan att absorbera en mycket stor mängd skrivningar – läsvägen är det faktiskt längre än skrivvägen.
- Indexeringsstöd: Index är en nyckelkomponent i ett DBMS för att svara på frågor och nya affärsfall eller möjligheter. Cassandra har begränsat stöd för indexering. Index är endast effektiva om frågan redan anger ett sätt att begränsa partitionen som frågan ska köras på. Vi betalar här kostnaden för att ha en godtyckligt fördelade databas. PostgreSQL-stöd för index är effektivt, utbyggbart och vid kanten.
- Aggregationsstöd: Samma fall för aggregering; eftersom Cassandra inte tillåter aggregering av flera partier och inte tolererar någon GROUP BY-klausul i sitt frågespråk, saknas dess stöd på ett sätt. PostgreSQL föreslår ett omfattande aggregeringsstöd, även på exotiska datatyper som intervall och jsonb-blobbar.
- Datamodellering: Cassandra är väldigt, väldigt begränsande i hur datamodellering är möjlig. En tabell måste skapas för nästan varje begäran du vill besvara, och data måste avnormaliseras till stora rader (med hjälp av bred kolonnbutik aspekt av C* och även det faktum att författare är smutsbilliga). PostgreSQL tillåter oss att utnyttja den relationella aspekten av blockkedjan (samtal, transaktioner, blockeringar) och ledigt diskutrymme, vilket uppmuntrar dataåteranvändning.
- Ad-hoc-frågor och revision: Att kunna använda den fullständiga standarden för SQL och göra godtyckliga frågor innebär att vi kan utforska och söka efter potentiella felorsak eller ha utforskande data för framtida användningsfall. Vi kan verkligen använda databasen som ett interaktivt och smart verktyg snarare än en dum lagring. Om du gör det på Cassandra utan ett omfattande och kostsamt analysdatorkluster som Presto, Spark, etc. (och eftersom vi kör på bare metal-servrar har vi inte tillgång till lätt skapade distribuerade dataanalysverktyg som EMR).
- Användning Lagring: Cassandra antagande är att lagring är mycket billig och att klustret enkelt kan utökas med nya maskiner. Det betyder att alla begränsningar för både index och aggregering måste betalas med lagring. Inga globalt effektiva index och anslutningsstöd innebär att vi måste denormalisera och lagra en kopia av hela tabellen för varje axel vi vill fråga. PostgreSQL besparar oss terabyte lagring.
- Konsistens: Eftersom Cassandra är en distribuerad, AP-orienterad databas (kommunikation sker med skvaller mellan noder), är konsistensen endast slutgiltig när det gäller skrivningar. Du kan justera konsekvenspolicyn för varje påstående för både läsning och skrivning, men målet med denna databas var aldrig att ha stark konsekvens. PostgreSQL har en stark historia om att användas för kritiska uppdrag och är mycket motståndskraftig. Att vara centraliserad innebär också att det inte finns något nätverk inblandat i skrivvägen.
- Transaktioner och MVCC:
- Transaktioner: Cassandra stödjer endast lätta transaktioner på DML-frågor. Viss batchning kan tillämpas (doc) men det finns många varningar, nämligen att raderna måste vara på samma server (= partition) för att inte ha fruktansvärda prestanda.
- MVCC: Cassandra stöder radtidsstämpling men hela MVCC kan inte garanteras. En komprimering kan radera inaktuella data och det finns inget sätt att säga till C* att det inte borde göra det (som med t.ex. en transaktion i PG).
- PostgreSQL stöder en stark MVCC-modell som säkerställer en konsekvent läsväg för våra användare.
- Verktyg: PostgreSQL har många fler verktyg som används i stor utsträckning för att enkelt hantera databasen. Dessutom ett verktyg som flygväg säkerställer att vi upprätthåller en stark versionshantering av databasschemat. Vi har redan framgångsrikt integrerat det med vår kodbas. Det finns ingen motsvarighet till denna mognadsnivå på Cassandra.
- Horisontell skalbarhet: Detta är Cassandras viktigaste försäljningsargument. Lägg bara till fler maskiner när din data expanderar. Ingen motsvarighet för PostgreSQL eftersom sharding och partitionering måste göras manuellt.
Hur vi planerar att skala
Som vi har sett är den enda nackdelen med att använda en Postgres-inställning skalning både på läsning och lagring. Vad kan vi göra för att övervinna denna begränsning?
Det första effektiva verktyget vi har är att separera varje protokoll eller blockchain som vi stödjer till sin egen databas, eftersom den kan skalas på lämpligt sätt med tanke på volymen och trafiken. Segmentering efter affärsdomän säkerställer ett första lager av skalning.
Genom att ta det här konceptet vidare kan vi också segmentera kalla, historiska data i temporär partition. De senaste versionerna av Postgres har förbättrat användbarheten av partitionerade tabeller mycket, vilket kan göra det möjligt att flytta data sömlöst över ett kluster av maskiner. Till exempel skulle vi kunna använda billigare maskiner med mindre beräkningskraft för att vara värd för majoriteten av historisk data, samtidigt som vi behåller kraftiga användarbetjänande RAM-staplade giganter för att vara värd för aggregerade tabeller och användarens senaste operationer.
Det här tillvägagångssättet fungerar mycket bra i vårt användningsfall eftersom det inte finns några främmande nycklar för flera partitioner i historisk lagring (allt är i slutändan kopplat till blocket). Från huvudserverns perspektiv kunde historiska data till och med nås på ett transparent sätt med hjälp av partitionering och postgres_fdw-tillägget.
För att hjälpa till att få allt detta på plats har vi också tittat på tillägget TimescaleDB. Det här tillägget lägger till många funktioner till baslinjens postgres, och de flesta av dessa passar perfekt för våra användningsfall:
- Automatisk partitionering av tabeller baserat på en tidsliknande kolumn (i vårt fall anpassar vi den genom att ta blockchain-höjden som vår referens).
- Automatisk, datatypsmedveten och kolumnbaserad komprimering av äldre bitar. Detta säkerställer ett nästan perfekt kompressionsförhållande genom att använda toppmoderna algoritmer på data som är mycket lika.
- Effektiv tidsbucketbaserad aggregering för att enkelt beräkna historiska saldon och marknadsdatadiagram.
Vi är bara i början av experimenterande angående lagring, och detta låser upp många användningsfall. Bevis på koncept med en liten mängd data (~10 2 block på ethereums huvudnät, alltså cirka XNUMX dagars data) visade diskutrymmesminskning så hög som 40 %.
Som vi har sett är datavolymen, förutsatt att vi använder rätt strategi, inget problem. Men hur skalar man med storleken på vår användarbas?
Vi har redan en bra fördel här: vi indexerar hela blockchain-data. Således kommer lagringen som behövs inte att växa som antalet användare, utan som den totala blockkedjans storlek. Lagrings- och läsoptimeringar är helt ortogonala i sin upplösning.
Denna inställning, i kombination med det mycket låga skrivbehovet i proportion till den läsvolym som måste betjänas, är drömupplägget för ett klassificerande ledare-följare-replikmönster. För att förbättra ytterligare prestanda och genomströmning kan vi också placera postgres read-replikerna på samma maskiner som API-servrarna och dra fördel av UNIX-domänsockets för att hoppa över nätverket tur och retur.
Här är ett exempel på en datareplikeringsstrategi som vi kan använda för att skala våra läsningar. Ljusgrå rutor representerar enstaka servrar. Vi kan se här att API-poddar är direkt samlokaliserade med repliker av de hetaste data för att säkerställa en minimal överföringstid mellan lagring och användare. Arkivinstanser som beskrivs tidigare är inte representerade för att inte komplicera schemat för mycket.
Slutliga anmärkningar
Som en långvarig Cassandra-användare vill jag betona att det är en fantastisk databas i sin design, som passar en mängd olika applikationer. Tyvärr gjordes valet som gjordes på Ledger att använda det på ett dataanvändningsfall som aldrig blev verklighet.
Vårt teams produktivitet påverkades, och när vi såg fram emot de utmaningar vi måste lösa valde vi att bita ihop och att inte falla för det sjunkna kostnadsfelet.
I många fall är din data inte big data. Hantera datadistribution är inte en svår uppgift i de flesta fall, och kompromisserna med en fullfjädrad distribuerad databas måste verkligen övervägas noggrant. Det viktigaste är utvecklarupplevelsen eftersom det frigör värdefull tid för att bygga något annat. Det här är det verkliga användningsfallet vi måste investera mycket i.
- SEO-drivet innehåll och PR-distribution. Bli förstärkt idag.
- PlatoAiStream. Web3 Data Intelligence. Kunskap förstärkt. Tillgång här.
- Minting the Future med Adryenn Ashley. Tillgång här.
- Köp och sälj aktier i PRE-IPO-företag med PREIPO®. Tillgång här.
- Källa: https://www.ledger.com/blog/serving-web3-at-web2-scale
- : har
- :är
- :inte
- $UPP
- 10
- 10K
- 20
- a
- förmåga
- Able
- tillgång
- Accessed
- Konto
- tvärs
- faktiskt
- anpassa
- lägga till
- Lägger
- anslutit sig
- Fördel
- aggregation
- algoritmer
- Alla
- tillåter
- tillåter
- redan
- också
- Även
- mängd
- an
- analys
- analytics
- och
- svara
- vilken som helst
- något
- api
- tillämpningar
- tillämpas
- tillvägagångssätt
- lämpligt
- arkiv
- ÄR
- runt
- Konst
- Artikeln
- AS
- aspekt
- aspekter
- Antagandet
- At
- tillgänglig
- medveten
- bort
- AXLAR
- Axis
- backend
- Balansera
- saldon
- bas
- baserat
- Baslinje
- BE
- därför att
- varit
- innan
- Börjar
- giganter
- Där vi får lov att vara utan att konstant prestera,
- Fördelarna
- mellan
- Stor
- Stora data
- Bit
- Bitcoin
- Blockera
- blockchain
- blockchain-data
- blockchains
- Block
- båda
- Box
- boxar
- Bringar
- Bug
- SLUTRESULTAT
- företag
- men
- by
- Ring
- Samtal
- KAN
- kandidat
- lock
- försiktigt
- Vid
- fall
- Orsak
- orsakas
- centraliserad
- kedja
- utmanar
- utmaningar
- utmanande
- byta
- byte
- billig
- billigare
- billigare maskiner
- val
- Välja
- valde
- valda
- klar
- kluster
- koda
- kodbas
- förkylning
- Kolumn
- kombinerad
- råvara
- Kommunikation
- företag
- komplexiteter
- komponent
- Compute
- begrepp
- Begreppen
- övervägande
- anses
- konsekvent
- kyla
- Kärna
- Pris
- kunde
- skapas
- kritisk
- Aktuella
- datum
- dataanalys
- datadeling
- datalagring
- Databas
- Dagar
- Beslutet
- beskriven
- Designa
- Utvecklare
- utveckla
- svårt
- direkt
- smuts
- distribueras
- fördelning
- dividerat
- do
- gör
- gör
- domän
- inte
- nackdelen
- drömmen
- chaufför
- grund
- e
- varje
- lätt
- lätt
- kant
- Effektiv
- effektiv
- annars
- inbäddade
- betona
- möjliggöra
- uppmuntra
- förbättra
- säkerställa
- säkerställer
- säkerställa
- Motsvarande
- etc
- ethereum
- ETHEREUM MAINNET
- Även
- eventuell
- NÅGONSIN
- Varje
- allt
- exempel
- befintliga
- Exotic
- expanderar
- erfarenhet
- expertis
- utforska
- explorer
- förlänga
- förlängning
- omfattande
- Faktum
- Höst
- Leverans
- Funktioner
- få
- hitta
- Förnamn
- passa
- För
- utländska
- Framåt
- vänlighet
- från
- full
- fullfjädrad
- fullständigt
- funktionaliteter
- ytterligare
- framtida
- få
- ges
- Globalt
- Målet
- kommer
- grafer
- grå
- stor
- Grupp
- Väx
- Odling
- garanterat
- riktlinjer
- hade
- Hård
- hårdvara
- Har
- har
- huvud
- kraftigt
- höjd
- hjälpa
- här.
- Hög
- höggradigt
- historisk
- värd
- HET
- hetaste
- Hur ser din drömresa ut
- How To
- Men
- html
- HTTPS
- i
- idealisk
- if
- oföränderlig
- påverkade
- genomföra
- förbättras
- in
- alltmer
- index
- index
- exempel
- integrerade
- interaktiva
- in
- Invest
- involverade
- fråga
- problem
- IT
- DESS
- delta
- fogade
- jpg
- bara
- hålla
- Nyckel
- nycklar
- Snäll
- Brist
- språk
- Large
- Latens
- senaste
- lager
- Led
- Ledger
- legitim
- mindre
- Nivå
- Hävstång
- ljus
- lättvikt
- tycka om
- begränsning
- begränsningar
- Begränsad
- Lista
- liten
- lokalt
- Lång
- såg
- du letar
- Lot
- Låg
- Maskiner
- gjord
- Huvudsida
- huvudnätet
- bibehålla
- Majoritet
- Framställning
- hantera
- hantera
- manuellt
- många
- marknad
- Market Data
- förfall
- max-bredd
- Maj..
- betyder
- metall
- migrera
- minimum
- uppdrag
- modell
- modellering
- mer
- Dessutom
- mest
- flytta
- mycket
- måste
- nämligen
- nästan
- Behöver
- behövs
- behov
- Varken
- nät
- aldrig
- Nya
- trevligt
- Nej
- noder
- inget
- antal
- talrik
- mål
- of
- on
- ONE
- endast
- driva
- Verksamhet
- möjligheter
- or
- beställa
- vår
- själva
- över
- Övervinna
- egen
- betalas
- del
- parter
- bana
- Mönster
- Betala
- jämlikar
- peer-to-peer
- perfekt
- prestanda
- perspektiv
- Plats
- Planen
- plato
- Platon Data Intelligence
- PlatonData
- pods
- Punkt
- policy
- Polygon
- möjlig
- PostgreSQL
- potentiell
- kraft
- den mäktigaste
- praktiken
- Problem
- processer
- produktivitet
- bevis
- andel
- föreslår
- protokoll
- beprövade
- ge
- förutsatt
- sätta
- sökfrågor
- RAM
- område
- Betygsätta
- snarare
- ratio
- Raw
- Läsa
- verklig
- verkligen
- rimlig
- reduktion
- om
- relaterad
- pålitlig
- omorganisation
- svara
- replikation
- representerar
- representerade
- begära
- elastisk
- Upplösning
- löst
- resulterande
- återanvända
- höger
- robusta
- rot
- rund
- RAD
- Körning
- rinnande
- Samma
- Skala
- skalbar
- Skala
- skalning
- sömlöst
- Sök
- säkerhet
- se
- sett
- segmentet
- segmentering
- Försäljningen
- Försäljningsargument
- service
- Tjänster
- portion
- in
- inställning
- flera
- sharding
- delning
- Kort
- show
- sida
- liknande
- eftersom
- enda
- Storlek
- färdigheter
- Small
- mindre
- smarta
- So
- lösning
- LÖSA
- Löser
- några
- Utrymme
- Gnista
- spawn
- SQL
- standard
- Ange
- .
- förvaring
- lagra
- Historia
- Strategisk
- Strategi
- stark
- starkt
- Framgångsrikt
- stödja
- Stöder
- bord
- Ta
- tar
- uppgift
- grupp
- Teknisk
- tala
- villkor
- än
- den där
- Smakämnen
- Kvarteret
- Staten
- deras
- sedan
- Där.
- Dessa
- de
- Tredje
- utomstående
- detta
- genomströmning
- tid
- till
- alltför
- verktyg
- verktyg
- Totalt
- TOTALT
- trafik
- transaktion
- Transaktioner
- överföring
- transparent
- Typ
- typer
- Ytterst
- under
- underliggande
- tyvärr
- unix
- låser upp
- onödigt
- us
- användbarhet
- Användning
- användning
- användningsfall
- Begagnade
- Användare
- användare
- med hjälp av
- vanligen
- Värdefulla
- mängd
- vertikal
- mycket
- volym
- vill
- var
- Sätt..
- we
- Web2
- Web3
- VÄL
- Vad
- Vad är
- när
- som
- medan
- Medan
- Hela
- varför
- bred
- brett
- kommer
- med
- utan
- fungerar
- skriva
- skriven
- dig
- Yngst
- Din
- zephyrnet