A avut loc lansarea sistemului de cache și stocare a datelor în memoria operativă Dragonfly, care manipulează datele în format cheie/valoare și poate fi folosit ca o soluție ușoară pentru a accelera funcționarea site-urilor cu încărcare mare, cache-uind cererile lente către SGBD și datele intermediare în memoria operativă. Dragonfly suportă protocoalele Memcached și Redis, ceea ce permite utilizarea deja existentelor biblioteci client și, fără modificarea codului, transferarea proiectelor care utilizează Memcached și Redis la Dragonfly.
Comparativ cu Redis, în Dragonfly, în condiții tipice de încărcare în mediu Amazon EC2 c6gn.16xlarge, s-a reușit obținerea unei creșteri de 25 de ori a performanței (3,8 milioane de cereri pe secundă). Comparativ cu Memcached în mediul AWS c6gn.16xlarge, Dragonfly a reușit să execute de 4,7 ori mai multe cereri pe secundă la scriere (3,8 milioane față de 806 mii) și de 1,77 de ori mai multe cereri pe secundă la citire (3,7 milioane față de 2,1 milioane).

În testele de stocare a 5 GB de date, Dragonfly a necesitat cu 30% mai puțină memorie decât Redis. În timpul creării instantaneelor cu comanda „bgsave”, consumul de memorie crește, dar în momentele de vârf a rămas de aproape trei ori mai mic decât în Redis, iar operațiunea de scriere a instantaneului se desfășoară semnificativ mai repede (în test, instantaneul în Dragonfly a fost scris în 30 de secunde, iar în Redis — în 42 de secunde).

Performanța înaltă este obținută grație arhitecturii multi-thread fără partajarea resurselor (shared-nothing), care implică faptul că fiecărui fir îi este alocat un handler individual de date, care funcționează fără mutex-uri și blocaje spin. Pentru a asigura atomicitatea procesării cu mai multe chei, se utilizează blocări ușoare VLL. Pentru stocarea eficientă a informației în memorie, se aplică structura dashtable, care implementează o variantă de tabele hash secționate.
Unele funcționalități ale Dragonfly:
- Modul de caching în care vechile date sunt înlocuite automat cu cele noi după epuizarea memoriei libere.
- Suport pentru atașarea unui timp de viață datelor, perioada în care datele sunt considerate actuale.
- Suport pentru resetarea stării stocării pe disc în fundal pentru recuperare ulterioară după repornire.
- Disponibilitatea consolei HTTP (legată de portul TCP 6379) pentru gestionarea sistemului și API pentru livrarea metricilor, compatibil cu Prometheus.
- Suport pentru 185 de comenzi Redis, care corespunde aproximativ funcționalităților versiunii Redis 5.
- Suport pentru toate comenzile Memcached, cu excepția CAS (check-and-set).
- Suport pentru operațiuni asincrone pentru crearea de instantanee.
- Consumul de memorie previzibil.
- Interpretul Lua 5.4 integrat.
- Suport pentru tipuri complexe de date, cum ar fi hash-uri, seturi, liste (ZSET, HSET, LIST, SETS și STRING) și date în format JSON.
- Suport pentru replicarea stocării pentru asigurarea rezilienței și echilibrării sarcinii.
Codul Dragonfly este scris în limbaje C/C++ și este distribuit sub licența BSL (Business Source License). Licența BSL a fost propusă de co-fondatorii MySQL ca alternativă la modelul Open Core. Esența BSL constă în faptul că codul pentru funcționalități extinse este inițial disponibil pentru modificări, dar pentru o anumită perioadă poate fi utilizat gratuit doar sub anumite condiții suplimentare, iar pentru a eluda aceste condiții este necesară achiziționarea unei licențe comerciale. Condițiile suplimentare de licențiere pentru proiectul Dragonfly preconizează tranziția codului la licența Apache 2.0 pe 15 martie 2028. Până atunci, licența permite utilizarea codului doar pentru asigurarea funcționării propriilor servicii și produse, dar interzice utilizarea pentru crearea de servicii cloud plătite ce funcționează pe baza Dragonfly.
Versiunea Dragonfly 1.0 se remarcă prin implementarea suportului pentru replicarea datelor de la serverul primar server către cel secundar. În acest sens, Dragonfly poate fi configurat pentru a funcționa ca stocare secundară, primind date de la un server primar bazat atât pe Dragonfly, cât și pe Redis. API-ul pentru gestionarea replicării este compatibil cu Redis și se bazează pe utilizarea comenzilor ROLE și REPLICAOF (SLAVEOF).
Sursa: opennet.ro
