Sistem de acces la fișiere de la distanță Cage

Scopul sistemului

Suport pentru accesul de la distanță la fișierele de pe computerele din rețea. Sistemul acceptă „virtual” toate operațiunile de bază ale fișierelor (creare, ștergere, citire, scriere etc.) prin schimbul de tranzacții (mesaje) folosind protocolul TCP.

aplicații

Funcționalitatea sistemului este eficientă în următoarele cazuri:

  • în aplicații native pentru dispozitive mobile și încorporate (smartphone-uri, sisteme de control la bord etc.) care necesită acces rapid la fișierele de pe servere la distanță în fața unor posibile întreruperi temporare în comunicare (cu deconectarea);
  • în SGBD-urile încărcate, dacă procesarea interogărilor se realizează pe unele servere, iar stocarea datelor se realizează pe altele;
  • în rețele corporative distribuite pentru colectarea și procesarea informațiilor, care necesită schimb de date de mare viteză, redundanță și fiabilitate;
  • în sisteme complexe cu arhitectură de microservicii, unde întârzierile în schimbul de informații între module sunt critice.

Structura

Sistemul Cage (există o implementare - versiune beta în Python 3.7 pe Windows) include două părți principale:

  1. Cageserver — un program server de fișiere (un pachet de funcții) care rulează pe computere din rețea ale căror fișiere necesită acces de la distanță;
  2. clasă Cușcă cu o bibliotecă de metode pentru software-ul client, simplificând codificarea interacțiunii cu serverele.

Utilizarea sistemului din partea clientului

Metodele clasei Cage înlocuiesc operațiunile obișnuite ale sistemului de fișiere „de rutină”: creare, deschidere, închidere, ștergere fișiere, precum și citirea/scrierea datelor în format binar (indicând poziția și dimensiunea datelor). Conceptual, aceste metode sunt apropiate de funcțiile de fișiere ale limbajului C, unde deschiderea/închiderea fișierelor se realizează „pe canale” de intrare/ieșire.

Cu alte cuvinte, programatorul nu lucrează cu metode de obiecte „fișier” (clasa _io în Python), dar cu metode din clasa Cage.

Când este creată o instanță a unui obiect Cage, acesta stabilește o conexiune inițială cu un server (sau mai multe servere), este autorizat de către ID-ul clientului și primește confirmarea cu un număr de port dedicat pentru toate operațiunile cu fișierul. Când un obiect Cage este șters, acesta indică serverului să nu mai comunice și să închidă fișierele. Încetarea comunicării poate fi inițiată și de serverele înșiși.

Sistemul îmbunătățește performanța de citire/scriere prin salvarea fragmentelor de fișiere utilizate frecvent ale programelor client în memoria cache RAM (buffer).
Software-ul client poate folosi orice număr de obiecte Cage cu setări diferite (dimensiunea memoriei tampon, dimensiunea blocului la schimbul cu serverul etc.).

Un singur obiect Cage poate comunica cu mai multe fișiere de pe mai multe servere. Parametrii de comunicare (adresa IP sau server DNS, portul principal pentru autorizare, calea și numele fișierului) sunt specificați la crearea obiectului.

Deoarece fiecare obiect Cage poate funcționa cu mai multe fișiere în același timp, spațiul de memorie partajat este utilizat pentru stocare în tampon. Dimensiunea cache – numărul de pagini și dimensiunea acestora sunt setate dinamic la crearea unui obiect Cage. De exemplu, un cache de 1 GB înseamnă 1000 de pagini de 1 MB fiecare sau 10 mii de pagini de 100 KB fiecare sau 1 milion de pagini de 1 KB fiecare. Selectarea dimensiunii și numărului de pagini este o sarcină specifică pentru fiecare caz de aplicație.

Puteți utiliza mai multe obiecte Cage în același timp pentru a defini diferite setări de memorie tampon, în funcție de modul în care sunt accesate informațiile din diferite fișiere. Ca unul de bază, se folosește cel mai simplu algoritm de buffering: după ce o anumită cantitate de memorie este epuizată, paginile noi le înlocuiesc pe cele vechi conform principiului retragerii cu un număr minim de accesări. Buffering-ul este mai ales eficient în cazul accesului partajat inegal (în sens statistic), în primul rând, la diferite fișiere și, în al doilea rând, la fragmente din fiecare fișier.

Clasa Cage acceptă I/O nu numai prin adresele de date (indicând poziția și lungimea matricei, „înlocuirea” operațiunilor sistemului de fișiere), ci și la un nivel inferior, „fizic” - prin numerele de pagină din memoria tampon.

Funcția originală este acceptată pentru obiectele Cage "hibernare" („sleep”) - pot fi „restrânse” (de exemplu, în cazul unei pierderi a conexiunii cu serverele sau atunci când aplicația este oprită etc.) într-un fișier de descărcare local pe partea client și restaurate rapid din acest fișier (după reluarea comunicării, când reporniți aplicația). Acest lucru face posibilă reducerea semnificativă a traficului la activarea programului client după ce ați trecut temporar „offline”, deoarece fragmentele de fișiere utilizate frecvent vor fi deja în cache.

Cage are aproximativ 3600 de linii de cod.

Principii de construcție a serverelor

Serverele de fișiere Cageserver pot fi rulate cu un număr arbitrar de porturi, dintre care unul („principal”) este folosit doar pentru autorizarea tuturor clienților, restul fiind folosit pentru schimbul de date. Programul server Cage necesită doar Python. În paralel, computerul cu serverul de fișiere poate efectua orice altă activitate.

Serverul începe inițial ca o colecție de două procese principale:

  1. "Conexiuni" – un proces de efectuare a operațiunilor de stabilire a comunicării cu clienții și de terminare a acesteia la inițiativa serverului;
  2. „Operațiuni” – un proces pentru realizarea sarcinilor (operațiilor) clienților pentru a lucra cu fișiere, precum și pentru închiderea sesiunilor de comunicare pe baza comenzilor clientului.

Ambele procese nu sunt sincronizate și sunt organizate ca bucle nesfârșite de primire și trimitere de mesaje bazate pe cozi multiproces, obiecte proxy, lacăte și socket-uri.
Procesul de conectare alocă un port pentru fiecare client pentru a primi și transmite date. Numărul de porturi este setat la pornirea serverului. Maparea dintre porturi și clienți este stocată în memoria proxy partajată între procese.

Procesul Operațiuni acceptă partajarea resurselor fișierelor, astfel încât mai mulți clienți diferiți să poată partaja (cvasi-paralel, deoarece accesul este controlat de blocări) citesc datele dintr-un fișier dacă acest lucru a fost permis când a fost deschis inițial de către „primul” client.

Prelucrarea comenzilor pentru crearea/ștergerea/deschiderea/închiderea fișierelor de pe server se realizează în procesul „Operațiuni” propriu-zis, strict secvenţial, folosind subsistemul de fișiere al sistemului de operare al serverului.

Pentru a accelera în general citirea/scrierea, aceste operațiuni sunt efectuate în fire generate de procesul „Operațiuni”. Numărul de fire este de obicei egal cu numărul de fișiere deschise. Sarcinile de citire/scriere de la clienți sunt trimise la coada generală, iar primul fir liber preia sarcina din cap. Logica specială vă permite să eliminați operațiunile de rescriere a datelor din memoria RAM a serverului.

Procesul de operațiuni monitorizează activitatea clientului și oprește service-ul fie la comenzile lor, fie atunci când expirarea timpului de inactivitate este depășită.

Pentru a asigura fiabilitatea, Cageserver păstrează jurnalele tuturor tranzacțiilor. Un jurnal general conține copii ale mesajelor de la clienți cu sarcini pentru a crea/deschide/redenumi/șterge fișiere. Se creează un jurnal separat pentru fiecare fișier de lucru, în care sunt înregistrate copii ale mesajelor cu sarcini pentru citirea și scrierea datelor din acest fișier de lucru, precum și matrice de date scrise (noi) și matrice de date care au fost distruse în timpul suprascrierii (scrierea). date noi „pe deasupra” celor vechi). ).

Aceste jurnale oferă posibilitatea atât de a restaura noile modificări ale copiilor de rezervă, cât și de a derula înapoi conținutul actual la un punct din trecut.

Cageserver are aproximativ 3100 de linii de cod.

Sistem de acces la fișiere de la distanță Cage

Lansarea programului server de fișiere Cageserver

La pornire, în dialog trebuie să definiți:
— portul principal pentru autorizare;
— numărul de porturi pentru schimbul de tranzacții cu clienții autorizați (de la 1 sau mai mulți, grupul de numere începe de la cel de lângă numărul portului principal).

Folosind Clasa Cage

clasă cuşcă.Cușcă( cage_name="", pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, wake=False, cache_file="" )

Din această clasă sunt create obiecte care interacționează cu serverele de fișiere și conțin memorie tampon.

Parametrii

  • nume_cușcă(str) - numele condiționat al obiectului, care este folosit pentru a identifica clienții din partea serverului
  • mărimea paginii(int) - dimensiunea unei pagini de memorie tampon (în octeți)
  • numere(int) — numărul de pagini de memorie tampon
  • maxstrlen(int) - lungimea maximă a unui șir de octeți în operațiile de scriere și citire
  • server_ip(dict) - un dicționar cu adresele serverelor utilizate, unde cheia este numele condiționat al serverului (id-ul serverului în interiorul aplicației), iar valoarea este un șir cu adresa: „adresă ip:port” sau „DNS: port” (compararea numelor și adreselor reale este temporară, poate fi schimbată)
  • aștepta(int) — timp de așteptare pentru un răspuns de la server la recepția de porturi (în secunde)
  • treaz(boolean) — steag al modului în care este creat obiectul (Fals - dacă este creat un obiect nou, Adevărat - dacă un obiect este creat dintr-un obiect „restrâns” anterior - folosind operația „hibernare”, implicit Fals)
  • cache_file(str) - nume de fișier pentru hibernare

metode

Cuşcă.file_create( server, cale ) – creați un fișier nou

Cuşcă.redenumire_fișier( server, cale, nume_nou ) – redenumiți fișierul

Cuşcă.file_remove( server, cale) - ștergeți un fișier

Cuşcă.deschide( server, cale, mod ) - deschide fișierul

Se intoarce fcanal numărul canalului. Parametru Mod - acesta este modul de deschidere a fișierului: "wm" - exclusiv (citire/scriere), "rs" - doar pentru citire și partajat numai pentru citire de către alți clienți, "ws" - citire/scriere și partajat numai pentru citire de către alti clienti.

Cuşcă.închide (fcanal) – închideți fișierul

Cuşcă.scrie (fcanal, începe, date ) – scrieți un șir de octeți într-un fișier

Cuşcă.citit (fchannel, începe, len_data ) – citește un șir de octeți dintr-un fișier

Cuşcă.pune_pagini ( fcanal ) – „împinge” din buffer către server toate paginile canalului specificat care au fost modificate. Este folosit în acele puncte ale algoritmului când trebuie să vă asigurați că toate operațiunile de pe canal sunt salvate fizic într-un fișier de pe server.

Cuşcă.împinge_toate () – „împinge” din buffer către server toate paginile tuturor canalelor pentru o instanță a clasei Cage care au fost modificate. Folosit atunci când trebuie să vă asigurați că toate operațiunile de pe toate canalele sunt salvate pe server.

Sursa: www.habr.com

Adauga un comentariu