Rovnoměrné šardování databází: Strategie rozdělení dat a zpracování dotazů
Rovnoměrné šardování je metoda horizontálního škálování databází, při které jsou data rozdělena na šardy bez předem známého klíče rozdělení. Tento přístup řeší problémy, kdy obchodní logika neumožňuje zvolit statický klíč nebo kdy klíč časem ztrácí účinnost. Hlavním cílem je zajistit vyvážení zátěže a rovnoměrné rozdělení záznamů mezi uzly, což je kritické pro systémy s dynamicky se měnícími požadavky.
Principy rovnoměrného rozdělení dat
Rovnoměrnost se dosahuje dvěma hlavními způsoby: náhodným výběrem šardu nebo na základě vytížení uzlů. Náhodné rozdělení je jednoduché na implementaci, ale nekoriguje nevyváženost, pokud šardy mají od počátku různou velikost. Flexibilnější metoda je použití priorit šardů založených na aktuálním počtu záznamů, což umožňuje:
- Automaticky vyrovnávat zátěž při nerovnoměrném počátečním stavu.
- Zohledňovat různé vybavení v clusteru prostřednictvím nastavení priorit.
- Dočasně vyloučit šardy ze zápisu (například priorita 0) pro údržbu nebo archivaci.
Pro sledování vytížení služba pravidelně dotazuje velikost klíčových tabulek v každém šardu a tyto hodnoty ukládá do mezipaměti, čímž minimalizuje režijní náklady.
Generování a používání identifikátorů objektů
Při rovnoměrném šardování musí identifikátor objektu (ID) obsahovat informaci o šardu, například ve formě offsetu nebo seedu v číselném klíči. To zrychluje OLTP operace, jako jsou SELECT a UPDATE pro konkrétní ID, protože šard je určen přímo z ID. Generování klíčů vyžaduje efektivní přístup:
- Dotazy na získání klíčů by měly vracet intervaly (například NN klíčů najednou), nikoli generovat klíče jednotlivě, aby se předešlo úzkým místům ve výkonu.
- Seed pro každou tabulku může být uložen v systémové tabulce šardu nebo v konfiguraci připojení, což zajišťuje flexibilitu správy.
- Obchodní služba provede DML dotaz pro získání nového klíče před vložením objektu, čímž zachovává integritu dat.
Správa referenčních tabulek a logická replikace
V šardovaných systémech se často vyskytují referenční tabulky (lookup tables), které jsou malé objemově a zřídka aktualizované, ale nezbytné pro správnost dotazů. Pro jejich zpracování se doporučuje:
- Ukládat referenční tabulky v samostatné instanci databáze a aktualizovat je pouze tam.
- Používat logickou replikaci (například prostřednictvím mechanismů PostgreSQL) pro synchronizaci těchto tabulek se šardy.
- Tím se sníží zátěž na šardy a zjednoduší se udržování konzistence dat bez duplikace úsilí při aktualizacích.
Vyhledávání dat a stránkování v distribuovaném prostředí
Při rovnoměrném šardování vyhledávání dat bez známého klíče šardování vyžaduje koordinaci mezi uzly. Uvažujme případ: získání třetí stránky seznamu objednávek, seřazeného podle data v opačném pořadí. Koordinátor (proxy nebo obchodní služba) zpracuje dotaz takto:
- Přeloží dotaz do všech šardů, upraví hranice stránky: LIMIT je nastaven jako velikost stránky * číslo stránky + 1, OFFSET je vždy 0.
- Každý šard vrátí lokálně seřazená data v rámci zadaného LIMITu.
- Koordinátor sloučí výsledky ze všech šardů a provede globální řazení v jednom průchodu.
- Ze sloučeného seznamu je vyříznuta požadovaná stránka a vrácena uživateli.
Tento přístup zajišťuje konzistenci čtení, ale má nevýhodu: dodatečné řazení na straně koordinátora může spotřebovat značnou paměť při hlubokém stránkování. Pro zmírnění:
- Uživatelé zřídka přecházejí daleko po stránkách, což umožňuje optimalizaci pro typické scénáře.
- Pro export velkých objemů dat (například do XLSX/CSV) lze použít asynchronní generování souborů samostatnou službou s vyhrazenou pamětí, zpracovávající data sekvenčně.
Příklad implementace stránkování
Předpokládejme šardovanou tabulku t1 s sloupcem id rozdělenou mezi šardy A a B. Dotaz na první stránku o velikosti 2 záznamy, seřazené podle id vzestupně, je převeden na SQL: SELECT id FROM t1 ORDER BY id LIMIT 3 OFFSET 0. Koordinátor jej odešle do každého šardu, získá výsledky, seřadí je a vrátí stránku. Pro druhou stránku se LIMIT stane 5 (2 * 2 + 1), což umožní určit přítomnost dalších dat a zobrazit tlačítko "Další stránka". Tato metoda vyvažuje výkon a konzistenci, přizpůsobuje se hloubce navigace.
Co je důležité
- Rovnoměrné šardování řeší problémy dynamických klíčů rozdělení prostřednictvím vyvážení zátěže.
- Zahrnutí informace o šardu do ID objektů zrychluje OLTP operace a zjednodušuje směrování.
- Logická replikace pro referenční tabulky snižuje režijní náklady na aktualizace.
- Stránkování s koordinací vyžaduje optimalizaci paměti, ale je efektivní pro typické uživatelské scénáře.
- Asynchronní zpracování je vhodné pro export velkých dat, minimalizuje dopad na hlavní systém.
— Editorial Team
Zatím žádné komentáře.