Përshëndetje, Habr!
Ju kujtojmë se kemi publikuar një libër tjetër jashtëzakonisht interesant dhe të dobishëm për modelet Kubernetes. E gjitha filloi nga "" Brendan Burns, dhe, megjithatë, puna në këtë segment për ne . Sot, ne ju ofrojmë të lexoni një artikull nga blogu MinIO, që përmbledh tendencat dhe specifikat e modeleve të ruajtjes së të dhënave në Kubernetes.
Kubernetes ka ndryshuar thelbĂ«sisht modelet tradicionale tĂ« zhvillimit dhe implementimit tĂ« aplikacioneve. Tani ekipi mund tĂ« marrĂ« vetĂ«m disa ditĂ« pĂ«r zhvillimin, testimin dhe implementimin e aplikacionit â nĂ« ambientet e ndryshme, dhe tĂ« gjitha kĂ«to brenda klasterĂ«ve Kubernetes. NjĂ« punĂ« me teknologjitĂ« e brezit tĂ« kaluar zakonisht merrte javĂ« tĂ« tĂ«ra, po jo muaj.
Ky përshpejtim është bërë i mundur falë abstraksionit që ofron Kubernetes - domethënë, falë faktit se Kubernetes vetë merr përsipër ndërveprimin me detajet e ulëta të makinave fizike ose virtuale, duke lejuar përdoruesit të shpallin ndër të tjera procesorin e duhur, sasinë e nevojshme të memories, dhe numrin e ekzemplarëve të kontejnerëve. Siç mbështetet Kubernetes nga një komunitet i madh, dhe si përdorimi i Kubernetes vazhdon të zgjerrohet, ai është me një diferencë të madhe lider mes të gjitha platformave të orkestrimit të kontejnerëve.
Me zgjerimin e përdorimit të Kubernetes, rritet gjithashtu konfuzioni rreth modeleve të ruajtjes së të dhënave që përdoren në të..
Me gjithë konkurrencën për një copë nga torta Kubernetes (atë që përfshin ruajtjen e të dhënave), kur diskutohet për ruajtjen e të dhënave, sinjali këtu humbet në një zhurmë të madhe.
Kubernetes përmbush modelin modern të zhvillimit dhe implementimit të aplikacioneve, si dhe menaxhimin e tyre. Ky model modern tërheq ruajtjen e të dhënave nga llogaritjet. Për të kuptuar plotësisht këtë shkëputje në kontekstin e Kubernetes, është gjithashtu e nevojshme të kuptohet se çfarë janë aplikacionet që punojnë me ruajtje të gjendjes dhe ato që punojnë pa ruajtje të gjendjes, si dhe si përshtatet ruajtja e të dhënave me këtë. Këtu, qasja e REST API, e përdorur nga S3, ka avantazhe të dukshme krahasuar me qasjen POSIX/CSI, karakteristike për zgjidhje të tjera.
Në këtë artikull, ne do të flasim për modelet e ruajtjes së të dhënave në Kubernetes dhe do të shqyrtojmë ndarë debatin rreth aplikacioneve që punojnë me gjendje dhe pa gjendje, për të kuptuar mirë se çfarë e ndan ato dhe pse kjo është e rëndësishme. Në vazhdim do të shqyrtojmë aplikacionet dhe modelet e ruajtjes së të dhënave që përdoren në to në dritën e praktikave më të mira të punës me kontejnerë dhe Kubernetes.
Kontejnerët pa gjendje
Kontejnerët për natyrën e tyre janë të lehtë dhe efemerë. Ata mund të ndalen, fshihen ose implementohen lehtësisht në një nod tjetër - për të gjitha këto nevojiten vetëm disa sekonda. Në një sistem të madh të orkestrimit të kontejnerëve, këto operacione ndodhin vazhdimisht, dhe përdoruesit madje nuk e ndiejnë këtë ndryshim. Megjithatë, lëvizjet janë të mundshme vetëm nëse konteineri nuk ka asnjë varësi nga nodeli ku ndodhet. Për këta kontejnerë, thuhet se ata punojnë pa gjendje.
Kontejnerët me gjendje
Nëse konteineri ruan të dhëna në pajisje të lidhura lokalisht (ose në një pajisje bllokuese), atëherë ruajtja e të dhënave ku ndodhet duhen lëvizur në një nod të ri së bashku me vetë konteinerin - në rast se ka një dështim. Kjo është e rëndësishme, pasi në të kundërt, aplikacioni që funksionon në konteiner nuk do të mund të funksionojë siç duhet, pasi i duhet të aksesojë të dhënat e ruajtura në pajisjet lokale. Për këta kontejnerë, thuhet se ata punojnë me gjendje.
Nga një pikëpamje të pastër teknike, kontejnerët me gjendje gjithashtu mund të lëvizin në nod të tjera. Zakonisht, kjo sigurohet përmes sistemeve të skedave të shpërndara ose ruajtesve të rrjetit të bllokut që janë të lidhura me të gjitha nodet ku funksionojnë kontejnerë. Kështu, kontejnerët kanë akses në volumin për ruajtjen e të dhënave të qëndrueshme, dhe informacioni ruhet në disqe që ndodhen në të gjithë rrjetin. Ky metod do ta quaj "afro-kontejner me gjendje", dhe në pjesën tjetër të artikullit do ta emërtoj kështu për qëllime të njëllojtësisë.

Në qasjen tipike të konteinerëve me gjendje, të gjitha podet e aplikacioneve lidhen me një sistem skedash të shpërndarë - kështu krijohet një lloj ruajtjeje të ndarë, ku ndodhen të gjithë të dhënat e aplikacioneve. Edhe pse janë të mundshme disa variacione, kjo është një qasje me nivel të lartë.
Së tanishme, le të kuptojmë pse qasja e kontejnerëve me ruajtje të qëndrueshme në botën e orientuar nga re është një antipatrone.
Projektimi i aplikacioneve të orientuara nga re
Tradicionalisht, aplikacionet kanë përdorur baza të dhënash për ruajtjen e strukturuar të informacionit dhe diske lokale ose sisteme të shpërndara të skedarëve ku derdhen të gjitha të dhënat e pa strukturuara ose madje edhe gjysmë të strukturuara. Ndërsa volumet e të dhënave të pa strukturuara rriteshin, zhvilluesit kuptuan se POSIX ishte tepër "flasës", përcaktonte kosto të konsiderueshme dhe, përfundimisht, pengonte funksionimin e aplikacionit kur kalonte në shkallë të vërtetë të madhe.
Kjo kryesisht çoi në shfaqjen e një standardi të ri për ruajtjen e të dhënave, pra, depozita të orientuara nga re që funksionojnë kryesisht në bazë të REST API dhe çlirojnë aplikacionin nga ngarkesa e mirëmbajtjes së ruajtjes lokale të të dhënave. Në këtë rast, aplikacioni në fakt kalon në një gjendje pune pa ruajtje të qëndrueshme (pasi gjendja ndodhet në një depo të largët). Aplikacionet moderne ndërtohen nga e para duke marrë parasysh këtë faktor. Si rregull, çdo aplikacion modern që përpunon të dhëna të çfarëdo lloji (log, metadata, blob dhe të tjera) është ndërtuar sipas paradigmës së orientuar nga re, ku gjendja është transferuar në një sistem të softuerit të dedikuar për ruajtjen e saj.
Qasja e kontejnerëve me ruajtje të qëndrueshme e shtyn të gjithë këtë paradigmë të rikthehet pikërisht aty ku nisi!
Kur përdoren ndërfaqet POSIX për ruajtjen e të dhënave, aplikacionet funksionojnë ashtu siç do të bënin nëse do të ruanin gjendjen, dhe për këtë arsye ato largohen nga parimet më të rëndësishme të projektimit të orientuar nga re, pra, nga mundësia për të ndryshuar dimensionet e flukseve të punës të aplikacionit në varësi të ngarkesës hyrëse, për të kaluar në një nyje të re, sapo nyja aktuale dështojë, dhe kështu me radhë.
Duke e shqyrtuar këtë situatë më me kujdes, zbuloni se kur zgjidhni një depo të dhënash, përsëri dhe përsëri ndodhemi përballë dilemës "POSIX kundër REST API", POR me një përkeqësim të shtuar të problemeve POSIX, të shkaktuara nga natyra e shpërndarë e ambienteve Kubernetes. Në veçanti,
- POSIX është flasës: semantika e POSIX kërkon të asociojë çdo operacion me metadatat dhe deskriptorët e skedarëve, të cilët ndihmojnë në ruajtjen e gjendjes së operacionit. Kjo çon në kosto të konsiderueshme, që nuk kanë asnjë vlerë reale. API për ruajtjen e objekteve, në veçanti, S3 API, e ka eliminuar këtë kërkesë, duke lejuar që aplikacioni të punojë dhe pastaj "të harrojë" thirrjen. Reagimi i sistemit të ruajtjes tregon nëse kjo veprim është kryer me sukses apo jo. Në rast dështimi, aplikacioni mund të provojë përsëri.
- Kufizimet e rrjetit: Në një sistem të shpërndarë supozohet se mund të ketë shumë aplikacione që përpiqen të shkruajnë të dhëna në një mbajtës të ngjitur. Pra, përveç faktit se aplikacionet do të konkurrojnë me njëra-tjetrën për bandë (për të dërguar të dhëna në mbajtës), vetë sistemi i ruajtjes do të jetë në garë për këtë bandë, duke shpërndarë të dhëna në diskët fizikë. Për shkak të flasësisë së POSIX, numri i thirrjeve në rrjet rritet disa herë. Nga ana tjetër, S3 API ofron një ndarje të qartë të thirrjeve të rrjetit mes atyre që vijnë nga klienti në server, dhe atyre që ndodhin brenda serverit.
- Siguria: Modeli i sigurisë së POSIX është i dizajnuar për përfshirjen aktive të njeriut: administratorët konfigurojnë nivelet specifike të aksesit për çdo përdorues apo grup. Kjo paradigmë është e vështirë për t'u adaptuar në botën e orientuar nga re. Aplikacionet moderne varen nga modelet e sigurisë që lidhen me API-të, ku të drejtat e aksesit përcaktohen si një grup politikash, krijohen llogari shërbimi, kredenciale të përkohshme etj.
- Menaxhimi: Kontejnerët me ruajtje të qëndrueshme sjellin disa kosto të lidhura me menaxhimin. Këtu flasim për sinkronizimin e aksesit paralel në të dhëna, për sigurimin e konsistencës së të dhënave, gjithçka kërkon të peshojmë me kujdes se cilat modele të aksesit të dhënash do të përdoren. Duhet të instalohen, kontrollohen dhe konfigurohen programe të tjera, pa përmendur përpjekjet e shtura që shpenzohen për zhvillim.
Ndërfaqja e kontejnerit për ruajtjen e të dhënave
Ndërsa ndërfaqja e ruajtjes së të dhënave të konteinerëve (CSI) ndihmoi shumë me shpërndarjen e nivelit të volumeve Kubernetes, duke e kaluar pjesërisht tek furnizuesit e jashtëm të ruajtjes së të dhënave, ajo gjithashtu për fat të keq ka ndihmuar në krijimin e bindjes se qasja e konteinerëve me ruajtje të qëndrueshme është metoda e rekomanduar për ruajtjen e të dhënave në Kubernetes.
CSI është zhvilluar si standard për ofrimin e sistemeve të ruajtjes së dhënave të bllokut dhe skedarit për aplikacionet e trashëguara gjatë punës me Kubernetes. Dhe, siç u tregua në këtë artikull, situata e vetme kur qasja e konteinerëve me ruajtje të qëndrueshme (dhe CSI në formën e saj aktuale) ka kuptim është kur aplikacioni vetë është një sistem trashëguar, në të cilin është e pamundur të shtohet mbështetje për API-në e ruajtjes objektore.
ĂshtĂ« e rĂ«ndĂ«sishme tĂ« kuptohet se duke pĂ«rdorur CSI nĂ« formĂ«n e saj aktuale, dmth, duke montuar volumin gjatĂ« punĂ«s me aplikacione moderne, do tĂ« pĂ«rballemi me probleme tĂ« ngjashme si ato qĂ« ndodhnin nĂ« sistemet ku ruajtja e tĂ« dhĂ«nave ishte organizuar nĂ« stilin POSIX.
Qasje më cilësore
Në këtë rast, është e rëndësishme të kuptohet se shumica e aplikacioneve në thelb nuk janë të dizajnuara posaçërisht për të punuar me ruajtje të qëndrueshme ose pa ruajtje të qëndrueshme. Kjo sjellje varet nga arkitektura e përgjithshme e sistemit dhe nga variantet specifike të zgjedhura gjatë dizajnimit. Le të flasim pak për aplikacionet që ruajnë gjendjen.
Në parim, të dhënat e aplikacioneve mund të ndahen në disa tipe të gjera:
- Të dhënat e regjistrave
- Të dhënat e etiketave të kohës
- Të dhënat e transaksioneve
- Metadatat
- Imazhet e konteinerëve
- Të dhënat e blobëve (objekteve binarë të mëdhenj)
Të gjitha këto tipe të dhënash mbështeten shumë mirë në platformat moderne të ruajtjes së të dhënave, dhe ekzistojnë disa platforma të fokusuar në re, të përshtatura për ofrimin e të dhënave në secilin nga këto formate specifike. Për shembull, të dhënat e transaksioneve dhe metadata mund të gjenden në një databazë moderne të orientuar nga reja, si CockroachDB, YugaByte, etj. Imazhet e konteinerëve ose të dhënat e blobëve mund të ruhen në një regjistër docker, të bazuar në MinIO. Të dhënat e etiketave të kohës mund të ruhen në një databazë të serive të kohës, për shembull, InfluxDB, etj. Nuk do të hyjmë këtu në detajet e çdo tipi të dhënash dhe aplikacioneve përkatëse, por ideja e përgjithshme është të shmangen ruajtja e qëndrueshme të të dhënave që bazohet në montimin lokal të disqeve.

Për më tepër, shpesh është efikase të ofrohet një nivel përkohësisht të ruajtjes, i cili shërben si një ruajtës për aplikacionet për skedarët e përkohshëm, por aplikacionet nuk duhet të varen nga ky nivel si burim i vërtetë.
Ruajtja për aplikacionet me gjendje
NdĂ«rsa nĂ« shumicĂ«n e rasteve Ă«shtĂ« e dobishme tĂ« mbahen aplikacionet pa gjendje, ato aplikacione qĂ« janĂ« tĂ« destinuara pĂ«r ruajtjen e tĂ« dhĂ«nave â si databazat, ruajtĂ«sit e objekteve, ruajtĂ«sit e çelĂ«save dhe vlerave â duhet tĂ« mbajnĂ« gjendjen. Le tĂ« shqyrtojmĂ« pse kĂ«to aplikacione implementohen nĂ« Kubernetes. Si njĂ« shembull, do tĂ« marrim MinIO, por parime tĂ« ngjashme janĂ« tĂ« aplikueshme nĂ« çdo sistem tĂ« madh tĂ« ruajtjes sĂ« tĂ« dhĂ«nave orientuar nga re.
Aplikacionet e orientuara nga re janë të dizajnuara për të shfrytëzuar në maksimum fleksibilitetin që ofrojnë konteinerët. Kjo do të thotë se ato nuk bëjnë asnjë supozim rreth mjedisit në të cilin do të implementohen. Për shembull, në MinIO përdoret një mekanizëm i brendshëm i kodimit të tepruar (erasure coding), i cili siguron që sistemi të mbetet funksional edhe në rastin e dështimit të gjysmë të disqeve. Gjithashtu, MinIO menaxhon integritetin dhe sigurinë e të dhënave duke përdorur hashing dhe enkriptim të vetin në anën e serverit.
Për këto aplikacione të orientuara nga re, ruajtësit lokalë të përhershëm (PV) janë më të përshtatshëm për ruajtje rezervë. PV të lokalizuar ofrojnë mundësinë e ruajtjes së të dhënave të papërpunuara, ndërsa aplikacionet që punojnë mbi këto PV mbledhin informacionin që u mundëson atyre të shkallëzojnë të dhënat dhe të menaxhojnë kërkesat në rritje për të dhëna.
Kjo qasje është shumë më e thjeshtë dhe shkallëzohet dukshëm më mirë në krahasim me PV të bazuar në CSI, të cilat sjellin nivele të tyre të menaxhimit të të dhënave dhe tepër, sepse këto nivele zakonisht konflitikojnë me aplikacionet e dizajnuara për ruajtjen e gjendjes.
Një lëvizje e sigurt drejt shkëputjes së të dhënave nga llogaritjet
Në këtë artikull, ne diskutuam se si aplikacionet riorganizohen për të punuar pa ruajtjen e gjendjes, ose, me fjalë të tjera, ruajtja e të dhënave ndarja nga llogaritë mbi to. Në përfundim, do të shqyrtojmë disa shembuj realë të këtij trendi.
, platforma e njohur për analizën e të dhënave, traditaërisht është përdorur me ruajtjen e gjendjes dhe me shpërndarjen në sistemin e skedarëve HDFS. Megjithatë, ndërsa Spark kalon në një botë të orientuar nga re, kjo platformë po përdoret gjithnjë e më shumë pa ruajtjen e gjendjes me përdorimin e `s3a`. Spark përdor s3a për të transferuar gjendjen në sisteme të tjera, ndërsa kontenierët e vetë Spark punojnë plotësisht pa ruajtjen e gjendjes. Aktorët e tjerë të mëdhenj të ndërmarrjeve në fushën e analizës së të dhënave të mëdha, veçanërisht, , , në po ashtu kalojnë në punën me ndarjen e ruajtjes së të dhënave dhe llogaritjeve mbi to.
Modele të tilla gjithashtu vërehen në platforma të tjera të mëdha analitike, përfshirë Presto, Tensorflow to R, Jupyter. Duke eksportuar gjendjen në sisteme të largëta të ruajtjes së të dhënave në re, bëhet shumë më e lehtë të menaxhoni aplikacionin tuaj dhe ta shkallëzoni atë. Për më tepër, kjo ndihmon në portabilitetin e aplikacionit në mjedise të ndryshme.
Burimi: habr.com
