Sistemi i qasjes së skedarëve në distancë në kafaz

Qëllimi i sistemit

Mbështetje për qasje në distancë në skedarë në kompjuterë në rrjet. Sistemi "virtualisht" mbështet të gjitha operacionet bazë të skedarëve (krijimi, fshirja, leximi, shkrimi, etj.) duke shkëmbyer transaksione (mesazhe) duke përdorur protokollin TCP.

aplikimet

Funksionaliteti i sistemit është efektiv në rastet e mëposhtme:

  • në aplikacionet vendase për pajisjet celulare dhe të integruara (telefonat inteligjentë, sistemet e kontrollit në bord, etj.) që kërkojnë qasje të shpejtë në skedarët në serverët e largët përballë ndërprerjeve të mundshme të përkohshme në komunikim (me daljen jashtë linje);
  • në DBMS-të e ngarkuara, nëse përpunimi i pyetjeve kryhet në disa serverë dhe ruajtja e të dhënave kryhet në të tjerët;
  • në rrjetet e korporatave të shpërndara për mbledhjen dhe përpunimin e informacionit, që kërkojnë shkëmbim të dhënash me shpejtësi të lartë, tepricë dhe besueshmëri;
  • në sisteme komplekse me arkitekturë mikroservice, ku vonesat në shkëmbimin e informacionit ndërmjet moduleve janë kritike.

Strukturë

Sistemi Cage (ekziston një zbatim - version beta në Python 3.7 në Windows) përfshin dy pjesë kryesore:

  1. Serveri i kafazit — një program server skedarësh (një paketë funksionesh) që funksionon në kompjuterë në rrjet, skedarët e të cilëve kërkojnë qasje në distancë;
  2. klasë Kafaz me një bibliotekë metodash për softuerin e klientit, duke thjeshtuar kodimin e ndërveprimit me serverët.

Përdorimi i sistemit në anën e klientit

Metodat e klasës Cage zëvendësojnë operacionet e zakonshme, "rutinë" të sistemit të skedarëve: krijimi, hapja, mbyllja, fshirja dosjet, si dhe leximi/shkrimi i të dhënave në format binar (duke treguar pozicionin dhe madhësinë e të dhënave). Konceptualisht, këto metoda janë afër funksioneve të skedarëve të gjuhës C, ku hapja/mbyllja e skedarëve kryhet “në kanale” hyrje/dalje.

Me fjalë të tjera, programuesi nuk punon me metodat e objekteve "skedar" (klasa _io në Python), por me metoda të klasës Cage.

Kur krijohet një shembull i një objekti Cage, ai vendos një lidhje fillestare me një server (ose disa serverë), autorizohet nga ID-ja e klientit dhe merr konfirmimin me një numër porti të dedikuar për të gjitha operacionet e skedarit. Kur një objekt Cage fshihet, ai udhëzon serverin të ndalojë komunikimin dhe të mbyllë skedarët. Ndërprerja e komunikimit mund të inicohet edhe nga vetë serverët.

Sistemi përmirëson performancën e leximit/shkrimit duke buferuar fragmente skedarësh të përdorur shpesh të programeve të klientit në cache RAM (buffer).
Softueri i klientit mund të përdorë çdo numër objektesh Cage me cilësime të ndryshme (madhësia e kujtesës së tamponit, madhësia e bllokut kur shkëmbehet me serverin, etj.).

Një objekt i vetëm Cage mund të komunikojë me shumë skedarë në shumë serverë. Parametrat e komunikimit (adresa IP ose serveri DNS, porti kryesor për autorizim, shtegu dhe emri i skedarit) specifikohen gjatë krijimit të objektit.

Meqenëse çdo objekt Cage mund të punojë me shumë skedarë në të njëjtën kohë, hapësira e përbashkët e memories përdoret për buffering. Madhësia e cache - numri i faqeve dhe madhësia e tyre, vendoset në mënyrë dinamike kur krijoni një objekt Cage. Për shembull, një cache 1 GB është 1000 faqe nga 1 MB secila, ose 10 mijë faqe nga 100 KB secila, ose 1 milion faqe nga 1 KB secila. Përzgjedhja e madhësisë dhe numrit të faqeve është një detyrë specifike për çdo rast aplikimi.

Mund të përdorni disa objekte Cage në të njëjtën kohë për të përcaktuar cilësime të ndryshme të memories buffer në varësi të mënyrës se si aksesohet informacioni në skedarë të ndryshëm. Si bazë, përdoret algoritmi më i thjeshtë i buferimit: pasi të shterohet një sasi e caktuar memorie, faqet e reja zhvendosin ato të vjetrat sipas parimit të daljes në pension me një numër minimal aksesesh. Buferimi është veçanërisht efektiv në rastin e aksesit të pabarabartë (në kuptimin statistikor) të përbashkët, së pari, në skedarë të ndryshëm dhe, së dyti, në fragmente të secilit skedar.

Klasa Cage mbështet I/O jo vetëm nga adresat e të dhënave (duke treguar pozicionin dhe gjatësinë e grupit, duke "zëvendësuar" operacionet e sistemit të skedarëve), por edhe në një nivel më të ulët, "fizik" - nga numrat e faqeve në kujtesën e tamponit.

Funksioni origjinal mbështetet për objektet Cage "letargji" ("gjumë") - ato mund të "kolapsohen" (për shembull, në rast të një humbjeje të lidhjes me serverët, ose kur aplikacioni ndalet, etj.) në një skedar lokal depozitimi në anën e klientit dhe të rikthehen shpejt nga këtë skedar (pas rifillimit të komunikimit, kur rinisni aplikacionin). Kjo bën të mundur reduktimin e ndjeshëm të trafikut kur aktivizoni programin e klientit pasi kaloni përkohësisht "offline", pasi fragmentet e skedarëve të përdorur shpesh do të jenë tashmë në cache.

Kafazi është rreth 3600 rreshta kodi.

Parimet e ndërtimit të serverit

Serverët e skedarëve Cageserver mund të ekzekutohen me një numër arbitrar portesh, njëra prej të cilave ("kryesore") përdoret vetëm për autorizimin e të gjithë klientëve, pjesa tjetër përdoret për shkëmbimin e të dhënave. Programi i serverit Cage kërkon vetëm Python. Paralelisht, kompjuteri me serverin e skedarëve mund të kryejë çdo punë tjetër.

Serveri fillon fillimisht si një koleksion i dy proceseve kryesore:

  1. "Lidhjet" – një proces për kryerjen e operacioneve të vendosjes së komunikimit me klientët dhe përfundimit të tij me iniciativën e serverit;
  2. "Operacionet" – një proces për kryerjen e detyrave (operacioneve) të klientëve për të punuar me skedarë, si dhe për mbylljen e seancave të komunikimit bazuar në komandat e klientit.

Të dy proceset nuk janë të sinkronizuara dhe organizohen si unaza të pafundme të marrjes dhe dërgimit të mesazheve bazuar në radhët e shumëproceseve, objektet proxy, bravat dhe bazat.
Procesi i lidhjes cakton një port për çdo klient për të marrë dhe transmetuar të dhëna. Numri i porteve caktohet kur serveri fillon. Hartëzimi ndërmjet porteve dhe klientëve ruhet në memorien proxy të përbashkët të ndërprocesit.

Procesi i operacioneve mbështet ndarjen e burimeve të skedarëve në mënyrë që klientë të ndryshëm të mund të ndajnë (thuajse paralele, meqenëse qasja kontrollohet nga bravat) lexoni të dhënat nga një skedar nëse kjo lejohej kur u hap fillimisht nga klienti "i parë".

Përpunimi i komandave për krijimin / fshirjen / hapjen / mbylljen e skedarëve në server kryhet në vetë procesin "Operacionet" në mënyrë rigoroze duke përdorur nënsistemin e skedarëve të serverit OS.

Për të përshpejtuar përgjithësisht leximin/shkrimin, këto operacione kryhen në fije të krijuara nga procesi "Operacione". Numri i temave është zakonisht i barabartë me numrin e skedarëve të hapur. Detyrat e leximit/shkrimit nga klientët dorëzohen në radhën e përgjithshme dhe filli i parë i lirë e merr detyrën nga koka e tij. Logjika speciale ju lejon të eliminoni operacionet e rishkrimit të të dhënave në RAM-in e serverit.

Procesi i Operacioneve monitoron aktivitetin e klientit dhe ndalon shërbimin e tyre ose me urdhërat e tyre ose kur tejkalohet koha e mosveprimit.

Për të siguruar besueshmërinë, Cageserver mban regjistrat e të gjitha transaksioneve. Një regjistër i përgjithshëm përmban kopje të mesazheve nga klientët me detyra për të krijuar/hapur/riemërtuar/fshirë skedarët. Për çdo skedar pune krijohet një regjistër i veçantë, në të cilin regjistrohen kopje të mesazheve me detyra për leximin dhe shkrimin e të dhënave në këtë skedar pune, si dhe grupe të dhënash të shkruara (të reja) dhe grupe të dhënash që u shkatërruan gjatë mbishkrimit (shkrimi të dhëna të reja "mbi" të vjetra). ).

Këto regjistra ofrojnë aftësinë për të rivendosur ndryshimet e reja në kopje rezervë dhe për të rikthyer përmbajtjen aktuale në një pikë në të kaluarën.

Cageserver është rreth 3100 rreshta kodi.

Sistemi i qasjes së skedarëve në distancë në kafaz

Nisja e programit të serverit të skedarëve Cageserver

Kur filloni, duhet të përcaktoni në dialog:
— porti kryesor për autorizim;
— numri i porteve për shkëmbimin e transaksioneve me klientët e autorizuar (nga 1 ose më shumë, grupi i numrave fillon nga ai pranë numrit të portit kryesor).

Përdorimi i klasës së kafazit

klasë kafazKafaz( cage_name="", pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file="" )

Nga kjo klasë krijohen objekte që ndërveprojnë me serverët e skedarëve dhe përmbajnë memorie buferike.

Parameters

  • emri i kafazit(str) - emri i kushtëzuar i objektit, i cili përdoret për të identifikuar klientët në anën e serverit
  • madhësia e faqeve(int) — madhësia e një faqeje të memories buferike (në bajt)
  • numpages(int) — numri i faqeve të memories bufer
  • maxstrlen(int) - gjatësia maksimale e një vargu bajt në operacionet e shkrimit dhe leximit
  • server_ip(diktoj) - një fjalor me adresat e serverëve të përdorur, ku çelësi është emri i kushtëzuar i serverit (id-i i serverit brenda aplikacionit), dhe vlera është një varg me adresën: "ip address:port" ose "DNS: port” (krahasimi i emrave dhe adresave reale është i përkohshëm, mund të ndryshohet)
  • pres(int) — koha e pritjes për një përgjigje nga serveri kur merr portet (në sekonda)
  • i zgjuar(Boolean) - flamuri se si është krijuar objekti (I rremë - nëse krijohet një objekt i ri, I vërtetë - nëse një objekt është krijuar nga një "i shembur" më parë - duke përdorur operacionin "hibernation", False si parazgjedhje)
  • cache_file(str) - emri i skedarit për letargji

metodat

Kafaz.skedari_krijoj( server, rrugë ) – krijoni një skedar të ri

Kafaz.riemërtimi i skedarit( serveri, rruga, emri_i ri ) – riemërtoni skedarin

Kafaz.file_remove( server, rrugë) - fshini një skedar

Kafaz.hapur( server, shteg, mod ) - skedari i hapur

Kthehet fkanali numri i kanalit. Parametri mod - kjo është mënyra e hapjes së skedarit: "wm" - ekskluzive (lexo/shkruaj), "rs" - vetëm për lexim dhe ndahet vetëm për lexim nga klientët e tjerë, "ws" - lexim/shkruaj dhe ndahet vetëm për lexim- vetëm nga klientët e tjerë.

Kafaz.Mbyll (fkanali) – mbyllni skedarin

Kafaz.shkruaj (fchannel, start, data ) – shkruani një varg bajt në një skedar

Kafaz.lexoj (fchannel, start, len_data ) – lexoni një varg bajt nga një skedar

Kafaz.put_faqet ( fkanali ) – “shtyn” nga buferi në server të gjitha faqet e kanalit të specifikuar që janë modifikuar. Përdoret në ato pika të algoritmit kur duhet të siguroheni që të gjitha operacionet në kanal ruhen fizikisht në një skedar në server.

Kafaz.push_të gjitha () – “shtyn” nga buferi në server të gjitha faqet e të gjitha kanaleve për një shembull të klasës Cage që janë modifikuar. Përdoret kur duhet të siguroheni që të gjitha operacionet në të gjitha kanalet janë ruajtur në server.

Burimi: www.habr.com

Shto një koment