Nagy felhasználói bázis kiszolgálása megbízható, konzisztens és alacsony késleltetésű adatokkal nagyon nehéz kihívás minden háttércsapat számára. A Ledgernél azt a stratégiai döntést hoztuk, hogy saját blokklánc-adatszolgáltatásainkat fogadjuk. Azáltal, hogy nem támaszkodunk harmadik felekre, magunk kezelhetjük ügyfeleink adatait, biztosítva, hogy a mögöttes folyamatok megfeleljenek biztonsági irányelveinknek és teljesítmény-orientált szolgáltatási szintű célkitűzéseinknek (SLO).
Ez a stratégia azonban meghozza a maga kihívásait is.
Első kihívásunk az, hogy ezeket az alapvető adatszolgáltató szolgáltatásokat távolítsuk el a menő és fényes noSQL-eszközöktől. Ebben a cikkben kitérek arra, hogy miért hoztuk meg ezt a nehéz döntést, milyen összetettséggel találkoztunk, és milyen előnyökkel jártunk.
Ennek a cikknek az a célja, hogy bemutassa azokat a technikai szempontokat, amelyek miatt a PostgreSQL-t választottuk a blokklánc-adatok új alapszintű tárolási rétegeként.
Merüljön el mélyen a Blockchain Data-ban
A blokklánc-adatoknak számos kulcsfontosságú jellemzője van.
Először is, folyamatosan növekszik, és soha semmi nem törlődik belőle. A gyakorlatban azonban, bár a blokklánc nagy része megváltoztathatatlan, a blokklánc legfiatalabb része megváltozhat a megoldásra váró konfliktusok miatt. Valójában, mivel a lánc egyenrangú hálózat, ideiglenesen több legitim blokk is létezhet egymás mellett. Általában a régebbi törlődik, ami az úgynevezett átszervezést eredményezi. Röviden, az adatok egy megváltoztathatatlan hideg farok és egy ritkán változó fejállapot között oszlanak meg.
A probléma, amit megpróbálunk megoldani, az az, hogy bár a blokkláncok kiválóan alkalmasak bizánci hibatűrő adatok birtoklására, kevésbé hatékonyak a sok tengely mentén történő szeleteléshez és felkockázáshoz. Ugyanis nagyon nehéz megszerezni a fiókot érintő műveletek listáját. Még a számlaegyenleg megszerzése is kihívást jelent egy blokkláncon, például a bitcoinon, ha még nem rendelkezik a tranzakciók listájával.
A kihívások leküzdése érdekében a Ledger Explorer Services a teljes blokkláncot indexeli. Ez egy nagy, kritikus és teljesítményérzékeny szolgáltatás, amelyet teljesen Scalában írtak, és a macska-hatás nagy teljesítményű futásidő. 10 95 rps felett vagyunk a bitcoinon, miközben a p100 késleltetést XNUMX ms alatt tartjuk. Mi is toborozunk 😊.
Egy kis történelem
Történetünk elején, jóval azelőtt, hogy csatlakoztam volna a céghez, a Ledger adatszolgáltatási réteget egy beágyazott Neo4j adatbázis kezelte. Mindegyik kiszolgálódoboz a saját adatait indexelte, és helyben szolgálta ki, ami sok problémát okozott.
Az adatok konzisztenciája a példányok között nem volt garantált, és az indexelendő állapot puszta mérete, a neo4j lemez és RAM használatával kombinálva, nem volt méretezhető. Ez a probléma a vállalat növekedésével csak súlyosbodott, és egyre nagyobb kihívást jelent az új példányok megjelenése.
Cassandra Ezt követően az új beállítás fő mozgatórugóját választották: ez egy fürtözött, vízszintesen méretezhető adatbázis, amely a CAP-tétel AP oldalán található. Megoldja az adatmegosztással kapcsolatos problémákat, és lehetővé teszi az indexelő, blokklánc-tudatos komponens és a fej nélküli API szerverek egyértelmű elkülönítését.
De mi értelme van annak, hogy az egész történelmi állapot elérhető legyen, ha valójában soha nem fogunk belőle olvasni?
A mi használati esetünket illetően a nyers előzményadatokra ritkán van szükség, mert felhasználói fiókunk állapota összesíthető belőle. Ez arra késztetett bennünket, hogy megtámadjuk a meglévő adattárolási megoldást, amely a Cassandra elosztott adatbázison alapul.
A blokklánconként tárolandó adatmennyiség, bár a terabájt tartományban van, nem nevezhetjük „nagy adatnak”. Sőt, az if-nek az a része, amelyet a legtöbb lekérdezés megválaszolására használnak (más néven The hot path), még kisebb. Manapság könnyen találhatunk olyan hardverszervereket, amelyek több mint 16 TB NVMe SSD tárhellyel rendelkeznek. A függőleges méretezés nagyon hatékony eszköz, és a relációs adatbázis is az.
Végül a jelenlegi cassandra-beállítással a fő probléma nem a pazarló tárolási modell, sem a rosszul illeszkedő adathasználat volt, hanem a fejlesztőbarátság hiánya. Egy új, adatalapú funkció kifejlesztése a cassandra-n szükségtelenül időigényesnek bizonyult. Arra törekedtünk, hogy minden olyan új tengelyt megvalósítsunk, amelyre vonatkozóan adatokat kell szolgáltatnunk.
Tekintettel csapatunk adatmodellezési készségeire és SQL jártasságára, PostgreSQL tökéletes jelölt volt. Ez a megoldás csatában tesztelt, robusztus, könnyen bővíthető, így ideális választás.
Miért választottuk az SQL-t a NoSQL helyett:
- Egyenlegeket olvas / ír: a blokklánc adathasználati esetet erősen elferdítették az olvasás helyett az írás helyett (a blokklánc nagyon kevés adatot ír nagyon ésszerű sebességgel, még egy olyan blokklánc esetében is, mint a Polygon). Cassandra nagyon nagy mennyiségű írást képes elnyelni – az olvasási útvonal valójában hosszabb mint az írási útvonal.
- Indexelés támogatása: Az indexek a DBMS kulcsfontosságú összetevői a lekérdezések és az új üzleti esetek vagy lehetőségek megválaszolásához. Cassandra korlátozottan támogatja az indexelést. Az indexek csak akkor hatásosak, ha a lekérdezés már megadja a partíció korlátozásának módját, amelyen a lekérdezés futni fog. Itt fizetjük a költségeket, hogy egy önkényesen elosztott adatbázis. Az indexek PostgreSQL-támogatása hatékony, bővíthető és élvonalbeli.
- Aggregációs támogatás: Ugyanaz az eset az összesítésnél; mivel a Cassandra nem engedélyezi a többpartíciós aggregációt, és nem tolerálja a GROUP BY záradékot a lekérdezési nyelvében, a támogatása némileg hiányzik. A PostgreSQL kiterjedt aggregációs támogatást javasol, még olyan egzotikus adattípusokon is, mint a tartományok és a jsonb blobok.
- Az adatok modellezése: Cassandra nagyon-nagyon korlátozza az adatmodellezés lehetőségét. Szinte minden megválaszolni kívánt kéréshez létre kell hozni egy táblázatot, és az adatokat nagy sorokká kell denormalizálni (teljesen a széles oszlopos bolt a C* szempontja és az is, hogy az írók piszok olcsók). A PostgreSQL lehetővé teszi számunkra, hogy kihasználjuk a blokklánc relációs aspektusát (hívások, tranzakciók, blokkok) és szabad lemezterületet, ezzel ösztönözve az adatok újrafelhasználását.
- Ad-hoc lekérdezések és auditálás: Az SQL teljes szabványának használatára és tetszőleges lekérdezésekre való képességünk azt jelenti, hogy feltárhatjuk és megkereshetjük a lehetséges hibák kiváltó okát, vagy feltáró adatokkal rendelkezünk a jövőbeni felhasználási esetekre. Az adatbázist valóban használhatjuk interaktív és intelligens eszközként, nem pedig hülye tárolóként. Ezt a Cassandra esetében egy kiterjedt és költséges analitikai számítási klaszter nélkül, mint például a Presto, a Spark stb. (és mivel csupasz fém szervereken futunk, nem férünk hozzá az olyan könnyen létrehozható elosztott adatelemző eszközökhöz, mint az EMR).
- Tárolás használat: A Cassandra feltételezése szerint a tárolás nagyon olcsó, és a klaszter könnyen bővíthető új gépekkel. Ez azt jelenti mind az indexekre, mind az aggregációkra vonatkozó összes korlátot a tárolással kell fizetni. A globálisan hatékony indexek hiánya és a csatlakozási támogatás azt jelenti, hogy denormalizálnunk kell és tárolnunk kell a teljes táblázat másolatát minden lekérdezni kívánt tengelyhez. A PostgreSQL terabájt tárhelyet kímél meg nekünk.
- Következetesség: Mivel a Cassandra egy elosztott, AP-orientált adatbázis (a kommunikáció a csomópontok közötti pletykálkodással történik), a konzisztencia csak az írások tekintetében lehetséges. Az egyes utasítások konzisztencia-politikáját beállíthatja az olvasáshoz és az íráshoz is, de ennek az adatbázisnak a célja soha nem volt az erős konzisztencia. A PostgreSQL-nek erős története van a kritikus küldetésekhez való használatáról, és rendkívül rugalmas. A központosítás azt is jelenti, hogy az írási útvonalban nincs hálózat.
- Tranzakciók és MVCC:
- Tranzakciók: Cassandra támogatja csak könnyű tranzakciók DML lekérdezéseknél. Néhány kötegelés alkalmazható (doc), de számos figyelmeztetés van, nevezetesen, hogy a soroknak ugyanazon a szerveren (= partíción) kell lenniük, hogy ne legyenek borzalmas teljesítmények.
- MVCC: A Cassandra támogatja a soridőbélyegzést, de a teljes MVCC nem garantált. A tömörítés törölheti az elavult adatokat, és nincs mód arra, hogy megmondja a C*-nak, hogy nem szabad (mint pl. egy tranzakciónál PG-ben).
- A PostgreSQL támogatja az erős MVCC-modellt, amely konzisztens olvasási útvonalat biztosít a felhasználók számára.
- Szerszám: A PostgreSQL-nek sokkal több eszköze van, amelyeket széles körben használnak az adatbázis egyszerű kezeléséhez. Sőt, egy olyan eszköz, mint repülőút biztosítja, hogy fenntartsuk az adatbázisséma erős verziószámát. Már sikeresen integráltuk a kódbázisunkba. Cassandra ilyen érettségi szinttel nincs megfelelője.
- Vízszintes skálázhatóság: Ez a Cassandra legfontosabb értékesítési pontja. Csak adjon hozzá több gépet az adatok bővülésével. A PostgreSQL-nek nincs megfelelője, mivel a felosztást és a particionálást kézzel kell elvégezni.
Hogyan tervezzük a méretezést
Amint láttuk, a Postgres beállítás használatának egyetlen hátránya az olvasási és tárolási méretezés. Mit tehetünk ennek a korlátnak a leküzdésére?
Az első hatékony eszközünk az, hogy minden általunk támogatott protokollt vagy blokkláncot saját adatbázisba különítünk el, mivel így megfelelően méretezhető a mennyiség és a forgalom függvényében. Az üzleti tartományok szerinti szegmentálás biztosítja a méretezés első rétegét.
Ennek a koncepciónak a továbbfejlesztésével a hideg, történelmi adatokat időbeli felosztásra is szegmentálhatjuk. A Postgres legújabb verziói sokat javítottak a particionált táblák használhatóságán, amelyek lehetővé teszik az adatok zökkenőmentes mozgatását egy gépfürt között. Például olcsóbb, kisebb számítási teljesítménnyel rendelkező gépeket használhatnánk a legtöbb előzményadat tárolására, miközben a felhasználót kiszolgáló, RAM-mal halmozott behemótokat tarthatunk az összesített táblák és a felhasználó legújabb műveleteinek tárolására.
Ez a megközelítés nagyon jól működik a mi használati esetünkben, mert nincsenek partíciókon átívelő idegen kulcsok az előzménytárban (végső soron minden a blokkhoz van csatolva). A fő szerver szemszögéből a korábbi adatokhoz még transzparensen is hozzá lehet férni particionálással és a postgres_fdw kiterjesztéssel.
Annak érdekében, hogy mindezt a helyére hozzuk, megvizsgáltuk a TimescaleDB bővítményt is. Ez a bővítmény számos funkciót ad az alapvonal postgres-hez, és ezek többsége tökéletesen illeszkedik a mi használati eseteinkhez:
- Táblázatok automatikus particionálása időszerű oszlop alapján (esetünkben a blokklánc magasságát vesszük alapul referenciaként).
- A régebbi darabok automatikus, adattípus-tudatos és oszlopalapú tömörítése. Ez közel tökéletes tömörítési arányt biztosít a legkorszerűbb algoritmusok használatával nagyon hasonló adatokon.
- Hatékony idősáv alapú összesítés a múltbeli egyenlegek és piaci adatok grafikonjainak egyszerű kiszámításához.
Még csak a kísérletezés elején járunk a tárolással kapcsolatban, és ez sok felhasználási esetet felszabadít. Koncepciók bizonyítása kis mennyiségű adat felhasználásával (~10 2 blokk az ethereum főhálózatán, tehát körülbelül XNUMX nap adat) 40%-os lemezterület-csökkenést mutatott.
Amint láttuk, az adatmennyiség, feltéve, hogy a megfelelő stratégiát alkalmazzuk, nem probléma. De hogyan méretezhetjük a felhasználói bázisunk méretét?
Itt már van egy szép előnyünk: indexeljük a teljes blokklánc adatot. Így a szükséges tárhely nem úgy nő, mint a felhasználók száma, hanem a blokklánc teljes mérete. A tárolás és az olvasás optimalizálása teljesen ortogonális felbontású.
Ez a beállítás a kiszolgálni kívánt olvasási mennyiséghez viszonyított nagyon alacsony írási szükséglettel kombinálva az osztályvezető-követő replika minta álombeállítása. A további teljesítmény és áteresztőképesség növelése érdekében a postgres olvasási replikákat is elhelyezhetjük ugyanazokon a gépeken, mint az API-kiszolgálók, és kihasználhatjuk a UNIX tartományi socketek előnyeit, hogy kihagyjuk a hálózati körutakat.
Íme egy példa egy adatreplikációs stratégiára, amelyet az olvasások méretezésére használhatunk. A világosszürke dobozok egyetlen szervert jelölnek. Itt láthatjuk, hogy az API pod-ok közvetlenül a legforróbb adatok replikáival együtt helyezkednek el, hogy minimális átviteli időt biztosítsanak a tárhely és a felhasználók között. A korábban leírt archív példányok nincsenek ábrázolva, hogy ne bonyolítsák túl a sémát.
Záró megjegyzések
Hosszú távú Cassandra-felhasználóként szeretném hangsúlyozni, hogy ez egy nagyszerű adatbázis, amely a legkülönfélébb alkalmazásokhoz illeszkedik. Sajnos a Ledgernél a felhasználás mellett döntöttek egy adathasználati eset kapcsán, amely soha nem valósult meg.
Csapatunk termelékenysége hatással volt, és várva a megoldandó kihívásokat úgy döntöttünk, hogy elharapjuk a golyót, és nem dőlünk be az elsüllyedt költségek tévedésének.
Sok esetben az Ön adatai nem nagy adatok. Az adatelosztás kezelése a legtöbb esetben nem nehéz feladat, és egy teljes értékű elosztott adatbázis kompromisszumait alaposan át kell gondolni. A kulcsfontosságú szempont a fejlesztői tapasztalat, mivel értékes időt szabadít fel bármi más megalkotására. Ez az a valós használati eset, amelybe sokat kell fektetnünk.
- SEO által támogatott tartalom és PR terjesztés. Erősödjön még ma.
- PlatoAiStream. Web3 adatintelligencia. Felerősített tudás. Hozzáférés itt.
- A jövő pénzverése – Adryenn Ashley. Hozzáférés itt.
- Részvények vásárlása és eladása PRE-IPO társaságokban a PREIPO® segítségével. Hozzáférés itt.
- Forrás: https://www.ledger.com/blog/serving-web3-at-web2-scale
- :van
- :is
- :nem
- $ UP
- 10
- 10K
- 20
- a
- képesség
- Képes
- hozzáférés
- igénybe vett
- Fiók
- át
- tulajdonképpen
- alkalmazkodni
- hozzá
- Hozzáteszi
- tapad
- Előny
- összesítés
- algoritmusok
- Minden termék
- lehetővé
- lehetővé teszi, hogy
- már
- Is
- Bár
- összeg
- an
- elemzés
- analitika
- és a
- válasz
- bármilyen
- bármi
- api
- alkalmazások
- alkalmazott
- megközelítés
- megfelelő
- Archív
- VANNAK
- körül
- Művészet
- cikkben
- AS
- megjelenés
- szempontok
- feltevés
- At
- elérhető
- tudatában van
- el
- TENGELYEK
- Tengely
- háttér
- Egyenleg
- egyenlegek
- bázis
- alapján
- kiindulási
- BE
- mert
- óta
- előtt
- Kezdet
- Behemótok
- hogy
- Előnyök
- között
- Nagy
- Big adatok
- Bit
- Bitcoin
- Blokk
- blockchain
- blockchain adatok
- blockchains
- Blocks
- mindkét
- Doboz
- dobozok
- Bring
- Bogár
- épít
- üzleti
- de
- by
- hívás
- kéri
- TUD
- jelölt
- sapka
- gondosan
- eset
- esetek
- Okoz
- okozott
- központosított
- lánc
- kihívás
- kihívások
- kihívást
- változik
- változó
- olcsó
- olcsóbb
- olcsóbb gépek
- választás
- A pop-art design, négy időzóna kijelzése egyszerre és méretének arányai azok az érvek, amelyek a NeXtime Time Zones-t kiváló választássá teszik. Válassza a
- választotta
- választott
- világos
- Fürt
- kód
- kódbázis
- hideg
- Oszlop
- kombinált
- árucikk
- közlés
- vállalat
- bonyodalmak
- összetevő
- Kiszámít
- koncepció
- fogalmak
- megfontolás
- figyelembe vett
- következetes
- Hűvös
- Mag
- Költség
- tudott
- készítette
- kritikai
- Jelenlegi
- dátum
- adatelemzés
- adatmegosztás
- adattárolás
- adatbázis
- Nap
- döntés
- leírt
- Design
- Fejlesztő
- fejlesztése
- nehéz
- közvetlenül
- piszok
- megosztott
- terjesztés
- megosztott
- do
- nem
- Ennek
- domain
- ne
- hátránya
- álom
- gépkocsivezető
- két
- e
- minden
- könnyen
- könnyű
- él
- Hatékony
- hatékony
- más
- beágyazott
- hangsúlyt helyez
- lehetővé
- bátorító
- növelése
- biztosítására
- biztosítja
- biztosítása
- Egyenértékű
- stb.
- Ethereum
- ETHEREUM MAINNET
- Még
- végső
- EVER
- Minden
- minden
- példa
- létező
- Egzotikus
- kitágul
- tapasztalat
- szakvélemény
- feltárása
- felfedező
- terjed
- kiterjesztés
- kiterjedt
- tény
- Esik
- Funkció
- Jellemzők
- kevés
- Találjon
- vezetéknév
- megfelelő
- A
- külföldi
- Előre
- barát
- ból ből
- Tele
- teljes értékű
- teljesen
- funkciós
- további
- jövő
- szerzés
- adott
- globálisan
- cél
- megy
- grafikonok
- szürke
- nagy
- Csoport
- Nő
- Növekvő
- Garantált
- irányelvek
- kellett
- Kemény
- hardver
- Legyen
- tekintettel
- fej
- súlyosan
- magasság
- segít
- itt
- Magas
- nagyon
- történeti
- vendéglátó
- FORRÓ
- legmelegebb
- Hogyan
- How To
- azonban
- HTML
- HTTPS
- i
- ideális
- if
- változhatatlan
- befolyásolta
- végrehajtási
- javított
- in
- egyre inkább
- index
- indexek
- példa
- integrált
- interaktív
- bele
- befektet
- részt
- kérdés
- kérdések
- IT
- ITS
- csatlakozik
- csatlakozott
- jpg
- éppen
- tartás
- Kulcs
- kulcsok
- Kedves
- hiány
- nyelv
- nagy
- Késleltetés
- legutolsó
- réteg
- Led
- Főkönyv
- jogos
- kevesebb
- szint
- Tőkeáttétel
- fény
- könnyűsúlyú
- mint
- korlátozás
- korlátozások
- Korlátozott
- Lista
- kis
- helyileg
- Hosszú
- nézett
- keres
- Sok
- Elő/Utó
- gép
- készült
- Fő
- mainnet
- fenntartása
- Többség
- Gyártás
- kezelése
- kezelése
- kézzel
- sok
- piacára
- Piaci adatok
- érettség
- max-width
- Lehet..
- eszközök
- fém
- vándorol
- minimális
- küldetések
- modell
- modellezés
- több
- Ráadásul
- a legtöbb
- mozog
- sok
- kell
- ugyanis
- közel
- Szükség
- szükséges
- igények
- Se
- hálózat
- soha
- Új
- szép
- nem
- csomópontok
- semmi
- szám
- számos
- célok
- of
- on
- ONE
- csak
- működik
- Művelet
- Lehetőségek
- or
- érdekében
- mi
- magunkat
- felett
- Overcome
- saját
- fizetett
- rész
- fél
- ösvény
- Mintás
- Fizet
- egyenrangú
- peer-to-peer
- tökéletes
- teljesítmény
- perspektíva
- Hely
- terv
- Plató
- Platón adatintelligencia
- PlatoData
- hüvely
- pont
- politika
- Poligon
- lehetséges
- postgresql
- potenciális
- hatalom
- erős
- gyakorlat
- Probléma
- Folyamatok
- termelékenység
- bizonyíték
- arány
- javasolja
- protokoll
- igazolt
- ad
- feltéve,
- tesz
- lekérdezések
- RAM
- hatótávolság
- Arány
- Inkább
- hányados
- Nyers
- Olvass
- igazi
- tényleg
- ésszerű
- csökkentés
- tekintettel
- összefüggő
- megbízható
- átszervezés
- válasz
- replikáció
- képvisel
- képviselők
- kérni
- rugalmas
- Felbontás
- megoldódott
- kapott
- újra
- jobb
- erős
- gyökér
- körül
- SOR
- futás
- futás
- azonos
- Scala
- skálázható
- Skála
- skálázás
- zökkenőmentesen
- Keresés
- biztonság
- lát
- látott
- részes
- szegmentáció
- Eladási
- értékesítési pont
- szolgáltatás
- Szolgáltatások
- szolgáló
- készlet
- felépítés
- számos
- szilánkos
- megosztás
- rövid
- előadás
- oldal
- hasonló
- óta
- egyetlen
- Méret
- készségek
- kicsi
- kisebb
- okos
- So
- megoldások
- SOLVE
- Megoldja
- néhány
- Hely
- Szikra
- Ívik
- SQL
- standard
- Állami
- nyilatkozat
- tárolás
- tárolni
- Történet
- Stratégiai
- Stratégia
- erős
- erősen
- sikeresen
- támogatás
- Támogatja
- táblázat
- Vesz
- bevétel
- Feladat
- csapat
- Műszaki
- mondd
- feltételek
- mint
- hogy
- A
- A háztömb
- Az állam
- azok
- akkor
- Ott.
- Ezek
- ők
- Harmadik
- harmadik felek
- ezt
- áteresztőképesség
- idő
- nak nek
- is
- szerszám
- szerszámok
- Végösszeg
- TELJESEN
- forgalom
- tranzakció
- Tranzakciók
- átruházás
- átláthatóan
- típus
- típusok
- Végül
- alatt
- mögöttes
- sajnálatos módon
- unix
- kinyitja
- szükségtelenül
- us
- használhatóság
- Használat
- használ
- használati eset
- használt
- használó
- Felhasználók
- segítségével
- rendszerint
- Értékes
- fajta
- függőleges
- nagyon
- kötet
- akar
- volt
- Út..
- we
- Web2
- Web3
- JÓL
- Mit
- Mi
- amikor
- ami
- míg
- Míg
- egész
- miért
- széles
- széles körben
- lesz
- val vel
- nélkül
- művek
- ír
- írott
- te
- Legfiatalabb
- A te
- zephyrnet