Společnost Microsoft otevřela zdrojové kódy NoSQL systému Garnet, určeného pro vytváření cache úložišť a kompatibilního s existujícími klientskými knihovnami pro úložiště Redis. Garnet podporuje vytváření škálovatelných clusterů pro ukládání dat do cache, ve kterých lze využít replikaci, migraci klíčů a segmentaci dat mezi uzly clusteru. Projekt je napsán v jazyce C# s jádrem úložiště v C++, je otevřen pod licencí MIT a může pracovat na všech platformách podporovaných v .NET (primárními platformami jsou uvedeny Linux a Windows).
Pro ukládání dat je používán engine Tsavorite (fork úložiště Microsoft FASTER), který podporuje vícetrání zpracování požadavků, transakce, neblokující režim ukládání změn (checkpointing), obnovu po chybách, uchovávání redundantních kopií a vedení logu operací. Síťový zpracovatel v Garnetu je postaven na architektuře sdílené paměti, navržené výzkumným projektem ShadowFax. Zpracování TLS a interakce s úložištěm probíhá v jednom vlákně, což umožňuje vyhnout se režijním nákladům spojeným se přepínáním vláken a efektivněji využívat CPU cache při přenosu dat po síti.
Architektura Garnet odděluje logiku parsování a zpracování požadavků od operací s úložištěm. Data jsou ukládána pomocí dvou úložišť ve formátu klíč-hodnota, realizovaných na bázi knihovny Tsavorite. První "primární" úložiště je optimalizováno pro rychlé provádění operací se řetězci, zatímco druhé "objektové" úložiště je optimalizováno pro uchovávání složitých objektů a rozšířených typů dat, jako jsou hash a seznamy. Typy dat ve druhém úložišti jsou implementovány s využitím knihoven .NET. Data jsou uchovávána v haldě (C# heap), což umožňuje jejich efektivní aktualizaci a ve serializované podobě na disku.

Vlastnosti Garnet:
- Možné nasazení vícestupňových úložišť, zahrnující operační paměť, SSD disky a cloudová úložiště, ve kterých jsou méně potřebná data přesunována do pomalejších úložišť pro vytvoření cache o velikosti větší než operační paměť.
- Škálovatelná podpora zařízení umožňující vytváření vrstev optimalizovaných pro různá zařízení, například existují vrstvy pro SSD, pevné disky a cloudové úložiště Azure Storage.
- Efektivní mechanismus pro opětovné využití uvolněného prostoru v operační paměti, který zabraňuje fragmentaci.
- Přizpůsobitelné limity na velikost paměti používané pro indexy, logy a ukládání objektů.
- Pro přístup k úložišti se používá protokol RESP, což umožňuje použití Garnet s nemodifikovanými klienty Redis.
- Podpora ukládání jak řetězcových hodnot, tak složitých datových struktur, jako jsou seznamy, hash, množiny, seřazené seznamy a geolokační data. Možnost definování doby života klíče.
- Dostupnost API pro provádění analytických dotazů (HLL/Hyperloglog, Bitmap), transakcí (MULTI/EXEC) a použití paradigmatu publikování/odběru.
- Dostupnost nástrojů pro flexibilní správu přístupu přes ACL.
- Možnost definice konfigurace ve formátu JSON nebo redis.conf.
- Podpora připojení dalších síťových zpracovatelů. Možnost šifrování provozu pomocí TLS (na základě SslStream).
- Možnost vytváření rozšíření v jazyce C#, která implementují další operace se řetězci a objekty.
- Podpora transakčních uložených procedur pokrývajících více klíčů.
- Možnost obnovení stavu z dříve uložené pozice (checkpoint-recovery). K dispozici je režim pouze pro přidání (AOF, append-only file), ve kterém zůstávají všechny staré údaje dostupné a nejsou nahrazeny.
- Podpora vytváření storage clusteru s replikací, segmentací (Sharding), dynamickou migrací klíčů mezi uzly a obnovou selhaných uzlů.
- Vysoký výkon a nízké latence při vykonávání dotazů. Efektivní zpracování malých dávkových dotazů při vysokém počtu klientských relací, což umožňuje dosáhnout propustnosti (počet zpracovaných dotazů za sekundu) o řád vyšší než u konkurenčních řešení. Při spuštění v virtual machines V cloudu Azure většinou latence klientského požadavku nepřesahuje 300 mikrosekund. V provedených testech Garnet výrazně překonává Redis, Dragonfly a KeyDB z hlediska výkonu a odezvy. V některých testech Garnet předběhl konkurenční systémy až desetkrát.




Zdroj: opennet.ru




