Suure kasutajabaasi teenindamine usaldusväärsete, järjepidevate ja madala latentsusajaga andmetega on igale taustameeskonnale väga raske väljakutse. Ledgeris tegime strateegilise valiku oma plokiahela põhiandmeteenuste hostimiseks. Kui me ei usalda kolmandaid osapooli, saame oma klientide andmeid ise hallata, tagades, et aluseks olevad protsessid järgivad meie turvajuhiseid ja toimivusele orienteeritud teenusetaseme eesmärke (SLO).
Kuid see strateegia toob kaasa ka oma väljakutsed.
Meie esimene väljakutse on viia need põhilised andmeid pakkuvad teenused lahedatest ja säravatest noSQL-tööriistadest eemale. Selles artiklis uurin, miks me selle raske otsuse tegime, milliseid keerukusi me kokku puutusime ja millist kasu me sellest saime.
Selle artikli eesmärk on näidata tehnilisi aspekte, mille tõttu valisime PostgreSQL-i uueks plokiahela andmete salvestuskihiks.
Sukelduge Blockchaini andmetesse
Plokiahela andmetel on mitu põhifunktsiooni.
Esiteks, see kasvab pidevalt ja sellest ei kustutata kunagi midagi. Kuigi praktikas on suurem osa plokiahelast muutumatu, võib plokiahela noorim osa lahendamist vajavate konfliktide tõttu muutuda. Tõepoolest, kuna kett on peer-to-peer-võrk, võib ajutiselt koos eksisteerida mitu seaduslikku plokki. Tavaliselt kustutatakse vanem, mille tulemuseks on nn ümberkorraldamine. Lühidalt öeldes jagunevad andmed muutumatu külma saba ja harva muutuva pea oleku vahel.
Probleem, mida püüame lahendada, seisneb selles, et kuigi plokiahelad sobivad suurepäraselt Bütsantsi tõrketaluvusega andmete omamiseks, on need vähem tõhusad nende viilutamiseks ja lõikamiseks paljudel telgedel. Nimelt on kontot mõjutanud toimingute nimekirja saamine väga keeruline. Isegi kontojäägi saamine plokiahelas nagu bitcoin on väljakutse, kui teil pole veel tehingute loendit.
Nendest väljakutsetest ülesaamiseks indekseerib Ledger Explorer Services kogu plokiahela. See on suur, kriitiline ja jõudlustundlik teenus, mis on täielikult kirjutatud Scalas, kasutades kasside efekt suure jõudlusega käitusaeg. Oleme bitcoinil üle 10 95 rps, säilitades samas saba p100 latentsuse alla XNUMX ms. Tegeleme ka värbamisega 😊.
Natuke ajaloost
Meie loo alguses, enne kui ma ettevõttega liitusin, haldas Ledgeri andmeteenuste kihti sisseehitatud Neo4j andmebaas. Iga serveerimiskast indekseeris oma andmeid ja teenindas neid kohapeal, mis põhjustas palju probleeme.
Andmete järjepidevus eksemplaride vahel ei olnud garanteeritud ja indekseerimist vajava oleku suurus koos neo4j-ketta ja RAM-i kasutamisega ei olnud skaleeritav. See probleem süvenes ettevõtte kasvades, muutes uute juhtumite loomise üha keerulisemaks.
Cassandra Seejärel valiti selle uue seadistuse peamiseks juhiks: see on rühmitatud, horisontaalselt skaleeritav andmebaas, mis asub CAP teoreemi AP poolel. See lahendab andmete jagamisega seotud probleemid ja võimaldab selgelt eraldada indekseerimise, plokiahelateadliku komponendi ja peata API serverid.
Aga mis mõtet on kogu ajaloolise seisundi kättesaadavusel, kui me sellest kunagi tegelikult välja ei loe?
Seoses meie kasutusjuhtumiga on ajaloolisi töötlemata andmeid harva vaja, kuna meie kasutajakonto oleku saab nende põhjal koondada. See pani meid vaidlustama olemasolevat andmesalvestuslahendust, mis põhineb Cassandra hajutatud andmebaasil.
Andmemaht, mida peame plokiahela kohta salvestama, ehkki jääb terabaidivahemikku, ei ole see, mida võiks nimetada "suurteks andmeteks". Veelgi enam, selle osa, mida kasutatakse enamikule päringutele vastamiseks (teise nimega kuum tee), on veelgi väiksem. Tänapäeval on lihtne leida riistvaraservereid, millel on rohkem kui 16 TB NVMe SSD salvestusruumi. Vertikaalne skaleerimine on väga võimas tööriist ja ka relatsiooniandmebaas.
Lõpuks, peamine probleem, mis meil praeguse cassandra seadistuse puhul oli, ei olnud raiskav salvestusmudel ega halvasti sobitatud andmete kasutusjuht, vaid arendajasõbralikkuse puudumine. Cassandra uue andmepõhise funktsiooni väljatöötamine on osutunud tarbetult aeganõudvaks. Püüdsime rakendada iga uut telge, mille kohta peame andmeid esitama.
Arvestades meie meeskonna teadmisi andmemodelleerimise oskuste ja SQL-i oskuste vallas, PostgreSQL oli ideaalne kandidaat. See lahendus on lahingutes testitud, vastupidav, kergesti pikendatav, mistõttu on see ideaalne valik.
Miks me valisime SQL-i NoSQL-i asemel:
- Loeb / kirjutab saldosid: plokiahela andmete kasutamise juhtum on pigem lugemise kui kirjutamise suhtes kaldu (plokiahel kirjutab väga vähe andmeid väga mõistliku kiirusega, isegi sellise plokiahela nagu Polygon puhul). Cassandral on võime absorbeerida väga palju kirjutisi – lugemistee on tegelikult see enam kui kirjutamistee.
- Indekseerimise tugi: indeksid on DBMS-i põhikomponent, et vastata päringutele ja uutele ärijuhtumitele või võimalustele. Cassandral on indekseerimise tugi piiratud. Indeksid on tõhusad ainult siis, kui päring juba määrab viisi päringu käitamise partitsiooni piiramiseks. Maksame siin omamise kulud meelevaldselt jaotatud andmebaasi. PostgreSQL-i indeksite tugi on tõhus, laiendatav ja äärel.
- Liitmise tugi: sama juhtum liitmisel; kuna Cassandra ei luba mitme partitsiooniga liitmist ega salli oma päringukeeles GROUP BY klauslit, on selle tugi kuidagi puudulik. PostgreSQL pakub ulatuslikku koondamise tuge isegi eksootiliste andmetüüpide puhul, nagu vahemikud ja jsonb-blobid.
- Andmete modelleerimine: Cassandra on andmete modelleerimise võimalikkuse osas väga-väga piirav. Peaaegu iga päringu jaoks, millele soovite vastata, tuleb luua tabel ja andmed tuleb denormaliseerida suurteks ridadeks (kasutades täielikult lai veergude kauplus aspekt C* ja ka asjaolu, et kirjanikud on ropult odavad). PostgreSQL võimaldab meil ära kasutada plokiahela relatsioonilist aspekti (kõned, tehingud, plokid) ja varuda kettaruumi, soodustades andmete taaskasutamist.
- Ad-hoc päringud ja auditeerimine: Võimalus kasutada SQL-i täisstandardit ja teha suvalisi päringuid tähendab, et saame uurida ja otsida võimalikke vea algpõhjuseid või omada uurimuslikke andmeid tulevaste kasutusjuhtude jaoks. Saame tõesti kasutada andmebaasi pigem interaktiivse ja nutika tööriistana kui lolli salvestusruumina. Tehes seda Cassandras ilma ulatusliku ja kuluka analüütikaarvutusklastrita, nagu Presto, Spark jne (ja kuna me töötame metallist serverites, pole meil juurdepääsu hõlpsasti loodud hajutatud andmeanalüüsi tööriistadele, nagu EMR).
- Storage kasutamine: Cassandra eeldus on, et ladustamine on väga odav ja klastrit saab hõlpsasti uute masinatega laiendada. See tähendab seda kõigi indeksite ja agregaatide piirangute eest tuleb tasuda koos ladustamisega. Globaalselt tõhusate indeksite puudumine ja liitumise tugi tähendab, et peame denormaliseerima ja salvestama kogu tabeli koopia iga telje jaoks, mida soovime päringuid teha. PostgreSQL säästab meile terabaiti salvestusruumi.
- järjepidevus: Kuna Cassandra on hajutatud, AP-le orienteeritud andmebaas (suhtlus toimub sõlmede vahel lobisedes), on järjepidevus ainult kirjutamise osas. Saate häälestada iga lause järjepidevuse poliitikat nii lugemise kui ka kirjutamise jaoks, kuid selle andmebaasi eesmärk ei olnud kunagi olla tugev järjepidevus. PostgreSQL-il on tugev lugu selle kasutamisest kriitiliste missioonide jaoks ja see on väga vastupidav. Tsentraliseeritud olemine tähendab ka seda, et kirjutusteega pole kaasatud ühtegi võrku.
- Tehingud ja MVCC:
- Tehingud: Cassandra toetab ainult kergeid tehinguid DML-päringute puhul. Mõne partii saab rakendada (doc), kuid seal on palju hoiatusi, nimelt peavad read olema samas serveris (= partitsioonis), et mitte anda kohutavat jõudlust.
- MVCC: Cassandra toetab reaaja tembeldamist, kuid täielik MVCC ei ole garanteeritud. Tihendamine võib aegunud andmed kustutada ja C*-le ei saa kuidagi öelda, et seda ei tohiks teha (nagu näiteks PG tehingu puhul).
- PostgreSQL toetab tugevat MVCC mudelit, mis tagab meie kasutajatele järjepideva lugemistee.
- Instrumentaarium: PostgreSQL-il on palju rohkem tööriistu, mida kasutatakse laialdaselt andmebaasi hõlpsaks kasutamiseks. Pealegi tööriist nagu lennurada tagab, et säilitame andmebaasiskeemi tugeva versiooni. Integreerisime selle juba edukalt oma koodibaasiga. Selle küpsusastmega Cassandra puhul pole samaväärset.
- Horisontaalne skaleeritavus: see on Cassandra peamine müügiargument. Lihtsalt lisage rohkem masinaid, kui teie andmed laienevad. PostgreSQL-ile pole samaväärset, kuna jaotamine ja partitsioonid tuleb käsitsi teha.
Kuidas plaanime skaleerida
Nagu nägime, on Postgresi seadistuse kasutamise ainus negatiivne külg nii lugemise kui ka salvestuse skaleerimine. Mida saame teha, et sellest piirangust üle saada?
Esimene tõhus tööriist, mis meil on, on eraldada kõik toetatavad protokollid või plokiahelad oma andmebaasi, kuna seega saab neid mahtu ja liiklust arvestades sobivalt skaleerida. Segmenteerimine ärivaldkonna järgi tagab skaleerimise esimese kihi.
Seda kontseptsiooni edasi kasutades saame segmenteerida ka külmad ajaloolised andmed ajalisesse partitsiooni. Postgresi uusimad versioonid on partitsioonidega tabelite kasutatavust oluliselt parandanud, mis võimaldab andmete sujuvat teisaldamist masinate klastris. Näiteks saaksime enamiku ajalooliste andmete majutamiseks kasutada odavamaid masinaid, millel on väiksem arvutusvõimsus, säilitades samal ajal koondtabeleid ja kasutaja uusimaid toiminguid, et majutada kasutajaid teenindavaid RAM-i virnastatud behemoteid.
See lähenemisviis töötab meie kasutusjuhtumil väga hästi, kuna ajaloolises salvestusruumis pole partitsioonidevahelisi võõrvõtmeid (lõppkokkuvõttes on kõik ploki külge kinnitatud). Põhiserveri vaatenurgast saab ajaloolistele andmetele isegi läbipaistvalt juurde pääseda, kasutades partitsiooni ja laiendit postgres_fdw.
Selleks, et aidata seda kõike paika panna, oleme uurinud ka TimescaleDB laiendust. See laiendus lisab postgresi algtasemele palju funktsioone ja enamik neist sobib ideaalselt meie kasutusjuhtudeks:
- Tabelite automaatne jaotamine ajalaadse veeru alusel (meie puhul kohandame seda, võttes võrdluseks plokiahela kõrguse).
- Automaatne, andmetüübiteadlik ja veerupõhine vanemate tükkide tihendamine. See tagab peaaegu täiusliku tihendussuhte, kasutades väga sarnastel andmetel tipptasemel algoritme.
- Tõhus ajasalal põhinev koondamine ajalooliste saldode ja turuandmete graafikute hõlpsaks arvutamiseks.
Oleme salvestamise osas alles katsetamise alguses ja see avab palju kasutusjuhtumeid. Kontseptsioonide tõestus, kasutades väikest andmemahtu (~10 2 plokki ethereumi põhivõrgus, seega umbes XNUMX päeva andmeid) näitas kettaruumi vähenemist kuni 40%.
Nagu nägime, ei ole andmemaht probleemiks, eeldusel, et kasutame õiget strateegiat. Aga kuidas skaleerida meie kasutajabaasi suurusega?
Meil on siin juba tore eelis: indekseerime kogu plokiahela andmed. Seega ei kasva vajalik salvestusruum mitte nagu kasutajate arv, vaid nagu plokiahela kogusuurus. Salvestus- ja lugemise optimeerimised on oma eraldusvõimelt täiesti ortogonaalsed.
See seadistus koos väga väikese kirjutamisvajadusega võrdeliselt teenindatava lugemismahuga on unistuste seadistus klassifikaatori-järgija koopia mustri jaoks. Täiendava jõudluse ja läbilaskevõime suurendamiseks saame paigutada ka postgresi lugemise koopiad API-serveritega samadele masinatele ja kasutada ära UNIX-i domeeni pesad, et võrgu edasi-tagasi reisid vahele jätta.
Siin on näide andmete replikatsioonistrateegiast, mida saaksime kasutada lugemise skaleerimiseks. Helehallid kastid tähistavad üksikuid servereid. Näeme siin, et API-kastid asuvad otse kuumimate andmete koopiatega, et tagada minimaalne edastusaeg salvestusruumi ja kasutajate vahel. Eelnevalt kirjeldatud arhiivijuhtumid ei ole esindatud, et mitte skeemi liiga keeruliseks muuta.
Lõppsõna
Pikaajalise Cassandra kasutajana tahan rõhutada, et see on oma disainilt suurepärane andmebaas, mis sobib väga erinevate rakendustega. Kahjuks tehti Ledgeris tehtud valik seda kasutada andmete kasutamise juhtumi põhjal, mis kunagi teoks ei saanud.
Meie meeskonna tootlikkus oli mõjutatud ja oodates väljakutseid, mida peame lahendama, otsustasime hammustada ja mitte langeda kulude eksimise alla.
Paljudel juhtudel ei ole teie andmed suurandmed. Andmete levitamise haldamine ei ole enamikul juhtudel keeruline ülesanne ja täisväärtusliku hajutatud andmebaasi kompromisse tuleb tõesti hoolikalt kaaluda. Peamine kaalutlus on arendaja kogemus, kuna see vabastab väärtuslikku aega millegi muu ehitamiseks. See on tegelik kasutusjuht, millesse peame palju investeerima.
- SEO-põhise sisu ja PR-levi. Võimenduge juba täna.
- PlatoAiStream. Web3 andmete luure. Täiustatud teadmised. Juurdepääs siia.
- Tuleviku rahapaja Adryenn Ashley. Juurdepääs siia.
- Ostke ja müüge IPO-eelsete ettevõtete aktsiaid koos PREIPO®-ga. Juurdepääs siia.
- Allikas: https://www.ledger.com/blog/serving-web3-at-web2-scale
- :on
- :on
- :mitte
- $ UP
- 10
- 10K
- 20
- a
- võime
- Võimalik
- juurdepääs
- pääses
- konto
- üle
- tegelikult
- kohandama
- lisama
- Lisab
- kinni pidama
- ADEelis
- koondamine
- algoritme
- Materjal: BPA ja flataatide vaba plastik
- võimaldama
- võimaldab
- juba
- Ka
- Kuigi
- summa
- an
- analüüs
- analytics
- ja
- vastus
- mistahes
- midagi
- API
- rakendused
- rakendatud
- lähenemine
- asjakohaselt
- Arhiiv
- OLEME
- ümber
- kunst
- artikkel
- AS
- aspekt
- aspektid
- eeldus
- At
- saadaval
- teadlik
- ära
- TELGED
- Telg
- Taustaprogramm
- Saldo
- saldod
- baas
- põhineb
- Baseline
- BE
- sest
- olnud
- enne
- Algus
- Behemotid
- on
- Kasu
- vahel
- Suur
- Big andmed
- Natuke
- Bitcoin
- Blokeerima
- blockchain
- plokiahela andmed
- plokiahelad
- Plokid
- mõlemad
- Kast
- karbid
- Toob
- Bug
- ehitama
- äri
- kuid
- by
- helistama
- Kutsub
- CAN
- kandidaat
- kork
- hoolikalt
- juhul
- juhtudel
- Põhjus
- põhjustatud
- tsentraliseeritud
- kett
- väljakutse
- väljakutseid
- raske
- muutma
- muutuv
- odav
- odavam
- odavamad masinad
- valik
- Vali
- Valisin
- valitud
- selge
- Cluster
- kood
- koodi alus
- külm
- Veerg
- kombineeritud
- kaup
- KOMMUNIKATSIOON
- ettevõte
- keerukust
- komponent
- Arvutama
- mõiste
- mõisted
- tasu
- kaaluda
- järjepidev
- jahe
- tuum
- Maksma
- võiks
- loodud
- kriitiline
- Praegune
- andmed
- andmete analüüs
- andmete jagamine
- andmete salvestamine
- andmebaas
- Päeva
- otsus
- kirjeldatud
- Disain
- arendaja
- arenev
- raske
- otse
- mustus
- jagatud
- jaotus
- jagatud
- do
- ei
- teeme
- domeen
- Ära
- miinus
- unistus
- juht
- kaks
- e
- iga
- kergesti
- lihtne
- serv
- Tõhus
- tõhus
- teine
- varjatud
- rõhuta
- võimaldama
- julgustav
- suurendama
- tagama
- tagab
- tagades
- Samaväärne
- jms
- ethereum
- ETHEREUM MAINNET
- Isegi
- lõpuks
- KUNAGI
- Iga
- kõik
- näide
- olemasolevate
- Eksootiline
- laieneb
- kogemus
- teadmised
- uurima
- uurija
- laiendama
- laiendamine
- ulatuslik
- asjaolu
- Langema
- tunnusjoon
- FUNKTSIOONID
- vähe
- leidma
- esimene
- sobima
- eest
- välis-
- edasi
- sõbralikkus
- Alates
- täis
- täieõiguslik
- täielikult
- funktsionaalsused
- edasi
- tulevik
- saamine
- antud
- Ülemaailmselt
- eesmärk
- läheb
- graafikud
- hall
- suur
- Grupp
- Kasvama
- Kasvavad
- tagatud
- suunised
- olnud
- Raske
- riistvara
- Olema
- võttes
- juhataja
- tugevalt
- kõrgus
- aitama
- siin
- Suur
- kõrgelt
- ajalooline
- võõrustaja
- KUUM
- kuumim
- Kuidas
- Kuidas
- aga
- HTML
- HTTPS
- i
- ideaalne
- if
- muutumatu
- mõjutatud
- rakendamisel
- paranenud
- in
- üha rohkem
- indeks
- Indeksid
- Näiteks
- integreeritud
- interaktiivne
- sisse
- Investeeri
- seotud
- probleem
- küsimustes
- IT
- ITS
- liituma
- liitunud
- jpg
- lihtsalt
- pidamine
- Võti
- võtmed
- Laps
- puudus
- keel
- suur
- Hilinemine
- hiljemalt
- kiht
- Led
- pearaamat
- õigustatud
- vähem
- Tase
- Finantsvõimendus
- valgus
- kerge
- nagu
- piiramine
- piirangud
- piiratud
- nimekiri
- vähe
- kohapeal
- Pikk
- Vaatasin
- otsin
- Partii
- Madal
- masinad
- tehtud
- põhiline
- mainnet
- säilitada
- Enamus
- Tegemine
- juhtima
- juhtiv
- käsitsi
- palju
- Turg
- Turuinfo
- tähtaeg
- max laiuse
- mai..
- vahendid
- metall
- rännanud
- minimaalne
- missioonide
- mudel
- modelleerimine
- rohkem
- Pealegi
- kõige
- liikuma
- palju
- peab
- nimelt
- peaaegu
- Vajadus
- vaja
- vajadustele
- kumbki
- võrk
- mitte kunagi
- Uus
- kena
- ei
- sõlmed
- mitte midagi
- number
- arvukad
- eesmärgid
- of
- on
- ONE
- ainult
- töötama
- Operations
- Võimalused
- or
- et
- meie
- ise
- üle
- Ületada
- enda
- makstud
- osa
- isikutele
- tee
- Muster
- Maksma
- peer
- peer to peer
- täiuslik
- jõudlus
- perspektiiv
- Koht
- kava
- Platon
- Platoni andmete intelligentsus
- PlatoData
- kaunad
- Punkt
- poliitika
- hulknurk
- võimalik
- Postgresql
- potentsiaal
- võim
- võimas
- tava
- Probleem
- Protsessid
- tootlikkus
- tõend
- osa
- teeb ettepaneku
- protokoll
- tõestatud
- anda
- tingimusel
- panema
- päringud
- RAM
- valik
- määr
- pigem
- suhe
- Töötlemata
- Lugenud
- reaalne
- tõesti
- mõistlik
- vähendamine
- kohta
- seotud
- usaldusväärne
- ümberkorraldamine
- vastus
- replikatsioon
- esindama
- esindatud
- taotleda
- vetruv
- resolutsioon
- lahendatud
- tulemuseks
- taaskasutada
- õige
- jõuline
- juur
- ümber
- ROW
- jooks
- jooksmine
- sama
- Scala
- skaalautuvia
- Skaala
- ketendamine
- sujuvalt
- Otsing
- turvalisus
- vaata
- nähtud
- segment
- segmentatsioon
- Müük
- müügiargument
- teenus
- Teenused
- teenindavad
- komplekt
- seade
- mitu
- varitsus
- jagamine
- Lühike
- näitama
- külg
- sarnane
- alates
- ühekordne
- SUURUS
- oskused
- väike
- väiksem
- nutikas
- So
- lahendus
- LAHENDAGE
- Lahendab
- mõned
- Ruum
- Säde
- Lõimetis
- SQL
- standard
- riik
- väljavõte
- ladustamine
- salvestada
- Lugu
- Strateegiline
- Strateegia
- tugev
- tugevalt
- Edukalt
- toetama
- Toetab
- tabel
- Võtma
- võtmine
- Ülesanne
- meeskond
- Tehniline
- öelda
- tingimused
- kui
- et
- .
- Plokk
- Riik
- oma
- SIIS
- Seal.
- Need
- nad
- Kolmas
- kolmandad isikud
- see
- läbilaskevõime
- aeg
- et
- liiga
- tööriist
- töövahendid
- Summa
- TÄIELIKULT
- liiklus
- tehing
- Tehingud
- üle
- läbipaistvalt
- tüüp
- liigid
- lõpuks
- all
- aluseks
- kahjuks
- unix
- avab
- asjatult
- us
- kasutatavus
- Kasutus
- kasutama
- kasutage juhtumit
- Kasutatud
- Kasutaja
- Kasutajad
- kasutamine
- tavaliselt
- väärtuslik
- sort
- vertikaalne
- väga
- maht
- tahan
- oli
- Tee..
- we
- Web2
- Web3
- Hästi
- M
- Mis on
- millal
- mis
- kuigi
- samas
- kogu
- miks
- lai
- laialdaselt
- will
- koos
- ilma
- töötab
- kirjutama
- kirjalik
- sa
- Noorim
- Sinu
- sephyrnet