Został wydany system buforowania i przechowywania danych w pamięci operacyjnej Dragonfly, który manipuluje danymi w formacie klucz/wartość i może być stosowany jako lekkie rozwiązanie przyspieszające działanie wysoko obciążonych stron, buforując wolne zapytania do bazy danych i dane pośrednie w pamięci operacyjnej. Dragonfly obsługuje protokoły Memcached i Redis, co pozwala na wykorzystanie istniejących bibliotek klienckich i bez przeróbek kodu przenieść na Dragonfly projekty używające Memcached i Redis.
W porównaniu do Redis, Dragonfly osiągnął 25-krotne zwiększenie wydajności (3.8 mln zapytań na sekundę) w typowych warunkach obciążeniowych w środowisku Amazon EC2 c6gn.16xlarge. W porównaniu do Memcached w środowisku AWS c6gn.16xlarge, Dragonfly był w stanie wykonać 4.7 razy więcej zapytań na sekundę podczas zapisu (3.8 mln w porównaniu do 806 tysięcy) oraz 1.77 razy więcej zapytań na sekundę podczas odczytu (3.7 mln w porównaniu do 2.1 mln).

W testach przechowywania 5 GB danych, Dragonfly wymagał o 30% mniej pamięci niż Redis. Podczas tworzenia zrzutów za pomocą komendy „bgsave” zużycie pamięci wzrasta, ale w momentach szczytowych pozostaje prawie trzy razy niższe niż w Redis, a sama operacja zapisu zrzutu odbywa się znacznie szybciej (w teście zrzut w Dragonfly został zapisany w 30 sekund, a w Redis — w 42 sekundy).

Wysoka wydajność jest osiągana dzięki architekturze wielowątkowej bez podziału zasobów (shared-nothing), co oznacza, że do każdego wątku przypisany jest osobny, izolowany port i jego własna porcja danych, działający bez mutexów i spin-locków. Aby zapewnić atomowość podczas pracy z wieloma kluczami, stosowane są lekkie blokady VLL. Efektywne przechowywanie informacji w pamięci realizowane jest za pomocą struktury dashtable, implementującej rodzaj wydzielonych tabel haszowych.
Niektóre możliwości Dragonfly:
- Tryb buforowania, w którym automatycznie zapewniane jest usuwanie starych danych na rzecz nowych po wyczerpaniu pamięci.
- Wsparcie dla wiązania danych z czasem życia, w którym dane są uważane za aktualne.
- Obsługa zrzutu stanu magazynu na dysk w tle w celu późniejszego przywrócenia po ponownym uruchomieniu.
- Obecność konsoli HTTP (przypisanej do portu TCP 6379) do zarządzania systemem oraz interfejsu API do dostarczania metryk, zgodnego z Prometheusem.
- Wsparcie dla 185 komend Redis, co mniej więcej odpowiada funkcjonalności wydania Redis 5.
- Wsparcie dla wszystkich komend Memcached, za wyjątkiem CAS (check-and-set).
- Wsparcie dla operacji asynchronicznych do tworzenia zrzutów.
- Przewidywalne zużycie pamięci.
- Wbudowany interpreter Lua 5.4.
- Wsparcie dla złożonych typów danych, takich jak hasze, zbiory, listy (ZSET, HSET, LIST, SETS oraz STRING) oraz dane w formacie JSON.
- Wsparcie dla replikacji magazynu w celu zapewnienia odporności na awarie i równoważenia obciążenia.
Kod Dragonfly jest napisany w językach C/C++ i jest dystrybuowany na licencji BSL (Business Source License). Licencja BSL została zaproponowana przez współzałożycieli MySQL jako alternatywa dla modelu Open Core. Główną ideą BSL jest to, że kod rozszerzonej funkcjonalności jest początkowo dostępny do modyfikacji, ale przez pewien czas można go używać za darmo tylko pod warunkiem spełnienia dodatkowych warunków, których obejście wymaga zakupu licencji komercyjnej. Dodatkowe warunki licencyjne projektu Dragonfly przewidują przeniesienie kodu na licencję Apache 2.0 15 marca 2028 roku. Do tego czasu licencja zezwala na użycie kodu tylko do zapewnienia działania własnych usług i produktów, ale zabrania wykorzystania go do tworzenia płatnych usług chmurowych, które stanowią nakładkę na Dragonfly.
Wersja Dragonfly 1.0 wyróżnia się realizacją wsparcia repliki danych z serwera głównego serwera na serwer podrzędny. Dragonfly można skonfigurować jako podrzędne przechowywanie danych, które przyjmuje dane z serwera głównego zarówno opartego na Dragonfly, jak i na Redis. API do zarządzania replikacją jest zgodne z Redis i opiera się na użyciu poleceń ROLE i REPLICAOF (SLAVEOF).
Źródło: opennet.ru
