Programiranje

Pregled YugaByte: Cassandra in Redis v planetarni lestvici

V svojih desetletjih razvijalca aplikacij za baze podatkov si v najbolj divjih sanjah nisem predstavljal, da bom kdaj imel dostop do transakcijske, porazdeljene baze podatkov na planetu, še manj pa, da bi jih primerjal. Toda z Google Cloud Spanner, CockroachDB, Azure Cosmos DB, Neo4j Enterprise in nazadnje YugaByte DB, ki so na voljo v proizvodnji, so te enkratne cevi sanje zdaj povsem resnične.

Na splošno Google Cloud Spanner ponuja razširljivo, porazdeljeno, močno skladno bazo podatkov SQL kot storitev, ki lahko obdeluje približno 2000 zapisov na sekundo in 10.000 brankov na sekundo na vozlišče s povprečno zakasnitvijo približno pet milisekund. Za pospešitev branja, ki ne potrebujejo popolnoma ažurnih podatkov, lahko Spanner zaprosite za zastarela branja, saj podpira poizvedbe o časovnem potovanju. Spanner uporablja Googlovo narečje SQL in deluje samo na Google Cloud Platform.

CockroachDB je podobna Spannerju odprtokodna baza podatkov SQL, ki podpira žični protokol PostgreSQL in narečje SQL PostgreSQL. CockroachDB je zgrajen na vrhu RocksDB, odprtokodne transakcijske in dosledne shrambe ključ-vrednost. Tako kot Spanner podpira poizvedbe o potovanju skozi čas. CockroachDB se lahko izvaja v katerem koli oblaku, v Dockerjevih vsebnikih z orkestracijo ali brez nje ali v Linux strežnikih ali VM-jih. Podjetniška različica CockroachDB dodaja geo-particioniranje, nadzor dostopa na podlagi vlog in podporo.

Azure Cosmos DB je globalno distribuirana, vodoravno razdeljena, multimodelna baza podatkov kot storitev. Ponuja štiri podatkovne modele (ključ-vrednost, družina stolpcev, dokument in graf) in pet nastavljivih stopenj skladnosti (močna, omejena zastarelost, seja, dosledna predpona in morebitne). Ponuja pet naborov API: SQL (dialekt), MongoDB-združljiv, Azure Table-združljiv, graf (Gremlin) in Apache Cassandra-združljiv. Deluje samo v oblaku Microsoft Azure.

Neo4j je razširljiva in preživeta baza grafov, ki uporablja poizvedbeni jezik Cypher. Njegovo odprtokodno različico, ki ni gručasta, lahko namestite v operacijske sisteme Windows, MacOS in Linux, v vsebnike Docker in v VM-je. Neo4j Enterprise podpira grozde visoke razpoložljivosti in vzročne povezave; vzročne gruče omogočajo asinhrono posodobljene gruče bralnih replik, da se omogoči visoka zmogljivost za geografsko porazdeljene razmestitve.

Vnesite Yugabyte DB

YugaByte DB, ki je predmet tega pregleda, je odprtokodna, transakcijska in visoko zmogljiva baza podatkov za aplikacije na planetu, ki podpira tri nabore API-jev: YCQL, združljiv z Apache Cassandra Query Language (CQL); YEDIS, združljiv z Redisom; in PostgreSQL (trenutno nepopolna in v različici beta). YugaWare je sloj orkestracije za YugaByte DB Enterprise Edition. YugaWare na hiter način vrti in ruši porazdeljene grozde na Amazon Web Services, Google Cloud Platform in (do četrtega četrtletja 2018) Microsoft Azure. YugaByte DB izvaja multiverzijski nadzor sočasnosti (MVCC), vendar še ne podpira poizvedb o časovnem potovanju.

YugaByte DB je zgrajen na vrhu izboljšanih vilic shrambe ključev-vrednosti RocksDB. YugaByte DB 1.0, dobavljen maja 2018.

Dve ključni tehnologiji, ki se uporabljata za zagotavljanje doslednosti in hitrosti distribuiranih transakcijskih baz podatkov, sta algoritmi soglasja grozdov in sinhronizacija ure vozlišč. Google Cloud Spanner in Azure Cosmos DB uporabljata soglasni algoritem Paxos, ki ga je predlagal Leslie Lamport. CockroachDB in YugaByte DB uporabljata soglasni algoritem Raft, ki sta ga predlagala Diego Ongaro in John Ousterhout.

Google Cloud Spanner uporablja Googlov lastniški API TrueTime, ki temelji na GPS in atomskih urah. DB Azure Cosmos DB, CockroachDB in YugaByte DB uporabljajo časovne žige hibridne logične ure (HLC) in sinhronizacijo ure NTP (Network Time Protocol).

Cilji oblikovanja YugaByte

Ustanovitelji YugaByte - Kannan Muthukkaruppan, Karthik Ranganathan in Mikhail Bautin - so bili zastopniki Apache HBase, zgodnji inženirji Apache Cassandra in graditelji Facebookove platforme NoSQL (poganja Apache HBase). Njihov cilj za YugaByte DB je bil porazdeljen strežnik baz podatkov, filozofsko vmesni med Azure Cosmos DB in Google Cloud Spanner; to pomeni, da so želeli združiti multimodelne in visoko zmogljive atribute Cosmos DB s transakcijami ACID in globalno skladnostjo Spannerja. Drug način opisa njihovega cilja je, da so želeli, da je YugaByte DB hkrati transakcijski, visoko zmogljiv in na planetu.

Postopek so razdelili v pet korakov, za izdelavo vsakega od njih pa je trajalo približno šest mesecev. Prvi korak je bil ustvariti močno skladno različico RocksDB, visokozmogljive shrambe ključev in vrednosti, napisane v jeziku C ++, z dodajanjem konsenznega protokola Raft, ostrenjem in uravnoteženjem obremenitve ter odstranitvijo beleženja transakcij, varnostnih kopij v trenutku, in predelavo, ki jo je bilo treba izvesti v višji plasti.

Naslednji korak je bil zgraditi v dnevniku strukturiran mehanizem za shranjevanje ključev do dokumentov in dodati neprimitivne in ugnezdene vrste, kot so vrstice, zemljevidi, zbirke in JSON. Nato so dodali vtični sloj API, kot je Azure Cosmos DB, ki je implementiral API-je, združljive s Cassandro in Redis-om, ter odložil SQL API, združljiv s PostgreSQL, na kasnejšo stopnjo. Nato so prišli jeziki z razširjenimi poizvedbami.

YugaByte Cloud Query Language (YCQL) razširja Cassandra API s podporo za porazdeljene transakcije, močno skladne sekundarne indekse in JSON. YugaByte Dictionary Service (YEDIS) je Redis združljiv API z dodatki vgrajene obstojnosti, samodejnega ostrenja in linearne razširljivosti. YEDIS neobvezno omogoča časovno usklajeno branje z majhno zakasnitvijo iz najbližjega podatkovnega centra, medtem ko močne operacije pisanja ohranjajo globalno doslednost. YEDIS vključuje tudi nov tip podatkovnih časovnih vrst.

Nazadnje, z različico 1.0 YugaByte DB Enterprise doda plast za orkestriranje, zaščito in spremljanje uvedb proizvodnega razreda v več regijah in več oblakih ter shrani razporejene varnostne kopije na nastavljivo končno točko, kot je Amazon S3. Podpora za PostgreSQL ostaja nepopolna in je na ravni beta testa.

Porazdeljene transakcije ACID

V nevarnosti, da popolnoma poenostavim postopek, naj poskusim povzeti način, kako YugaByte izvaja porazdeljene transakcije ACID. ACID (kar pomeni atomskost, konsistenco, izolacijo in trajnost) je nekoč veljal za lastnost, omejeno na podatkovne baze SQL.

Recimo, da oddate poizvedbo YCQL, ki vsebuje posodobitve znotraj transakcije, na primer seznanjeno obremenitev in dobropis, ki morata biti prekinjena, če ena ne uspe, da se ohrani doslednost finančne baze podatkov. YugaByte DB sprejme transakcijo v upravitelju transakcij brez državljanstva, od katerih se ena izvaja na vseh vozliščih v gruči. Nato poskuša upravitelj transakcij načrtovati transakcijo na strežniku tabličnega računalnika, ki ima v lasti večino podatkov, do katerih je transakcija dostopna, za namene uspešnosti.

Upravitelj transakcij doda vnos transakcije z enoličnim ID-jem v tabelo stanja transakcije. Potem piše začasno posname na vse tablice, odgovorne za ključe, ki jih poskuša spremeniti transakcija. Če pride do navzkrižij, se ena od nasprotujočih transakcij premakne nazaj.

Ko so vsi začasni zapisi uspešno napisani, upravitelj transakcij prosi tablico stanja transakcije, naj nadomesti vse začasne zapise z običajnimi zapisi, pri čemer uporabi časovni žig vnosa »storjena transakcija« v svojem dnevniku Raft. Nazadnje tablica stanja transakcije pošlje zahteve za čiščenje vsakemu tabličnemu računalniku, ki je sodeloval v transakciji.

Za izboljšanje zmogljivosti YugaByte agresivno predpomni informacije o transakcijah, ki so v teku, izvaja drobnozrnate ključavnice in uporablja hibridne zakupe časovnih vodnikov, da strankam prepreči branje zastarelih vrednosti starih voditeljev. Transakcije ACID z eno vrstico so optimizirane tako, da imajo nizke zakasnitve, kadar ni konfliktnih operacij. Porazdeljene transakcije ACID ohranjajo pravilnost na račun večjih zakasnitev.

YCQL, YEDIS in PostgreSQL

YugaByte vključuje skoraj popolno izvedbo CQL in nekaj razširitev. Ogromen napredek v primerjavi s Cassandro je, da je YugaByte močno dosleden, medtem ko je Cassandra sčasoma dosledna. Druge izboljšave so za porazdeljene transakcije, močno skladne sekundarne indekse in JSON. YugaByte prekaša Cassandro za vsako operacijo, razen pri skeniranju kratkega dosega, vsaj delno zaradi njene močne doslednosti, ki omogoča eno branje namesto števila sklepčnosti, ki je potrebno v Cassandri.

Cassandra podpira štiri primitivne vrste podatkov, ki še niso podprte v YugaByte: datum, čas, tuple in varint. YugaByte ima tudi nekatere omejitve izrazov.

Pri izvajanju Redisa pri YugaByteju ni podatkovnega tipa seznama, dodaja pa podatkovni tip časovne vrste. Dodaja vgrajeno obstojnost, samodejno ostrenje in linearno razširljivost ter možnost branja iz najbližjega podatkovnega centra za majhno zakasnitev.

Izvajanje PostgreSQL YugaByte ni zelo daleč. Trenutno mu manjkata stavka UPDATE in DELETE, izrazi, stavku SELECT pa klavzula join.

Namestitev in testiranje YugaByte

Odprtokodno bazo podatkov YugaByte lahko namestite iz izvorne kode, iz tarballov v MacOS, Centos 7 in Ubuntu 16.04 ali novejših in iz Dockerjevih slik v Dockerju ali Kubernetesu. Nato lahko ustvarite grozde in preizkusite tri API-je za poizvedbe in nekaj vzorčnih generatorjev delovne obremenitve.

Odločil sem se, da namestim YugaByte DB Enterprise na Google Cloud Platform. Čeprav je bilo treba narediti več ročnih korakov, kot bi si želel, sem v enem popoldnevu opravil namestitev in teste, potem ko sem dobil licenčni ključ za Enterprise Edition.

Ko se je primerek YugaWare zagnal na primerku s štirimi CPU v storitvi Google Cloud, sem Google Cloud Platform konfiguriral kot ponudnika oblaka za svojo gručo baz podatkov.

Nato sem ustvaril gručo s tremi vozli osem primerkov CPU v regiji ZDA-Vzhod.

Izvajal sem teste obremenitve z uporabo API-jev CQL in Redis.

Iz ukazne vrstice sem lahko povprašal po podatkih CQL in Redis.

Ustvaril sem tudi grozd s tremi vozlišči v različnih regijah, razširjenih po vsem svetu (spodaj). Ustvarjanje je trajalo dlje (približno 45 minut) in pričakovano je imelo veliko večjo zakasnitev pisanja. Žal svetlobne hitrosti ne morete zaobiti.

Stroški YugaByte

Cena licence YugaByte DB Enterprise Edition za tri vozlišča se začne pri 40 tisoč USD na leto. Poleg tega morate upoštevati tudi stroške strežnikov. Za gručo s tremi vozli na Google Cloud Platform, ki uporablja primere VM z osmimi CPU, znaša ta strošek med 800 in 900 USD na mesec plus omrežni promet, morda 11 000 USD na leto.

Moji lastni stroški za popoldansko testiranje so znašali 0,38 USD za primere in 0,01 USD za izhod med območja. Brisanje grozdov baz podatkov iz vmesnika YugaByte DB Enterprise je bilo enostavno in ko sem zaustavil primerek VM, ki je zagnal vmesnik za skrbništvo in orkestracijo, ni več nabiral večjih stroškov.

Hitreje, bolje, porazdeljeno

Na splošno je YugaByte DB deloval kot oglaševan. V tem trenutku je koristen kot hitrejši, boljši, distribuirani Redis in Cassandra. Sčasoma bi moral biti tudi boljši PostgreSQL, čeprav po mojih izkušnjah to traja dolgo (leta in ne meseci), še posebej, ko prideš do točke, ko poskušaš prilagoditi relacijske zveze.

DB YugaByte DB še ne tekmuje z Google Cloud Spanner, CockroachDB ali vmesnikom SQL za Azure Cosmos DB zaradi pomanjkljivega vmesnika SQL. Zaradi pomanjkanja podpore z bazo podatkov grafov še ne konkurira Neo4j ali grafičnemu vmesniku Cosmos DB. Konkurira z Redisom, Cassandro in Cassandro združljivim vmesnikom za Cosmos DB.

Bi morali sami preizkusiti YugaByte DB? Če potrebujete distribuirano različico Redisa ali Cassandre ali morate zamenjati MongoDB za globalno distribuiran scenarij, potem da. YugaByte DB bi lahko uporabili tudi za standardizacijo ene same baze podatkov za več namenov, na primer za kombiniranje baze podatkov Cassandra s predpomnjenjem Redis, kot je storil naročnik YugaByte Narvar. YugaByte DB Cassandri doda tudi visoko zmogljive sekundarne indekse in tip JSON, s čimer poveča svojo uporabnost kot transakcijska baza podatkov.

Ali želite odprtokodno ali poslovno različico YugaByte DB, je odvisno od vašega proračuna. Če ste zagonsko podjetje, verjetno želite odprtokodno različico. Če ste uveljavljeno globalno podjetje z veliko aplikacijami za transakcijske baze podatkov, še posebej, če morate pogosto povečevati grozde gor in dol, boste morda imeli koristi od dodatnih funkcij v različici za podjetja.