Kas yra FerretDB ir kodėl apie jį verta kalbėti
Jei dirbate su duomenų bazėmis, tikriausiai esate girdėję apie MongoDB – vieną populiariausių NoSQL sprendimų rinkoje. Tačiau 2021 metais MongoDB pakeitė savo licenciją į SSPL (Server Side Public License), ir tai sukėlė nemažai diskusijų bendruomenėje. Daugelis įmonių ir kūrėjų pradėjo ieškoti alternatyvų, kurios išlaikytų MongoDB API suderinamumą, bet būtų tikrai atvirojo kodo.
Čia ir atsiranda FerretDB – projektas, kuris žada būti tikra MongoDB alternatyva su visiškai atviru kodu. Skirtingai nei MongoDB, FerretDB naudoja PostgreSQL arba SQLite kaip saugojimo variklį, o viršuje teikia MongoDB protokolo sąsają. Tai reiškia, kad jūsų egzistuojančios aplikacijos, kurios dirba su MongoDB, gali be didesnių pakeitimų pradėti naudoti FerretDB.
Projektas pradėtas 2021 metų pabaigoje ir aktyviai vystomas iki šiol. Nors tai vis dar gana jaunas sprendimas, jis jau sulaukė nemažo dėmesio iš bendruomenės ir verslo sektoriaus.
Kaip FerretDB veikia po gaubtu
FerretDB architektūra yra gana įdomi ir skiriasi nuo tradicinės MongoDB. Vietoj to, kad kurtų visiškai naują duomenų bazės variklį, FerretDB komanda nusprendė panaudoti jau egzistuojančius, patikrintus sprendimus.
Pagrindinis principas paprastas: FerretDB veikia kaip tarpinis sluoksnis tarp jūsų aplikacijos ir reliacinės duomenų bazės. Kai jūsų aplikacija siunčia MongoDB užklausą, FerretDB ją gauna, išverčia į SQL užklausą, perduoda PostgreSQL arba SQLite, gauna rezultatus ir grąžina juos MongoDB formatu.
Tokia architektūra turi keletą privalumų. Pirma, nereikia kurti duomenų bazės variklio nuo nulio – tai labai sudėtinga ir ilgai trunkanti užduotis. Antra, galite pasinaudoti visomis PostgreSQL funkcijomis: atsarginėmis kopijomis, replikacija, saugumu ir kitais įrankiais, kurie jau gerai išbandyti.
Žinoma, yra ir iššūkių. MongoDB dokumentų modelis ir SQL reliacinis modelis yra gana skirtingi, todėl ne viskas verčiama tiesiogiai. FerretDB komanda nuolat dirba prie to, kad palaikymas būtų kuo platesnis, bet kai kurios sudėtingesnės MongoDB funkcijos dar nėra pilnai realizuotos.
Diegimas ir pirmieji žingsniai
Pradėti naudoti FerretDB yra gana paprasta, ypač jei jau turite PostgreSQL duomenų bazę. Paprasčiausias būdas išbandyti – naudoti Docker. Štai pavyzdys, kaip galite paleisti FerretDB su PostgreSQL:
docker run -d --name postgres \
-e POSTGRES_USER=user \
-e POSTGRES_PASSWORD=password \
-e POSTGRES_DB=ferretdb \
postgres:15
docker run -d --name ferretdb \
-p 27017:27017 \
-e FERRETDB_POSTGRESQL_URL=postgres://user:password@postgres:5432/ferretdb \
ghcr.io/ferretdb/ferretdb
Po šių komandų FerretDB bus pasiekiamas per standartinį MongoDB prievadą 27017. Galite prisijungti naudodami bet kurį MongoDB klientą ar biblioteką.
Jei norite naudoti gamybinėje aplinkoje, rekomenduoju diegti FerretDB atskirame serveryje ir tinkamai sukonfigūruoti PostgreSQL. Nepamirškite nustatyti tinkamų atsarginių kopijų, monitoringo ir saugumo parametrų.
Prisijungimas ir bazinės operacijos
Prisijungti prie FerretDB galite naudodami standartinį MongoDB connection string:
mongodb://user:password@localhost:27017/ferretdb
Jei naudojate Python su pymongo biblioteka, kodas atrodys taip:
from pymongo import MongoClient
client = MongoClient('mongodb://user:password@localhost:27017/ferretdb')
db = client.testdb
collection = db.users
# Įterpti dokumentą
collection.insert_one({'name': 'Jonas', 'age': 30})
# Rasti dokumentus
users = collection.find({'age': {'$gt': 25}})
for user in users:
print(user)
Kaip matote, kodas visiškai identiškas tam, kurį naudotumėte su MongoDB. Tai ir yra pagrindinis FerretDB privalumas – jums nereikia keisti savo aplikacijos kodo.
Suderinamumas su MongoDB: kas veikia, o kas ne
Vienas svarbiausių klausimų, kurį užduoda visi, kurie svarsto FerretDB – kiek jis iš tikrųjų suderinamas su MongoDB? Atsakymas: priklauso nuo to, kokias funkcijas naudojate.
Pagrindinės CRUD (Create, Read, Update, Delete) operacijos veikia puikiai. Dauguma užklausų operatorių, tokių kaip $eq, $gt, $lt, $in, $and, $or ir panašūs, yra pilnai palaikomi. Tai reiškia, kad paprastos ir vidutinio sudėtingumo aplikacijos turėtų veikti be problemų.
Tačiau yra sričių, kur FerretDB dar atsilieka. Pavyzdžiui, agregacijos pipeline’ai – tai viena iš galingiausių MongoDB funkcijų – yra tik iš dalies palaikomi. Jei jūsų aplikacija intensyviai naudoja sudėtingas agregacijas, gali tekti jas perprojektuoti arba palaukti, kol FerretDB pridės pilną palaikymą.
Transakcijos taip pat yra ribotos. MongoDB palaiko multi-document transakcijas, o FerretDB šiuo metu gali pasiūlyti tik tai, ką leidžia PostgreSQL. Tai reiškia, kad transakcijos veikia, bet gali būti skirtumų elgsenoje.
Indeksai – dar viena svarbi tema. FerretDB palaiko pagrindinius indeksus, bet ne visus MongoDB indeksų tipus. Pavyzdžiui, geospatial indeksai dar nėra pilnai realizuoti.
Mano patarimas: prieš migruodami gamybinę sistemą, atidžiai išbandykite visas funkcijas, kurias naudojate. FerretDB projekto svetainėje rasite išsamų suderinamumo sąrašą, kuris nuolat atnaujinamas.
Našumo palyginimas su MongoDB
Našumas – tai klausimas, kuris domina visus. Ar FerretDB gali konkuruoti su MongoDB greičiu? Trumpas atsakymas: priklauso.
Paprastoms operacijoms, tokioms kaip dokumentų įterpimas ar paprasti paieškos užklausos, FerretDB našumas yra gana artimas MongoDB. Kartais net greitesnis, ypač jei jūsų PostgreSQL tinkamai sukonfigūruotas ir turi pakankamai resursų.
Tačiau sudėtingesnėms operacijoms, ypač agregacijoms, MongoDB dažniausiai bus greitesnis. Tai natūralu, nes MongoDB variklis optimizuotas būtent dokumentų duomenų bazės operacijoms, o FerretDB turi atlikti papildomą vertimo darbą.
Štai keletas patarimų, kaip optimizuoti FerretDB našumą:
- Naudokite indeksus – kaip ir bet kurioje duomenų bazėje, teisingi indeksai gali dramatiškai pagerinti našumą
- Optimizuokite PostgreSQL – padidinkite shared_buffers, effective_cache_size ir kitus parametrus pagal jūsų serverio resursus
- Naudokite connection pooling – tai sumažins ryšių kūrimo overhead
- Stebėkite užklausų planus – PostgreSQL EXPLAIN komanda gali padėti suprasti, kaip jūsų užklausos vykdomos
Jei jūsų aplikacija labai jautri našumui ir naudoja daug sudėtingų MongoDB funkcijų, galbūt FerretDB dar nėra tinkamas pasirinkimas. Bet jei jūsų poreikiai vidutiniai, FerretDB gali puikiai pasitarnauti.
Kada verta rinktis FerretDB vietoj MongoDB
Dabar pereikime prie praktinio klausimo: kada FerretDB yra geresnis pasirinkimas nei MongoDB?
Licencijos ir atvirumo klausimai. Jei jums svarbu naudoti tikrai atvirojo kodo sprendimus, FerretDB yra akivaizdus pasirinkimas. Jis naudoja Apache 2.0 licenciją, kuri yra daug lankstesnė nei MongoDB SSPL. Tai ypač aktualu įmonėms, kurios teikia cloud paslaugas arba planuoja tai daryti ateityje.
Jau naudojate PostgreSQL. Jei jūsų infrastruktūroje jau yra PostgreSQL ir turite komandą, kuri gerai jį išmano, FerretDB leidžia pridėti dokumentų duomenų bazės galimybes nenaudojant papildomos sistemos. Tai supaprastina infrastruktūrą, atsargines kopijas, monitoringą ir saugumą.
Hibridiniai duomenys. Kartais reikia ir reliacinių, ir dokumentų duomenų. Su FerretDB galite naudoti tą pačią PostgreSQL instanciją abiem tikslams. Galite net rašyti SQL užklausas, kurios jungia reliacinius ir dokumentų duomenis – tai su MongoDB būtų neįmanoma.
Mažesnės apimties projektai. Jei kuriate startup’ą ar vidutinio dydžio aplikaciją, FerretDB gali būti ekonomiškas pasirinkimas. Nereikia mokėti už MongoDB Atlas ar diegti sudėtingos MongoDB infrastruktūros.
Tačiau yra situacijų, kai MongoDB vis dar yra geresnis pasirinkimas. Jei naudojate daug specifinių MongoDB funkcijų, tokių kaip change streams, sharding, arba sudėtingas agregacijas, geriau likti su MongoDB. Taip pat jei turite labai didelę sistemą su griežtais našumo reikalavimais, MongoDB patirtis ir brandumas gali būti lemiami veiksniai.
Migracija iš MongoDB į FerretDB
Jei nusprendėte išbandyti FerretDB, greičiausiai jus domina, kaip perkelti egzistuojančius duomenis iš MongoDB. Procesas nėra sudėtingas, bet reikia kelių žingsnių.
Paprasčiausias būdas – naudoti mongodump ir mongorestore įrankius. Pirmiausia eksportuokite duomenis iš MongoDB:
mongodump --uri="mongodb://localhost:27017/mydb" --out=/backup
Tada importuokite į FerretDB:
mongorestore --uri="mongodb://localhost:27017/mydb" /backup/mydb
Tačiau prieš migruojant gamybinę sistemą, rekomenduoju:
1. Išbandyti testavimo aplinkoje. Sukurkite testavimo aplinką su FerretDB ir patikrinkite, ar visos jūsų aplikacijos funkcijos veikia tinkamai. Paleiskite automatinius testus, jei juos turite.
2. Patikrinti suderinamumą. Peržiūrėkite visas MongoDB funkcijas, kurias naudojate, ir įsitikinkite, kad FerretDB jas palaiko. Ypač atidžiai patikrinkite agregacijas, indeksus ir transakcijas.
3. Planuoti perjungimą. Jei negalite sau leisti ilgo prastovų laiko, apsvarstykite palaipsninę migraciją. Galite naudoti dual-write strategiją, kai rašote į abi duomenų bazes, arba naudoti replikaciją.
4. Stebėti našumą. Po migracijos atidžiai stebėkite sistemos našumą. Gali tekti optimizuoti užklausas ar pridėti papildomų indeksų.
Jei jūsų duomenų bazė labai didelė (kelių terabaitų), migracijos procesas gali užtrukti. Tokiu atveju apsvarstykite naudoti streaming replikaciją arba kitus metodus, kurie leidžia sumažinti prastovų laiką.
Ateities perspektyvos ir bendruomenė
FerretDB projektas auga sparčiai. Komanda aktyviai dirba prie naujų funkcijų pridėjimo ir klaidų taisymo. Kiekvieną mėnesį išleidžiama nauja versija su patobulinimais.
Viena įdomiausių krypčių – SQLite palaikymas. Tai leidžia naudoti FerretDB embedded aplikacijose, kur nereikia viso PostgreSQL serverio. Tai gali būti naudinga mobilioms aplikacijoms, IoT įrenginiams ar kitoms situacijoms, kur reikia lengvo sprendimo.
Bendruomenė taip pat aktyviai prisideda prie projekto. GitHub’e galite rasti diskusijas, feature request’us ir pull request’us. Jei susiduriate su problema ar turite idėją, komanda yra labai atvira ir reaguoja greitai.
Verslo perspektyvos taip pat atrodo geros. FerretDB Inc. – įmonė, kuri stovi už projekto – pritraukė investicijų ir planuoja teikti komercinį palaikymą įmonėms. Tai reiškia, kad projektas turi ilgalaikę viziją ir finansinį stabilumą.
Keli įdomūs faktai apie projektą:
- FerretDB kodas yra parašytas Go programavimo kalba
- Projektas turi daugiau nei 8000 žvaigždučių GitHub’e
- Palaikomas ne tik PostgreSQL, bet ir SAP HANA (eksperimentinis)
- Komanda planuoja pridėti dar daugiau backend’ų ateityje
Ar FerretDB jau pasiruošęs gamybai?
Tai klausimas už milijoną. Ar galite pasitikėti FerretDB su savo gamybiniais duomenimis? Atsakymas priklauso nuo jūsų situacijos.
Jei jūsų aplikacija naudoja pagrindines MongoDB funkcijas ir nėra kritiškai jautri milisekundžių našumo skirtumams, FerretDB jau dabar gali būti tinkamas pasirinkimas. Yra įmonių, kurios sėkmingai naudoja FerretDB gamyboje, ir jų skaičius auga.
Tačiau jei jūsų sistema yra labai sudėtinga, apdoroja milijonus užklausų per sekundę, arba naudoja daug specifinių MongoDB funkcijų, galbūt verta palaukti, kol FerretDB dar labiau subręs. Projektas vis dar yra aktyvios plėtros stadijoje, ir kai kurios funkcijos dar nėra pilnai realizuotos.
Mano rekomendacija: pradėkite nuo nedidelių projektų ar nekritinių sistemų. Tai leis jums susipažinti su FerretDB, suprasti jo stipriąsias ir silpnąsias puses, ir įgyti patirties. Jei viskas klostosi gerai, galite pamažu plėsti naudojimą.
Nepamirškite, kad FerretDB – tai ne tik techninis sprendimas, bet ir filosofinis pasirinkimas. Rinkdamiesi FerretDB, jūs palaikote atvirojo kodo judėjimą ir prisidedate prie bendruomenės. Tai gali būti svarbu ne tik jums, bet ir jūsų klientams bei partneriams.
Taip pat turėkite omenyje, kad technologijų pasaulis keičiasi greitai. Tai, kas šiandien yra eksperimentinis projektas, rytoj gali tapti industrijos standartu. MongoDB pats kadaise buvo jaunas projektas, į kurį daugelis žiūrėjo skeptiškai. Dabar tai viena populiariausių duomenų bazių pasaulyje. FerretDB gali pakartoti panašią sėkmės istoriją, ypač atsižvelgiant į augančią atvirojo kodo svarbą ir bendruomenės palaikymą.
