Een groot gebruikersbestand bedienen met betrouwbare, consistente en lage latentiegegevens is een zeer zware uitdaging voor elk backend-team. Bij Ledger hebben we de strategische keuze gemaakt om onze eigen blockchain-kerndataservices te hosten. Door niet afhankelijk te zijn van derden, kunnen we de gegevens van onze klanten zelf beheren, zodat de onderliggende processen voldoen aan onze beveiligingsrichtlijnen en prestatiegerichte Service Level Objectives (SLO).
Maar deze strategie brengt ook zijn eigen uitdagingen met zich mee.
Onze eerste uitdaging is om deze essentiële dataleverende diensten te migreren, weg van coole en glanzende noSQL-tools. In dit artikel zal ik dieper ingaan op de redenen waarom we deze moeilijke beslissing hebben genomen, de complexiteiten waarmee we te maken hebben gehad en de voordelen die we hebben geplukt.
Het doel van dit artikel is om de technische aspecten te laten zien die ertoe hebben geleid dat we PostgreSQL hebben gekozen als onze nieuwe basisopslaglaag voor blockchain-gegevens.
Duik diep in Blockchain-gegevens
Blockchain-gegevens hebben verschillende belangrijke kenmerken.
Ten eerste groeit het altijd en wordt er nooit iets uit verwijderd. Hoewel het grootste deel van een blockchain in de praktijk onveranderlijk is, kan het jongste deel van de blockchain in de praktijk echter veranderen als gevolg van conflicten die moeten worden opgelost. Aangezien de keten een peer-to-peer-netwerk is, kunnen verschillende legitieme blokken tijdelijk naast elkaar bestaan. Meestal wordt de oudere verwijderd, wat resulteert in wat we een reorganisatie noemen. Om een lang verhaal kort te maken, de gegevens zijn verdeeld tussen een onveranderlijke koude staart en een zelden veranderende hoofdtoestand.
Het probleem dat we proberen op te lossen, is dat hoewel blockchains geweldig zijn voor het hebben van byzantijnse fouttolerante gegevens, ze minder effectief zijn om het over vele assen te snijden en in blokjes te snijden. Het is namelijk erg moeilijk om de lijst met bewerkingen te krijgen die een account hebben beïnvloed. Zelfs het verkrijgen van een rekeningsaldo op een blockchain zoals bitcoin is een uitdaging als je de lijst met transacties nog niet hebt.
Om deze uitdagingen het hoofd te bieden, indexeert Ledger Explorer Services de hele blockchain. Het is een grote, kritieke en prestatiegevoelige service die volledig is geschreven in Scala, met behulp van de katten-effect looptijd met hoge prestaties. We zijn meer dan 10 rps op bitcoin, terwijl we een staart p95-latentie van minder dan 100 ms behouden. We zijn ook aan het werven 😊.
Een beetje geschiedenis
Aan het begin van ons verhaal, lang voordat ik bij het bedrijf kwam, werd de Ledger-gegevensservicelaag afgehandeld door een ingebouwde Neo4j-database. Elke serveerbox indexeerde zijn eigen gegevens en deed deze lokaal, wat veel problemen veroorzaakte.
Gegevensconsistentie tussen instanties was niet gegarandeerd en de enorme omvang van de staat die moest worden geïndexeerd, gecombineerd met neo4j-schijf- en ramgebruik, was niet schaalbaar. Dit probleem werd alleen maar erger naarmate het bedrijf groeide, waardoor het steeds moeilijker werd om nieuwe instanties te spawnen.
Cassandra werd vervolgens gekozen als de belangrijkste drijfveer van deze nieuwe opzet: het is een geclusterde, horizontaal schaalbare database die zich aan de AP-kant van de CAP-stelling bevindt. Het lost de problemen op die verband houden met het delen van gegevens en zorgt voor een duidelijke scheiding tussen de indexering, de blockchain-bewuste component en de headless API-servers.
Maar wat heeft het voor zin om de hele historische staat beschikbaar te hebben als we er nooit echt uit gaan lezen?
Met betrekking tot onze use-case zijn ruwe historische gegevens zelden nodig omdat de accountstatus van onze gebruiker daaruit kan worden samengesteld. Dit bracht ons ertoe de bestaande oplossing voor gegevensopslag, die is gebaseerd op de door Cassandra gedistribueerde database, uit te dagen.
Het volume aan gegevens dat we per blockchain moeten opslaan, hoewel in het bereik van terabytes, is niet wat men "big data" kan noemen. Bovendien is het deel van if dat zal worden gebruikt om de meeste vragen te beantwoorden (ook bekend als The Hot Path) nog kleiner. Tegenwoordig kan men gemakkelijk commodity-hardwareservers vinden met meer dan 16 TB aan NVMe SSD-opslag. Verticaal schalen is een zeer krachtige tool, en een relationele database ook.
Ten slotte was het belangrijkste probleem dat we hadden met de huidige cassandra-opstelling niet het verkwistende opslagmodel of de slecht passende use-case voor gegevens, maar het gebrek aan ontwikkelaarvriendelijkheid. Het ontwikkelen van een nieuwe op gegevens gebaseerde functie op Cassandra is onnodig tijdrovend gebleken. We hebben gestreefd naar het implementeren van elke nieuwe as waarover we gegevens moeten verstrekken.
Gezien de expertise van ons team op het gebied van gegevensmodellering en SQL-vaardigheid, PostgreSQL bleek de perfecte kandidaat. Deze oplossing is Battle-tested, robuust, eenvoudig uit te breiden, waardoor het een ideale keuze is.
Waarom we SQL verkozen boven NoSQL:
- Leest/schrijft saldi: de use-case van blockchain-gegevens is sterk scheefgetrokken over lezen in plaats van schrijven (blockchain schrijft zeer weinig gegevens tegen een zeer redelijke snelheid, zelfs voor een blockchain zoals Polygon). Cassandra heeft het vermogen om zeer veel schrijfbewerkingen te absorberen - het leespad is eigenlijk langer dan het schrijfpad.
- Ondersteuning voor indexering: Indices zijn een belangrijk onderdeel van een DBMS om vragen en nieuwe businesscases of kansen te beantwoorden. Cassandra heeft beperkte ondersteuning voor indexering. Indexen zijn alleen effectief als de query al een manier specificeert om de partitie waarop de query wordt uitgevoerd te beperken. Wij betalen hier de kosten om een willekeurig verdeeld databank. PostgreSQL-ondersteuning voor indices is efficiënt, uitbreidbaar en grensverleggend.
- Aggregatie ondersteuning: Hetzelfde geval voor aggregatie; aangezien Cassandra geen aggregatie van meerdere partities toestaat en geen GROUP BY-component tolereert in zijn querytaal, ontbreekt de ondersteuning ervan. PostgreSQL biedt uitgebreide ondersteuning voor aggregatie, zelfs op exotische gegevenstypen zoals bereiken en jsonb-blobs.
- Datamodellering: Cassandra is zeer, zeer beperkend in de manier waarop datamodellering mogelijk is. Er moet een tabel worden gemaakt voor bijna elk verzoek dat u wilt beantwoorden, en de gegevens moeten worden gedenormaliseerd in grote rijen (waarbij de brede kolom winkel aspect van C* en ook het feit dat schrijvers spotgoedkoop zijn). PostgreSQL stelt ons in staat om het relationele aspect van de blockchain (oproepen, transacties, blokken) en reserveschijfruimte te benutten, waardoor hergebruik van gegevens wordt aangemoedigd.
- Ad-hocvragen en auditing: Door de volledige standaard van SQL te kunnen gebruiken en willekeurige zoekopdrachten uit te voeren, kunnen we de mogelijke hoofdoorzaak van bugs verkennen en zoeken, of kunnen we verkennende gegevens hebben voor toekomstige gebruikssituaties. We kunnen de database echt gebruiken als een interactieve en slimme tool in plaats van als een domme opslag. Dit doen we op Cassandra zonder een uitgebreid en kostbaar analytisch rekencluster zoals Presto, Spark, etc. (en aangezien we op bare metal-servers draaien, hebben we geen toegang tot gemakkelijk voortgebrachte gedistribueerde data-analysetools zoals EMR).
- Opslaggebruik: De aanname van Cassandra is dat opslag erg goedkoop is en dat het cluster eenvoudig kan worden uitgebreid met nieuwe machines. Dat betekent dat alle beperkingen op zowel indexen als aggregaties moeten worden betaald met opslag. Geen wereldwijd efficiënte indices en join-ondersteuning betekent dat we moeten denormaliseren en een kopie van de hele tabel moeten opslaan voor elke as die we willen opvragen. PostgreSQL bespaart ons terabytes aan opslagruimte.
- Consistentie: Aangezien Cassandra een gedistribueerde, AP-georiënteerde database is (communicatie vindt plaats met roddelen tussen knooppunten), is consistentie alleen uiteindelijk in termen van schrijfbewerkingen. U kunt het consistentiebeleid van elke instructie voor zowel lezen als schrijven afstemmen, maar het doel van deze database was nooit om sterke consistentie te hebben. PostgreSQL heeft een sterk verhaal van gebruik voor kritieke missies en is zeer veerkrachtig. Gecentraliseerd zijn betekent ook dat er geen netwerk betrokken is bij het schrijfpad.
- Transacties en MVCC:
- Transacties: Cassandra ondersteunt alleen lichtgewicht transacties op DML-query's. Sommige batching kan worden toegepast (dok) maar er zijn tal van voorbehoud, namelijk dat de rijen zich op dezelfde server (= partitie) moeten bevinden om geen afschuwelijke prestaties te hebben.
- MVCC: Cassandra ondersteunt rijtijdstempeling, maar de volledige MVCC is niet gegarandeerd. Een verdichting kan verouderde gegevens wissen en er is geen manier om C* te vertellen dat dit niet zou moeten (zoals bij bijvoorbeeld een transactie in PG).
- PostgreSQL ondersteunt een sterk MVCC-model dat zorgt voor een consistent leespad voor onze gebruikers.
- Tooling: PostgreSQL heeft veel meer tools die veel worden gebruikt om de database eenvoudig te bedienen. Bovendien is een tool als vliegroute zorgt ervoor dat we een sterk versiebeheer van het databaseschema behouden. We hebben het al met succes geïntegreerd in onze codebase. Er is geen equivalent met dit niveau van volwassenheid op Cassandra.
- Horizontale schaalbaarheid: Dit is het belangrijkste verkoopargument van Cassandra. Voeg gewoon meer machines toe naarmate uw gegevens toenemen. Geen equivalent voor PostgreSQL omdat sharding en partitionering handmatig moeten worden gemaakt.
Hoe we van plan zijn om te schalen
Zoals we hebben gezien, is het enige nadeel van het gebruik van een Postgres-configuratie het schalen van zowel leesbewerkingen als opslag. Wat kunnen we doen om deze beperking te overwinnen?
De eerste effectieve tool die we hebben, is om elk protocol of elke blockchain die we ondersteunen te scheiden in zijn eigen database, zodat deze op de juiste manier kan worden geschaald gezien het volume en het verkeer. Segmentatie per bedrijfsdomein zorgt voor een eerste laag van schaalvergroting.
Door dit concept verder uit te werken, kunnen we ook koude, historische gegevens segmenteren in tijdelijke partities. De nieuwste versies van Postgres hebben de bruikbaarheid van gepartitioneerde tabellen aanzienlijk verbeterd, waardoor gegevens naadloos over een cluster van machines kunnen worden verplaatst. We zouden bijvoorbeeld goedkopere machines met minder rekenkracht kunnen gebruiken om het merendeel van de historische gegevens te hosten, terwijl we krachtige, op RAM gestapelde reuzen voor gebruikers kunnen houden om geaggregeerde tabellen en de nieuwste bewerkingen van de gebruiker te hosten.
Deze aanpak werkt erg goed in onze use case omdat er geen cross-partition externe sleutels in de historische opslag zijn (alles is uiteindelijk aan het blok gekoppeld). Vanuit het perspectief van de hoofdserver kunnen historische gegevens zelfs transparant worden benaderd met behulp van partitionering en de postgres_fdw-extensie.
Om dit allemaal op zijn plek te helpen, hebben we ook gekeken naar de TimescaleDB-extensie. Deze extensie voegt veel functionaliteiten toe aan baseline postgres, en de meeste hiervan passen perfect bij onze use cases:
- Automatische partitionering van tabellen op basis van een tijdachtige kolom (in ons geval passen we deze aan door de blockchain-hoogte als referentie te nemen).
- Automatische, gegevenstypebewuste en op kolommen gebaseerde compressie van oudere chunks. Dit zorgt voor een bijna perfecte compressieverhouding door gebruik te maken van geavanceerde algoritmen op gegevens die sterk op elkaar lijken.
- Efficiënte op tijd gebaseerde aggregatie om eenvoudig historische saldi en marktgegevensgrafieken te berekenen.
We staan nog maar aan het begin van experimenten met betrekking tot opslag, en dit ontgrendelt veel use-cases. Bewijs van concepten met behulp van een kleine hoeveelheid gegevens (~ 10 blokken op het ethereum-mainnet, dus ongeveer 2 dagen aan gegevens) toonde schijfruimtereductie zo hoog als 40%.
Zoals we hebben gezien, is datavolume, mits we de juiste strategie gebruiken, geen probleem. Maar hoe te schalen met de grootte van ons gebruikersbestand?
We hebben hier al een mooi voordeel: we indexeren de gehele blockchain data. De benodigde opslagruimte zal dus niet groeien zoals het aantal gebruikers, maar zoals de totale blockchain-omvang. Opslag- en leesoptimalisaties zijn volledig orthogonaal in hun resolutie.
Deze opstelling, gecombineerd met de zeer lage schrijfbehoefte in verhouding tot het leesvolume dat moet worden bediend, is de gedroomde opstelling voor een classing leider-volger replicapatroon. Om de prestaties en doorvoer verder te verbeteren, kunnen we de postgres-leesreplica's ook op dezelfde machines plaatsen als de API-servers en profiteren van de UNIX-domeinsockets om de netwerkrondreizen over te slaan.
Hier is een voorbeeld van een strategie voor gegevensreplicatie die we zouden kunnen gebruiken om onze reads te schalen. Lichtgrijze vakken vertegenwoordigen afzonderlijke servers. We kunnen hier zien dat API-pods zich direct op dezelfde locatie bevinden als replica's van de populairste gegevens om een minimale overdrachtstijd tussen opslag en gebruikers te garanderen. Eerder beschreven archiefexemplaren worden niet weergegeven om het schema niet te ingewikkeld te maken.
Slotopmerkingen
Als Cassandra-gebruiker op de lange termijn wil ik benadrukken dat het een geweldige database is qua ontwerp, die geschikt is voor een breed scala aan toepassingen. Helaas is de keuze die bij Ledger is gemaakt om het te gebruiken, gemaakt op basis van een data use case die nooit is uitgekomen.
De productiviteit van ons team werd beïnvloed en we kijken uit naar de uitdagingen die we moeten oplossen.
In veel gevallen zijn uw gegevens geen big data. Het beheren van gegevensdistributie is in de meeste gevallen geen moeilijke taak, en de afwegingen van een volwaardige gedistribueerde database moeten echt zorgvuldig worden overwogen. De belangrijkste overweging is de ervaring van de ontwikkelaar, omdat het waardevolle tijd vrijmaakt om iets anders te bouwen. Dit is de echte use-case waarin we zwaar moeten investeren.
- Door SEO aangedreven content en PR-distributie. Word vandaag nog versterkt.
- PlatoAiStream. Web3 gegevensintelligentie. Kennis versterkt. Toegang hier.
- De toekomst slaan met Adryenn Ashley. Toegang hier.
- Koop en verkoop aandelen in PRE-IPO-bedrijven met PREIPO®. Toegang hier.
- Bron: https://www.ledger.com/blog/serving-web3-at-web2-scale
- : heeft
- :is
- :niet
- $UP
- 10
- 10K
- 20
- a
- vermogen
- in staat
- toegang
- geraadpleegde
- Account
- over
- werkelijk
- aanpassen
- toevoegen
- Voegt
- aanhangen
- Voordeel
- aggregatie
- algoritmen
- Alles
- toelaten
- toestaat
- al
- ook
- Hoewel
- bedragen
- an
- analyse
- analytics
- en
- beantwoorden
- elke
- iets
- api
- toepassingen
- toegepast
- nadering
- op gepaste wijze
- Archief
- ZIJN
- rond
- Kunst
- dit artikel
- AS
- verschijning
- aspecten
- aanname
- At
- Beschikbaar
- bewust
- weg
- ASSEN
- As
- backend
- Balance
- saldi
- baseren
- gebaseerde
- Baseline
- BE
- omdat
- geweest
- vaardigheden
- Begin
- kolossen
- wezen
- betekent
- tussen
- Groot
- Big data
- Beetje
- Bitcoin
- Blok
- blockchain
- blockchain-gegevens
- blokketens
- Blokken
- zowel
- Box camera's
- dozen
- Brengt
- Bug
- bouw
- bedrijfsdeskundigen
- maar
- by
- Bellen
- oproepen
- CAN
- kandidaat
- pet
- voorzichtig
- geval
- gevallen
- Veroorzaken
- veroorzaakt
- gecentraliseerde
- keten
- uitdagen
- uitdagingen
- uitdagend
- verandering
- veranderende
- goedkoop
- goedkoper
- goedkopere machines
- keuze
- Kies
- koos
- uitgekozen
- duidelijk
- TROS
- code
- codebasis
- koud
- Kolom
- gecombineerde
- koopwaar
- Communicatie
- afstand
- complexiteit
- bestanddeel
- Berekenen
- concept
- concepten
- overweging
- beschouwd
- consequent
- Coole
- Kern
- Kosten
- kon
- aangemaakt
- kritisch
- Actueel
- gegevens
- gegevensanalyse
- het delen van gegevens
- gegevensopslag
- Database
- dagen
- beslissing
- beschreven
- Design
- Ontwikkelaar
- het ontwikkelen van
- moeilijk
- direct
- vuil
- verdeeld
- distributie
- Verdeeld
- do
- doet
- doen
- domein
- Dont
- keerzijde
- droom
- bestuurder
- twee
- e
- elk
- gemakkelijk
- En het is heel gemakkelijk
- rand
- effectief
- doeltreffend
- anders
- ingebed
- benadrukken
- in staat stellen
- bemoedigend
- verhogen
- verzekeren
- waarborgt
- zorgen
- Gelijkwaardig
- etc
- ethereum
- ETHEREUM HOOFDNET
- Zelfs
- eventueel
- OOIT
- Alle
- alles
- voorbeeld
- bestaand
- Exotisch
- breidt uit
- ervaring
- expertise
- Verken
- ontdekkingsreiziger
- verlengen
- uitbreiding
- uitgebreid
- feit
- Vallen
- Kenmerk
- Voordelen
- weinig
- VIND DE PLEK DIE PERFECT VOOR JOU IS
- Voornaam*
- geschikt
- Voor
- vreemd
- Naar voren
- vriendelijkheid
- oppompen van
- vol
- volwaardig
- geheel
- functionaliteiten
- verder
- toekomst
- het krijgen van
- gegeven
- Wereldwijd
- doel
- gaan
- grafieken
- grijs
- groot
- Groep
- Groeien
- Groeiend
- gegarandeerde
- richtlijnen
- HAD
- Hard
- Hardware
- Hebben
- met
- hoofd
- hard
- Hoogte
- hulp
- hier
- Hoge
- zeer
- historisch
- gastheer
- Populair
- heetste
- Hoe
- How To
- Echter
- HTML
- HTTPS
- i
- ideaal
- if
- onveranderlijk
- beïnvloed
- uitvoering
- verbeterd
- in
- in toenemende mate
- index
- Index
- instantie
- geïntegreerde
- interactieve
- in
- Investeren
- betrokken zijn
- kwestie
- problemen
- IT
- HAAR
- mee
- toegetreden
- jpg
- voor slechts
- houden
- sleutel
- toetsen
- Soort
- Gebrek
- taal
- Groot
- Wachttijd
- laatste
- lagen
- LED
- Grootboek
- rechtmatig
- minder
- Niveau
- Hefboomwerking
- licht
- lichtgewicht
- als
- beperking
- beperkingen
- Beperkt
- Lijst
- Elke kleine stap levert grote resultaten op!
- plaatselijk
- lang
- keek
- op zoek
- lot
- Laag
- Machines
- gemaakt
- Hoofd
- mainnet
- onderhouden
- Meerderheid
- maken
- beheer
- beheren
- handmatig
- veel
- Markt
- Marktgegevens
- зрелость
- max-width
- Mei..
- middel
- metaal
- trekken
- minimaal
- missies
- model
- modellering
- meer
- Bovendien
- meest
- beweging
- veel
- Dan moet je
- namelijk
- bijna
- Noodzaak
- nodig
- behoeften
- Noch
- netwerk
- nooit
- New
- mooi
- geen
- knooppunten
- niets
- aantal
- vele
- doelstellingen
- of
- on
- EEN
- Slechts
- besturen
- Operations
- Kansen
- or
- bestellen
- onze
- onszelf
- over
- Overwinnen
- het te bezitten.
- betaald
- deel
- partijen
- pad
- Patronen
- Betaal
- turen
- Bestandenuitwisseling
- prestatie
- perspectief
- plaats
- plan
- Plato
- Plato gegevensintelligentie
- PlatoData
- peulen
- punt
- beleidsmaatregelen
- Veelhoek
- mogelijk
- postgresql
- potentieel
- energie
- krachtige
- praktijk
- probleem
- processen
- produktiviteit
- bewijs
- proportie
- stelt
- protocol
- bewezen
- zorgen voor
- mits
- zetten
- queries
- RAM
- reeks
- tarief
- liever
- verhouding
- Rauw
- Lees
- vast
- werkelijk
- redelijk
- reductie
- met betrekking tot
- verwant
- betrouwbaar
- reorganisatie
- antwoord
- kopiëren
- vertegenwoordigen
- vertegenwoordigd
- te vragen
- veerkrachtig
- Resolutie
- opgelost
- verkregen
- hergebruiken
- rechts
- robuust
- wortel
- ronde
- RIJ
- lopen
- lopend
- dezelfde
- Scala
- schaalbare
- Scale
- scaling
- naadloos
- Ontdek
- veiligheid
- zien
- gezien
- segment
- segmentatie
- binnen XNUMX minuten
- verkooppunt
- service
- Diensten
- serveer-
- reeks
- setup
- verscheidene
- sharding
- delen
- Bermuda's
- tonen
- kant
- gelijk
- sinds
- single
- Maat
- vaardigheden
- Klein
- kleinere
- slim
- So
- oplossing
- OPLOSSEN
- Lost op
- sommige
- Tussenruimte
- Vonk
- Paaien
- SQL
- standaard
- Land
- Statement
- mediaopslag
- shop
- Verhaal
- strategisch
- Strategie
- sterke
- sterk
- Met goed gevolg
- ondersteuning
- steunen
- tafel
- Nemen
- het nemen
- Taak
- team
- Technisch
- vertellen
- termen
- neem contact
- dat
- De
- Het blok
- De Staat
- hun
- harte
- Er.
- Deze
- ze
- Derde
- derden
- dit
- doorvoer
- niet de tijd of
- naar
- ook
- tools
- tools
- Totaal
- TOTAAL
- verkeer
- transactie
- Transacties
- overdracht
- transparant
- type dan:
- types
- Tenslotte
- voor
- die ten grondslag liggen
- helaas
- unix
- ontsluit
- onnodig
- us
- bruikbaarheid
- Gebruik
- .
- use case
- gebruikt
- Gebruiker
- gebruikers
- gebruik
- doorgaans
- waardevol
- variëteit
- verticaal
- zeer
- volume
- willen
- was
- Manier..
- we
- Web2
- Web3
- GOED
- Wat
- Wat is
- wanneer
- welke
- en
- Terwijl
- geheel
- Waarom
- breed
- wijd
- wil
- Met
- zonder
- Bedrijven
- schrijven
- geschreven
- u
- jongste
- Your
- zephyrnet