Programovanie

Recenzia CockroachDB: Škálovateľná databáza SQL vytvorená na prežitie

Až donedávna ste si pri nákupe databázy museli zvoliť: Škálovateľnosť alebo konzistencia? Databázy SQL, ako napríklad MySQL, zaručujú silnú konzistenciu, ale nie sú horizontálne správne škálované. (Manuálne rozdelenie na škálovateľnosť nie je žiadnou predstavou zábavy.) Databázy NoSQL, ako napríklad MongoDB, sa krásne zväčšujú, ale ponúkajú iba prípadnú konzistenciu. („Počkajte dosť dlho a budete si môcť prečítať správnu odpoveď.“ - čo nie je nijaká možnosť finančných transakcií.)

Google Cloud Spanner, plne spravovaná služba relačnej databázy bežiaca na Google Compute Engine (GCE), ktorá bola vydaná vo februári 2017, má škálovateľnosť databáz NoSQL pri zachovaní kompatibility s SQL, relačných schém, transakcií ACID a silnej externej konzistencie. Spanner je črepová, globálne distribuovaná a replikovaná relačná databáza, ktorá na dosiahnutie konsenzu medzi svojimi uzlami používa algoritmus Paxos.

Jednou z alternatív k programu Spanner a predmetom tejto kontroly je CockroachDB, otvorená, horizontálne škálovateľná distribuovaná databáza SQL vyvinutá ex-zamestnancami spoločnosti Google, ktorí boli v spoločnosti Spanner oboznámení. Spoločnosť CockroachDB si na návrh systému ukladania dát požičala od spoločnosti Google Spanner a na dosiahnutie konsenzu medzi svojimi uzlami používa algoritmus Raft.

Rovnako ako Cloud Spanner, aj CockroachDB je distribuovaná databáza SQL postavená na vrchole transakčného a konzistentného úložiska kľúč-hodnota, v prípade CockroachDB na RocksDB. Primárnymi cieľmi projektu CockroachDB sú podpora pre transakcie s kyselinami, horizontálna škálovateľnosť a (predovšetkým) schopnosť prežiť, odtiaľ názov.

CockroachDB je navrhnutý na prežitie zlyhaní diskov, strojov, rackov a dokonca aj dátových centier s minimálnym narušením latencie a bez manuálneho zásahu. Samozrejme, na dosiahnutie toho je potrebné spustiť a zhluk mnohých prípadov symetrických uzlov CockroachDB pomocou viacerých diskov, strojov, stojanov a dátových centier.

Na rozdiel od Cloud Spanner, ktorý používa API TrueTime dostupné na synchronizáciu času v dátových centrách Google, CockroachDB nemôže počítať s prítomnosťou atómových hodín a satelitných hodín GPS na presnú synchronizáciu času medzi uzlami a dátovými centrami. To má niekoľko dôsledkov. Google TrueTime najskôr poskytuje hornú hranicu pre posuny hodín medzi uzlami v klastri siedmich milisekúnd. To je dosť malé na to, aby uzol Spanner čakal sedem milisekúnd po zápise a potom nahlásil, že sa transakcia zaviazala, aby bola zaručená vonkajšia konzistencia.

Bez TrueTime alebo podobného zariadenia musí CockroachDB klesnúť späť na NTP, čo dáva horné hranice synchronizácie hodín medzi 100 milisekundami a 250 milisekundami. Vzhľadom na väčšie časové okno CockroachDB nečaká na zápisy. Namiesto toho niekedy počká pred načítaním, v zásade reštartuje transakciu, ak načíta hodnotu s časovou značkou väčšou ako je začiatok transakcie, opäť kvôli zaisteniu konzistencie.

Keď majú všetky uzly v klastri CockroachDB malé horné hranice pre posuny hodín, ktoré môžete získať z GPS alebo atómových hodín, čo je práve dostupné vo veľkých verejných cloudoch, môže mať zmysel spustiť ich pomocou - linearizovateľné vlajka. To ich núti čakať na maximálny posun hodín pred návratom k úspešnému odovzdaniu, rovnako ako Spanner.

Ako funguje CockroachDB

Každý uzol CockroachDB pozostáva z piatich vrstiev:

  • SQL, ktorý prevádza dotazy klienta SQL na operácie kľúč - hodnota
  • Transakcia, ktorá umožňuje atómové zmeny vo viacerých položkách kľúč - hodnota
  • Distribúcia, ktorá predstavuje replikované rozsahy kľúč - hodnota ako jeden celok
  • Replikácia, ktorá dôsledne a synchrónne replikuje rozsahy kľúč - hodnota na mnohých uzloch a umožňuje konzistentné čítanie prostredníctvom leasingu
  • Úložisko, ktoré zapisuje a číta dáta kľúč - hodnota na disku

Vrstva SQL analyzuje dotazy na súbor Yacc a mení ich na abstraktný strom syntaxe. Z abstraktného stromu syntaxe generuje CockroachDB strom uzlov plánu, ktoré obsahujú kód kľúč - hodnota. Potom sa vykonajú uzly plánu, ktoré komunikujú s transakčnou vrstvou.

Transakčná vrstva implementuje sémantiku transakcií ACID s dvojfázovými príkazmi v celom klastri vrátane transakcií medzi rozsahmi a tabuľkami, pričom jednotlivé príkazy považuje za transakcie (nazýva sa tiež režim automatického potvrdenia). Dvojfázové potvrdenie sa dosiahne zverejnením záznamov transakcií a zámerov zápisu, vykonaním operácií čítania a spracovaním všetkých zámerov zápisu, ktoré sa vyskytnú ako konflikty transakcií.

Distribučná vrstva prijíma požiadavky z transakčnej vrstvy v rovnakom uzle. Potom identifikuje, ktoré uzly by mali prijať žiadosť, a odošle požiadavku do replikačnej vrstvy správneho uzla.

Replikačná vrstva kopíruje údaje medzi uzlami a zaisťuje konzistenciu medzi týmito kópiami implementáciou konsenzuálneho algoritmu Raft. Faktor replikácie môžete ovládať na úrovni klastra, databázy a tabuľky pomocou zón replikácie. Konsenzusový algoritmus sa používa iba na zápisy a vyžaduje, aby sa kvórum replík dohodlo na akýchkoľvek zmenách rozsahu predtým, ako sa tieto zmeny vykonajú.

Úložná vrstva ukladá údaje ako páry kľúč - hodnota na disk pomocou RocksDB. CockroachDB sa pri spracovávaní súbežných požiadaviek a na zaručenie konzistencie veľmi spolieha na riadenie viacerých verzií súbežnosti (MVCC). Väčšina tejto práce sa vykonáva pomocou časových značiek hybridných logických hodín (HLC).

Rovnako ako Spanner, aj CockroachDB podporuje dotazy na cestovanie v čase (povolené MVCC). Môžu sa vrátiť až k vášmu najnovšiemu zhromažďovaniu údajov z databázy, ktoré sa štandardne vykonáva každý deň.

Inštalácia a použitie CockroachDB

CockroachDB beží na operačných systémoch Mac, Linux a Windows, minimálne na vývoj a testovanie. Databázy produkčných švábov zvyčajne fungujú na virtuálnych počítačoch so systémom Linux alebo na orchestrovaných kontajneroch, ktoré sú často hostené na verejných cloudoch vo viacerých dátových centrách. Binárny súbor Windows programu CockroachDB je stále v beta fáze a jeho produkcia sa neodporúča. Spoločnosť Apple už nevyrába serverový hardvér.

Laboratóriá švábov

Ako vidíte na snímke obrazovky vyššie, existujú štyri možnosti inštalácie CockroachDB na počítači Mac. Ako najjednoduchšiu zo všetkých štyroch som si vybral Homebrew.

Mimochodom, spoločnosť Cockroach Labs zverejňuje na webe varovanie, ktoré hovorí, že spustenie stavovej aplikácie, ako je CockroachDB, v Dockeri je zložité, neodporúča sa pri produkčných nasadeniach a namiesto toho na spustenie klastra používa nástroj na orchestráciu, ako je Kubernetes alebo Docker Swarm. V ďalšej časti sa budem venovať možnostiam orchestrácie kontajnerov.

Inštalácia na počítači Mac je rovnako jednoduchá ako variť inštalovať šváb ako je uvedené vyššie. V mojom prípade automatická aktualizácia Homebrewu trvala oveľa dlhšie (dostatok času na varenie čaju) ako samotná inštalácia CockroachDB, ktorá trvala iba pár sekúnd.

Keď už máte CockroachDB nainštalovaný, je celkom ľahké roztočiť miestny klaster, aj keď je tu ďalší krok, ktorým je generovanie bezpečnostných certifikátov pomocou šváb cert príkaz, ak chcete, aby bol klaster zabezpečený. Akonáhle máte spustený klaster (pomocou šváb štart jeden uzol pre každý uzol s nasledujúcimi uzlami nastavenými na pripojenie sa k klastru prvého uzla), pomocou prehliadača sa môžete pripojiť na stránku webovej správy na ľubovoľnom uzle a použiť vložený šváb sql klientovi posielať dotazy SQL na akýkoľvek uzol. Väčšina prehliadačov si bude sťažovať na stránky s certifikátmi generovanými pomocou CockroachDB, mali by ste však byť schopní prekliknúť sa cez toto hrozné varovanie a pokračovať na stránku.

Odporúčané výrobné nastavenia CockroachDB sa líšia od predvolených nastavení, ktoré boli nastavené pre vývojové a testovacie inštancie. Ak chcete, môžete sa rozvíjať na klastri s jedným uzlom. Pre produkciu by ste mali mať minimálne tri uzly, každý uzol spustiť na samostatnom počítači, virtuálnom počítači alebo kontajneri a každej inštancii poskytnúť ďalšiu medzipamäť a pamäť SQL. Predvolené nastavenie je 128 MB pre vyrovnávaciu pamäť a pamäť SQL; odporúčané výrobné nastavenia sú pre každých 25 percent pamäte RAM:

štart švábov - keška = 25% --max-sql-pamäť = 25%

Čím viac uzlov spustíte, tým lepšia bude odolnosť. Čím väčšie a rýchlejšie uzly, tým lepší výkon. Ak chcete mať uzly s výkonom zhruba porovnateľným s uzlami Google Cloud Spanner, ktoré poskytujú 2 000 zápisov za sekundu a 10 000 čítaní za sekundu, potom by ste chceli niečo ako inštancie GCE n1-highcpu-8, ktoré majú osem CPU a 8 GB RAM , s miestnymi diskami SSD (namiesto rotujúcich diskov).

Čím viac distribuujete svoje uzly do rôznych dátových centier, tým lepšie môžete zabezpečiť imunitu voči zlyhaniam na úrovni dátového centra. Cena však stojí: Spiatočná latencia medzi dátovými centrami bude mať priamy vplyv na výkon vašej databázy, pričom klastre naprieč kontinentmi dosahujú zreteľne horšie výsledky ako klastre, v ktorých sú všetky uzly geograficky blízko seba.

Spoločnosť Cockroach Labs poskytuje podrobné pokyny na nasadenie na AWS, Digital Ocean, GCE a Azure. Odporúčané konfigurácie používajú nástroje na vyrovnávanie zaťaženia, buď natívne spravované služby vyrovnávania zaťaženia, alebo nástroje na vyrovnávanie zaťaženia otvoreného zdroja, napríklad HAProxy.

Orchestrácia môže znížiť prevádzkovú réžiu klastra CockroachDB takmer na nič. Spoločnosť Cockroach Labs dokumentuje, ako to urobiť pre produkciu, pomocou Kubernetes a Docker Swarm. Úložisko CockroachDB-CloudFormation na GitHub ukazuje, ako používať AWS CloudFormation a Kubernetes v jednej zóne dostupnosti pre vývoj a testovanie. Prispôsobenie tohto pre produkciu by vyžadovalo úpravu šablóny CloudFormation tak, aby používala viac zón dostupnosti.

Programovanie a testovanie CockroachDB

CockroachDB podporuje drôtový protokol PostgreSQL, takže svoj kód napíšete, akoby ste programovali proti Postgresu alebo aspoň k podmnožine Postgresu. Táto stránka obsahuje zoznam testovaných ovládačov pre rôzne väzby programovacích jazykov vrátane najpopulárnejších jazykov na strane servera. Táto stránka obsahuje zoznam vzoriek v 10 programovacích jazykoch a piatich ORM. Pri čítaní kódu som sa nestretol s veľkým prekvapením, aj keď som v zoznamoch v dokumentácii objavil niekoľko pravdepodobných menších chýb. Môžete tiež spustiť svoj SQL pomocou interaktívneho klienta zabudovaného do šváb spustiteľný.

I když existuje repo určené pro generátory zátěže CockroachDB a další pro testování výkonu, není srovnávání klastrů CockroachDB jednoduché, najmä ak sa snažíte zmysluplne porovnať CockroachDB s inými databázami. Jedným problémom je, že sieť medzi uzlami môže byť krokom obmedzujúcim rýchlosť v klastroch CockroachDB.

Ďalším faktom, ktorý je potrebné vziať do úvahy, je, že väčšina bežných databáz SQL sa štandardne nespúšťa v izolačnom režime SERIALIZABLE; namiesto toho používajú menej prísny režim s lepším výkonom. CockroachDB štandardne používa režim serializovateľnej izolácie. Bolo by tiež trochu nespravodlivé testovať pomocou aplikácie TPC-C výkon pripojenia SQL spoločnosti CockroachDB, ktorý je stále nedokončenou prácou.

A napriek tomu môžete ľahko zistiť prevádzkový výkon prístroja CockroachDB. Napríklad veľa databáz je potrebné zastaviť a reštartovať, aby sa mohli zväčšiť. Pridanie zaťažených uzlov v aplikácii CockroachDB je hračka, najmä ak používate nástroj na orchestráciu. Napríklad vyššie uvedená snímka obrazovky zobrazuje príkazy na zmenu a zobrazenie uzlov v klastri Kubernetes a nasledujúca snímka obrazovky zobrazuje sledovaný klaster pri pridávaní uzlov. Nástroj na generovanie zaťaženia bežal nepretržite počas celého procesu.

Ešte pôsobivejšia ukážka ukazuje automatickú migráciu medzi cloudmi v rámci klastra CockroachDB. Na zaistenie spravodlivosti si to vyžaduje naozaj video; video je hostené v prepojenom blogovom príspevku.

CockroachDB SQL

SQL v CockroachDB je viac-menej štandard, na rozdiel od SQL v Cloud Spanner, ktorý používa neštandardnú syntax na manipuláciu s dátami. CockroachDB SQL však stále chýba veľa funkcií.

Napríklad vo V1.1 chýba podpora JSON, ktorá je plánovaná na V1.2. Chýba mu tiež analýza XML, ktorá nie je v pláne. Chýbajú mu kaskády na úrovni riadkov plánované na verziu 1.2 a chýbajú mu kurzory a spúšťače, ktoré nie sú uvedené v cestovnej mape. Geopriestorové indexy sú „potenciálnymi“ doplnkami, ktoré môžu v budúcnosti prispieť k dosiahnutiu plánu.

Najdôležitejšie je, že počiatočná implementácia spojenia SQL v roku 2016 CockroachDB bola zámerne zjednodušená a vykazovala kvadratické škálovanie, takže bola zbytočná na dopytovanie veľkých súborov údajov. Verzia vo verzii 1.0, ktorú vytvoril študent družstva, implementovala hašovacie spojenia, vďaka čomu je veľa operácií spojenia lineárne škálovaných; ktorý dostal CockroachDB asi na úroveň SQLite. Niekedy v roku 2018, vzhľadom na nedávne kolo financovania, by mal mať CockroachDB výkon spojenia, ktorý sa viac podobá spojeniam PostgreSQL, ako aj spracovanie spojenia SQL distribuované po klastri.

$config[zx-auto] not found$config[zx-overlay] not found