Firma Microsoft udostępniła kody źródłowe systemu NoSQL Garnet, który jest zaprojektowany do tworzenia pamięci podręcznych oraz jest zgodny z istniejącymi bibliotekami klienckimi dla magazynu Redis. Garnet obsługuje tworzenie skalowalnych klastrów do buforowania danych, w których można zastosować replikację, migrację kluczy i segmentację danych pomiędzy węzłami klastra. Projekt został napisany w języku C# z rdzeniem magazynowym w C++, udostępniony na licencji MIT i może działać na wszystkich platformach obsługiwanych przez .NET (głównymi platformami są Linux i Windows).
Do przechowywania danych używany jest silnik Tsavorite (fork magazynu Microsoft FASTER), który wspiera wielowątkowe przetwarzanie żądań, transakcje, zapisywanie zmian w trybie bezblokującym (checkpointing), odzyskiwanie po awariach, przechowywanie nadmiarowych kopii oraz prowadzenie dziennika operacji. Mechanizm sieciowy w Garnet zbudowany jest na architekturze pamięci dzielonej, zaproponowanej w ramach projektu badawczego ShadowFax. Obsługa TLS i interakcja z magazynem odbywa się w jednym wątku, co pozwala uniknąć kosztów związanych z przełączaniem wątków oraz efektywniej wykorzystać pamięć podręczną CPU podczas przesyłania danych przez sieć.
Architektura Garnet oddziela logikę analizy i przetwarzania żądań od operacji na magazynie. Dane są przechowywane przy użyciu dwóch magazynów w formacie klucz-wartość, zaimplementowanych na podstawie biblioteki Tsavorite. Pierwszy 'główny' magazyn jest zoptymalizowany do szybkiego wykonywania operacji na ciągach, a drugi 'obiektowy' magazyn jest zoptymalizowany do przechowywania złożonych obiektów i rozbudowanych typów danych, takich jak hashe i listy. Typy danych w drugim magazynie są zrealizowane z wykorzystaniem bibliotek .NET. Dane są przechowywane w stercie (C# heap), co pozwala na ich efektywne aktualizowanie, oraz w formie zserializowanej na dysku.

Cechy Garnet:
- Możliwe jest wdrażanie wielowarstwowych magazynów, obejmujących pamięć operacyjną, dyski SSD i magazyny w chmurze, w których mniej potrzebne dane są przenoszone do wolniejszych magazynów, aby utworzyć pamięci podręczne większe niż pamięć operacyjna.
- Rozszerzone wsparcie dla urządzeń, umożliwiające tworzenie warstw zoptymalizowanych do współpracy z różnymi urządzeniami, takimi jak warstwy dla SSD, dysków twardych i chmury Azure Storage.
- Efektywny mechanizm ponownego wykorzystania zwolnionej przestrzeni w pamięci operacyjnej, zapobiegający fragmentacji.
- Konfigurowalne limity na rozmiar pamięci używanej na indeksy, logi i przechowywanie obiektów.
- Do dostępu do magazynu stosowany jest protokół RESP, co umożliwia korzystanie z Garnet z niezmodyfikowanymi klientami Redis.
- Wsparcie dla przechowywania zarówno wartości prostych, jak i złożonych struktur danych, takich jak listy, hashe, zbiory, posortowane listy i dane geolokalizacyjne. Możliwość definiowania czasu życia klucza.
- Dostępność API do wykonywania zapytań analitycznych (HLL/Hyperloglog, Bitmap), transakcji (MULTI/EXEC) oraz do korzystania z paradygmatu publikacji/subskrypcji.
- Dostępność narzędzi do elastycznego zarządzania dostępem przez ACL.
- Możliwość definiowania konfiguracji w formacie JSON lub redis.conf.
- Wsparcie dla podłączenia dodatkowych przetwarzaczy sieciowych. Możliwość szyfrowania ruchu przy użyciu TLS (na bazie SslStream).
- Możliwość tworzenia rozszerzeń w języku C#, które implementują dodatkowe operacje na tekstach i obiektach.
- Wsparcie dla transakcyjnych procedur składowanych obejmujących wiele kluczy.
- Możliwość przywrócenia stanu z wcześniej zapisanej pozycji (checkpoint-recovery). Istnienie trybu tylko do dodawania (AOF, append-only file), w którym wszystkie stare dane pozostają dostępne i nie są zastępowane.
- Wsparcie dla tworzenia klastra magazynowego z replikacją, segmentacją (Sharding), dynamiczną migracją kluczy między węzłami i odzyskiwaniem węzłów po awarii.
- Wysoka wydajność i niskie opóźnienia podczas wykonywania zapytań. Efektywne przetwarzanie drobnych pakietowych zapytań przy dużej liczbie sesji klienckich, co pozwala uzyskać przepustowość (liczba przetworzonych zapytań na sekundę) o rząd wielkości wyższą niż w konkurencyjnych rozwiązaniach. maszynach wirtualnych W chmurze Azure w większości przypadków opóźnienia w dostępie klienta nie przekraczają 300 mikrosekund. W przeprowadzonych testach Garnet znacznie przewyższa Redis, Dragonfly i KeyDB pod względem wydajności i responsywności. W niektórych testach Garnet wyprzedza konkurencyjne systemy dziesięciokrotnie.




Źródło: opennet.ru




