Kas yra MinIO ir kodėl jis vis populiaresnis
Jei dirbate su duomenimis, greičiausiai esate girdėję apie Amazon S3. Tai tarsi auksinis standartas objektų saugykloms – patikimas, funkcionalus, bet… brangus. Ypač kai duomenų kiekiai auga kaip ant mielių. Čia į sceną įžygia MinIO – atvirojo kodo objektų saugykla, kuri ne tik suderinama su S3 API, bet ir gali būti diegiama bet kur: jūsų serveryje, privačiame debesyje ar net Raspberry Pi.
MinIO atsirado 2014 metais kaip atsakas į poreikį turėti greitą, lengvą ir paprastą objektų saugyklą, kurią galima valdyti patiems. Skirtingai nei tradicinės failų sistemos, objektų saugyklos skirtos nestruktūrizuotiems duomenims – nuotraukoms, vaizdo įrašams, atsarginėms kopijoms, log failams ir panašiai. Ir štai čia MinIO tikrai žiba.
Kas įdomiausia – MinIO nėra tik „pigesnė S3 versija”. Tai pilnavertė sistema su savo pranašumais. Pavyzdžiui, ji parašyta Go kalba, todėl yra neįtikėtinai greita ir efektyvi. Vienas binarinis failas – ir viskas veikia. Nereikia jokių sudėtingų priklausomybių ar konfigūracijų, kurios užtruktų pusę dienos.
Techninė architektūra ir veikimo principai
MinIO architektūra paremta keliais fundamentaliais principais. Pirma, tai objektų saugykla, o ne failų sistema. Skirtumas esminis – objektai saugomi plokščioje struktūroje su metaduomenimis, o ne hierarchinėje katalogų sistemoje. Kiekvienas objektas turi unikalų identifikatorių (raktą), versijos informaciją ir gali turėti neribotą kiekį metaduomenų.
Sistema naudoja erasure coding – duomenų apsaugos metodą, kuris yra efektyvesnis už tradicinę replikaciją. Paprastai tariant, jūsų duomenys padalijami į dalis ir paskleidžiami po kelis diskus ar serverius. Net jei dalis jų sugenda, duomenis galima atkurti. Tai kaip RAID, tik daug protingesnis ir lankstesnis.
MinIO gali veikti keliais režimais. Standalone režimas – tai vienas serveris su vienu ar keliais diskais, idealus testavimui ar mažiems projektams. Distributed režimas – tai kelių serverių klasteris, kuris užtikrina aukštą prieinamumą ir našumą. Galite pradėti nuo vieno serverio ir vėliau išplėsti į klasterį be prastovų.
Vienas iš įspūdingiausių dalykų – MinIO našumas. Jie skelbia skaičius, kurie pasiekia 325 GiB/s skaitymo greitį su atitinkama aparatine įranga. Žinoma, jūsų namų serveryje tokių rezultatų nepamatysite, bet net su paprastais SSD diskais našumas būna įspūdingas. Sistema automatiškai optimizuoja duomenų išdėstymą ir naudoja agresyvų kaupimą atmintyje.
S3 suderinamumas – ne tik marketingas
Kai sakoma, kad MinIO yra „S3 suderinamas”, tai ne tuščias žodis. Tai reiškia, kad beveik bet kokia programa ar biblioteka, kuri veikia su Amazon S3, veiks ir su MinIO. Naudojate AWS SDK Python, JavaScript, Java ar kitai kalbai? Tiesiog pakeiskite endpoint URL į savo MinIO serverio adresą – ir viskas veikia.
Praktiškai tai atrodo taip: vietoj s3.amazonaws.com nurodote minio.jusu-domenas.lt, įvedate access key ir secret key, ir viskas. Jūsų aplikacija net nepastebi skirtumo. Tai neįtikėtinai patogu, kai norite testuoti S3 funkcionalumą lokalioje aplinkoje arba perkelti duomenis iš AWS į savo infrastruktūrą.
MinIO palaiko didžiąją dalį S3 API funkcijų: bucket operacijas, objektų įkėlimą/atsisiuntimą, multipart uploads (didelių failų įkėlimą dalimis), versioning, lifecycle policies, event notifications ir t.t. Yra keletas smulkių skirtumų – kai kurios egzotiškos S3 funkcijos gali neveikti arba veikti šiek tiek kitaip, bet 99% atvejų tai neturi jokios reikšmės.
Įdomus dalykas – MinIO kartais būna net greitesnis už S3 tam tikrose operacijose, ypač kai duomenys yra geografiškai arti jūsų. Jokių tarpinių tinklų, jokių AWS regionų – tiesiog jūsų serveris jūsų duomenų centre.
Diegimas ir konfigūracija realybėje
Diegti MinIO yra stebėtinai paprasta. Linux sistemoje galite tiesiog atsisiųsti vieną binarinį failą ir paleisti. Pavyzdžiui:
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /mnt/data
Ir viskas – MinIO veikia. Žinoma, tai tik prasidėjimas. Produkcinei aplinkai reikia šiek tiek daugiau darbo.
Pirma, reikia pagalvoti apie diskus. MinIO rekomenduoja naudoti XFS failų sistemą – ji veikia geriau nei ext4 su dideliais failais. Jei planuojate distributed režimą, turėtumėte turėti bent 4 diskus ar serverius. Kodėl keturis? Tai minimalus skaičius, kad erasure coding veiktų efektyviai.
Konfigūracija vyksta per aplinkos kintamuosius arba konfigūracijos failą. Pagrindiniai dalykai, kuriuos reikia nustatyti: root user vardas ir slaptažodis (MINIO_ROOT_USER ir MINIO_ROOT_PASSWORD), regionas, jei reikia, ir SSL sertifikatai saugiam ryšiui.
SSL/TLS konfigūracija yra paprasta – tiesiog įdėkite cert.crt ir private.key failus į ~/.minio/certs/ katalogą, ir MinIO automatiškai pradės naudoti HTTPS. Galite naudoti Let’s Encrypt sertifikatus – veikia puikiai.
Jei planuojate klasterį, komanda atrodo maždaug taip:
./minio server http://server{1...4}/mnt/disk{1...4}
Ši komanda sukuria klasterį iš 4 serverių, kiekviename po 4 diskus. MinIO automatiškai paskirsto duomenis po visus šiuos diskus naudodamas erasure coding.
Web konsolė ir administravimo įrankiai
MinIO turi puikią web konsolę, kuri prieinama per naršyklę. Ji ne tik graži, bet ir funkcionali. Galite naršyti bucket’us, įkelti ir atsisiųsti failus, valdyti prieigos teises, stebėti sistemos būseną ir našumą.
Konsolėje matote realaus laiko metrikas: kiek užimta vietos, kiek objektų saugoma, tinklo srautai, API užklausų statistika. Tai neįkainojama, kai reikia suprasti, kaip sistema veikia ir kur gali būti problemų.
Prieigos valdymas vyksta per IAM (Identity and Access Management) sistemą, kuri labai panaši į AWS IAM. Galite kurti vartotojus, grupes, politikas (policies). Politikos rašomos JSON formatu ir leidžia labai smulkiai kontroliuoti, kas gali ką daryti. Pavyzdžiui, galite leisti vienam vartotojui tik skaityti tam tikrą bucket’ą, o kitam – ir rašyti.
Yra ir komandinės eilutės įrankis – mc (MinIO Client). Tai kaip ls, cp, rm komandos, bet objektų saugykloms. Galite kopijuoti failus tarp lokalios sistemos ir MinIO, tarp dviejų MinIO serverių ar net tarp MinIO ir AWS S3. Labai patogus automatizavimui ir skriptams.
mc alias set myminio http://localhost:9000 minioadmin minioadmin
mc mb myminio/mybucket
mc cp myfile.txt myminio/mybucket/
Paprasta ir intuityvu.
Praktiniai panaudojimo scenarijai
Kur gi realiai naudojamas MinIO? Scenarijai labai įvairūs. Vienas populiariausių – atsarginių kopijų saugykla. Vietoj to, kad mokėtumėte AWS už terabaitus duomenų, galite laikyti viską savo serveriuose. Programos kaip Veeam, Restic, Duplicati puikiai veikia su MinIO.
Kitas dažnas atvejis – media failų saugykla web aplikacijoms. Turite portalą su vartotojų įkeltomis nuotraukomis? MinIO puikiai tinka. Galite net sukonfigūruoti CDN prieš MinIO, kad failai būtų atiduodami dar greičiau. MinIO palaiko presigned URLs – laikinus URL, kurie leidžia atsisiųsti failą be autentifikacijos, bet tik ribotą laiką.
Didelės organizacijos naudoja MinIO kaip data lake platformą. Visi nestruktūrizuoti duomenys – log failai, sensorių duomenys, vaizdo įrašai – keliauja į MinIO. Vėliau jie analizuojami su Apache Spark, Presto ar kitais big data įrankiais. MinIO puikiai integruojasi su Kubernetes, todėl lengva diegti konteinerizuotose aplinkose.
Kūrėjai naudoja MinIO kaip lokalią S3 aplinką. Vietoj to, kad kiekvieną kartą testuotumėte su tikru AWS S3 (ir mokėtumėte už kiekvieną užklausą), galite paleisti MinIO Docker konteineryje ir dirbti lokalioje mašinoje. Tai pagreitina kūrimą ir sumažina kaštus.
Machine learning projektams MinIO taip pat puikiai tinka. Treniravimo duomenų rinkiniai dažnai būna dideli – šimtai gigabaitų ar net terabaitai. MinIO gali saugoti šiuos duomenis ir greitai juos atiduoti treniravimo procesui. Integruojasi su TensorFlow, PyTorch ir kitomis bibliotekomis.
Saugumas ir duomenų apsauga
Saugumas – ne tik slaptažodžiai. MinIO turi kelias apsaugos lygmenis. Pirma, duomenys perduodami per HTTPS (jei sukonfigūruota). Antra, duomenys gali būti šifruojami saugykloje (encryption at rest). MinIO palaiko serverio pusės šifravimą su KMS (Key Management Service) integracija.
Galite naudoti AWS KMS, HashiCorp Vault ar MinIO pačios KES (Key Encryption Service). Tai reiškia, kad net jei kas nors pavogs jūsų diskus, duomenų neperskaitys be šifravimo raktų.
Prieigos kontrolė, kaip minėjau, vyksta per IAM politikas. Bet yra ir bucket policies – taisyklės, kurios taikomos visam bucket’ui. Pavyzdžiui, galite padaryti bucket’ą viešą (public) skaitymo operacijoms, bet ne rašymo. Arba leisti prieigą tik iš tam tikrų IP adresų.
MinIO palaiko versioning – kiekvieno objekto versijų saugojimą. Jei kas nors per klaidą ištrina ar perrašo failą, galite atkurti ankstesnę versiją. Tai gelbsti ne tik nuo klaidų, bet ir nuo ransomware atakų.
Object locking – funkcija, kuri neleidžia ištrinti ar modifikuoti objektų tam tikrą laiką. Tai svarbu reguliuojamuose sektoriuose, kur duomenys turi būti saugomi nemodifikuoti tam tikrą periodą (compliance).
Audit logging – visi veiksmai gali būti registruojami. Kas, kada, ką darė su kokiu objektu. Šie logai gali būti siunčiami į išorinę sistemą analizei.
Našumo optimizavimas ir skalė
MinIO našumas priklauso nuo kelių faktorių: aparatinės įrangos, tinklo, konfigūracijos. Jei norite maksimalaus našumo, štai keletas patarimų.
Diskai – naudokite NVMe SSD, jei įmanoma. Jie nepalyginamai greitesni už tradicines HDD. Jei naudojate HDD, turėkite jų daug – MinIO gali paralelizuoti operacijas per kelis diskus. Neverta naudoti RAID – MinIO pats pasirūpina duomenų apsauga per erasure coding.
Tinklas – 10 Gbps ar greitesnis. Distributed režime tinklas tampa kritiškas. Jei tinklas lėtas, visas klasteris bus lėtas. Naudokite dedikuotą tinklą duomenų perdavimui tarp MinIO serverių.
Atminties kiekis – daugiau yra geriau. MinIO naudoja atmintį kaupimui (caching) ir metaduomenų saugojimui. Rekomenduojama bent 32 GB RAM produkcinei sistemai.
Konfigūracijos optimizavimas – galite reguliuoti tokius parametrus kaip MINIO_API_REQUESTS_MAX (maksimalus lygiagrečių užklausų skaičius) ar MINIO_CACHE_DRIVES (diskų kaupimui). Bet paprastai default nustatymai veikia gerai.
Skalė – MinIO gali skaluotis horizontaliai. Galite pridėti daugiau serverių į klasterį (nors tai reikalauja planavimo – negalite tiesiog pridėti vieno serverio, reikia pridėti pilną „server pool”). Vienas MinIO klasteris gali turėti šimtus serverių ir petabaitus duomenų.
Yra ir federation funkcija – galite sujungti kelis nepriklausomus MinIO klasterius į vieną vardų erdvę. Tai leidžia turėti geografiškai paskirstytą saugyklą.
Kaštai, licencijos ir palaikymas
MinIO yra atvirojo kodo projektas su Apache License 2.0 (nuo 2021 metų – GNU AGPL v3). Tai reiškia, kad galite jį naudoti nemokamai, net komercinėse sistemose. Nereikia mokėti už licencijas pagal duomenų kiekį ar užklausų skaičių, kaip su AWS S3.
Bet yra niuansas – jei modifikuojate MinIO kodą ir naudojate jį kaip paslaugą (SaaS), turite paviešinti savo pakeitimus (dėl AGPL licencijos). Jei tiesiog naudojate MinIO kaip yra, jokių problemų.
MinIO įmonė siūlo komercinį palaikymą ir papildomas funkcijas per MinIO Enterprise. Tai apima 24/7 palaikymą, papildomas saugumo funkcijas, geresnes stebėjimo galimybes. Jei esate didelė organizacija, tai gali būti verta investicijos.
Kaštų palyginimas su S3 priklauso nuo jūsų situacijos. Jei jau turite serverius ir infrastruktūrą, MinIO gali būti žymiai pigesnis. Bet reikia įskaičiuoti aparatinės įrangos, elektros, administravimo kaštus. Mažiems projektams AWS S3 free tier gali būti pigesnis variantas. Bet kai duomenų kiekiai auga iki terabaitų ir daugiau, MinIO ekonomija tampa akivaizdi.
Bendruomenė aplink MinIO yra aktyvi. GitHub’e rasite daug pavyzdžių, dokumentacija yra išsami, forume žmonės padeda. Jei kyla problemų, greičiausiai kas nors jau yra susidūręs su panašia situacija.
Kai MinIO yra tinkamas pasirinkimas (ir kai ne)
MinIO nėra universalus sprendimas visoms problemoms. Jis puikiai tinka, kai:
– Turite daug nestruktūrizuotų duomenų (media failai, atsarginės kopijos, logai)
– Norite kontroliuoti savo infrastruktūrą ir duomenis
– Reikia S3 suderinamumo, bet nenorite būti pririšti prie AWS
– Duomenų kiekiai dideli ir S3 kaštai tampa skausmingi
– Reikia didelės spartos ir žemo latency (duomenys geografiškai arti)
– Dirbate su Kubernetes ir konteinerizuotomis aplikacijomis
Bet MinIO gali būti ne geriausias pasirinkimas, kai:
– Turite labai mažai duomenų (keletas gigabaitų) – S3 free tier bus paprastesnis
– Neturite resursų administruoti infrastruktūrą
– Reikia labai specifinių AWS paslaugų, kurios glaudžiai integruotos su S3
– Jūsų komanda neturi patirties su objektų saugyklomis ar Linux administravimu
Realybė tokia, kad daugelis organizacijų naudoja hibridinį modelį – dalį duomenų laiko S3, dalį MinIO. Pavyzdžiui, „šaltus” duomenis (retai naudojamus) MinIO, o „karštuosius” S3 su CloudFront CDN. Arba produkciją AWS, o development/testing aplinkas MinIO.
Svarbu suprasti, kad MinIO – tai ne tik „pigesnė S3 alternatyva”. Tai pilnavertė objektų saugyklos platforma su savo privalumais. Greitis, lankstumas, kontrolė – tai dalykai, kuriuos gauname kartu su atsakomybe už infrastruktūros valdymą. Jei jūsų komanda yra pasiruošusi tam, MinIO gali būti puikus pasirinkimas, kuris sutaupys pinigų ir suteiks daugiau galimybių. Jei ne – AWS S3 vis dar yra saugus ir patikimas variantas, nors ir brangesnis.
