Cage sistem za daljinski pristup datotekama

Svrha sistema

Podrška za daljinski pristup datotekama na računarima na mreži. Sistem „virtuelno“ podržava sve osnovne operacije sa datotekama (kreiranje, brisanje, čitanje, pisanje, itd.) razmjenom transakcija (poruka) koristeći TCP protokol.

Aplikacije

Funkcionalnost sistema je efikasna u sledećim slučajevima:

  • u nativnim aplikacijama za mobilne i ugrađene uređaje (pametni telefoni, ugrađeni kontrolni sistemi, itd.) koje zahtijevaju brz pristup datotekama na udaljenim serverima u slučaju mogućih privremenih prekida u komunikaciji (sa odlaskom van mreže);
  • u učitanim DBMS-ovima, ako se obrada upita vrši na nekim serverima, a skladištenje podataka na drugim;
  • u distribuiranim korporativnim mrežama za prikupljanje i obradu informacija koje zahtijevaju veliku brzinu razmjene podataka, redundantnost i pouzdanost;
  • u složenim sistemima sa mikroservisnom arhitekturom, gde su kašnjenja u razmeni informacija između modula kritična.

struktura

Cage sistem (postoji implementacija - beta verzija u Python 3.7 na Windows) uključuje dva glavna dijela:

  1. Cageserver — program fajl servera (paket funkcija) koji radi na računarima na mreži čiji fajlovi zahtevaju daljinski pristup;
  2. razred kavez sa bibliotekom metoda za klijentski softver, pojednostavljujući kodiranje interakcije sa serverima.

Korištenje sistema na strani klijenta

Metode klase Cage zamjenjuju uobičajene, “rutinske” operacije sistema datoteka: kreiranje, otvaranje, zatvaranje, brisanje datoteke, kao i čitanje/zapisivanje podataka u binarnom formatu (koji označava poziciju i veličinu podataka). Konceptualno, ove metode su bliske funkcijama datoteka jezika C, gdje se otvaranje/zatvaranje datoteka vrši “na kanalima” za ulaz/izlaz.

Drugim riječima, programer ne radi s metodama objekata "datoteka" (cl _io u Pythonu), ali sa metodama klase Cage.

Kada se kreira instanca Cage objekta, ona uspostavlja početnu vezu sa serverom (ili nekoliko servera), ovlašćuje ga ID klijenta i prima potvrdu sa namenskim brojem porta za sve operacije sa datotekama. Kada se Cage objekt izbriše, on daje instrukcije serveru da prestane komunicirati i zatvori datoteke. Prekid komunikacije također mogu inicirati sami serveri.

Sistem povećava performanse čitanja/pisanja baferovanjem često korišćenih fragmenata datoteka klijentskih programa u RAM keš memoriju (bafer).
Klijentski softver može koristiti bilo koji broj Cage objekata sa različitim postavkama (veličina memorije bafera, veličina bloka prilikom razmjene sa serverom, itd.).

Jedan objekat Cage može komunicirati sa više datoteka na više servera. Komunikacijski parametri (IP adresa ili DNS server, glavni port za autorizaciju, staza i naziv datoteke) određuju se prilikom kreiranja objekta.

Budući da svaki Cage objekt može raditi s više datoteka u isto vrijeme, zajednički memorijski prostor se koristi za baferovanje. Veličina keša – broj stranica i njihova veličina, postavlja se dinamički prilikom kreiranja Cage objekta. Na primjer, keš memorija od 1 GB je 1000 stranica od 1 MB svaka, ili 10 hiljada stranica od 100 KB svaka, ili 1 milion stranica od 1 KB svaka. Odabir veličine i broja stranica poseban je zadatak za svaki slučaj primjene.

Možete koristiti više objekata Cage u isto vrijeme da definirate različite postavke memorije bafera ovisno o tome kako se pristupa informacijama u različitim datotekama. Kao osnovni, koristi se najjednostavniji algoritam baferovanja: nakon što se iscrpi određena količina memorije, nove stranice istiskuju stare po principu povlačenja sa minimalnim brojem pristupa. Baferovanje je posebno efikasno u slučaju neujednačenog (u statističkom smislu) zajedničkog pristupa, prvo, različitim datotekama, i, drugo, fragmentima svake datoteke.

Klasa Cage podržava I/O ne samo putem adresa podataka (koji ukazuju na poziciju i dužinu niza, “zamjenjujući” operacije sistema datoteka), već i na nižem, “fizičkom” nivou – brojevima stranica u memoriji bafera.

Originalna funkcija je podržana za objekte Cage "hibernacija" („spavanje“) - mogu se „sažmiti“ (na primjer, u slučaju gubitka veze sa serverima, ili kada je aplikacija zaustavljena, itd.) u lokalnu dump datoteku na strani klijenta i brzo vratiti iz ovu datoteku (nakon što se komunikacija nastavi, kada ponovo pokrenete aplikaciju). Ovo omogućava značajno smanjenje prometa prilikom aktivacije klijentskog programa nakon privremenog odlaska u "offline", jer će često korišteni fragmenti datoteka već biti u kešu.

Cage ima oko 3600 linija koda.

Principi izgradnje servera

Cageserver fajl serveri se mogu pokrenuti sa proizvoljnim brojem portova, od kojih se jedan („glavni“) koristi samo za autorizaciju svih klijenata, a ostali se koriste za razmjenu podataka. Program Cage servera zahtijeva samo Python. Paralelno, računar sa serverom datoteka može obavljati bilo koji drugi posao.

Server u početku počinje kao skup dva glavna procesa:

  1. "Veze" – proces za obavljanje operacija uspostavljanja komunikacije sa klijentima i njenog prekida na inicijativu servera;
  2. "operacije" – proces za obavljanje zadataka (operacija) klijenata za rad sa fajlovima, kao i za zatvaranje komunikacijskih sesija na osnovu klijentskih komandi.

Oba procesa nisu sinkronizirana i organizirana su kao beskonačne petlje primanja i slanja poruka na osnovu višeprocesnih redova, proxy objekata, brava i utičnica.
Proces povezivanja dodjeljuje port za svakog klijenta za primanje i prijenos podataka. Broj portova se postavlja kada se server pokrene. Preslikavanje između portova i klijenata je pohranjeno u proxy memoriji koja se dijeli između procesa.

Operativni proces podržava dijeljenje resursa datoteka tako da više različitih klijenata može dijeliti (kvazi-paralelne, pošto je pristup kontrolisan bravama) čitati podatke iz jedne datoteke ako je to bilo dozvoljeno kada ju je inicijalno otvorio "prvi" klijent.

Obrada naredbi za kreiranje/brisanje/otvaranje/zatvaranje datoteka na serveru se vrši u samom procesu “Operacije” striktno uzastopno koristeći podsistem datoteka OS servera.

Da bi se općenito ubrzalo čitanje/pisanje, ove operacije se izvode u nitima koje stvara proces “Operacije”. Broj niti je obično jednak broju otvorenih datoteka. Zadaci čitanja/pisanja od klijenata se predaju u opći red čekanja i prva slobodna nit preuzima zadatak iz glave. Posebna logika vam omogućava da eliminišete operacije prepisivanja podataka u RAM servera.

Operativni proces prati aktivnost klijenta i prestaje da ih servisira bilo na njihove naredbe ili kada je prekoračeno vremensko ograničenje neaktivnosti.

Kako bi osigurao pouzdanost, Cageserver vodi evidenciju svih transakcija. Jedan opći dnevnik sadrži kopije poruka od klijenata sa zadacima za kreiranje/otvaranje/preimenovanje/brisanje datoteka. Za svaku radnu datoteku kreira se poseban dnevnik u koji se evidentiraju kopije poruka sa zadacima za čitanje i upisivanje podataka u ovu radnu datoteku, kao i nizovi pisanih (novih) podataka i nizovi podataka koji su uništeni tokom prepisivanja (pisanja). novi podaci "na vrhu" starih). ).

Ovi zapisnici pružaju mogućnost vraćanja novih promjena u sigurnosne kopije i vraćanja trenutnog sadržaja na tačku u prošlosti.

Cageserver ima oko 3100 linija koda.

Cage sistem za daljinski pristup datotekama

Pokretanje programa server datoteka Cageserver

Prilikom pokretanja, u dijalogu morate definirati:
— glavna luka za autorizaciju;
— broj portova za razmjenu transakcija sa ovlaštenim klijentima (od 1 ili više, skup brojeva počinje od onog pored glavnog broja porta).

Korištenje klase Cage

razred kavez.kavez( cage_name="", veličina stranice=0, numpages=0, maxstrlen=0, server_ip={}, čekanje=0, buđenje=False, cache_file="" )

Iz ove klase se kreiraju objekti koji stupaju u interakciju sa serverima datoteka i sadrže memoriju bafera.

parametri

  • cage_name(str) - uslovno ime objekta, koji se koristi za identifikaciju klijenata na strani servera
  • veličina stranice(Int) — veličina jedne stranice bafer memorije (u bajtovima)
  • numpages(Int) — broj stranica memorije bafera
  • maxstrlen(Int) - maksimalna dužina niza bajtova u operacijama pisanja i čitanja
  • server_ip(dict) - rečnik sa adresama korišćenih servera, gde je ključ uslovno ime servera (id servera unutar aplikacije), a vrednost je niz sa adresom: “ip adresa:port” ili “DNS: port” (poređenje imena i stvarne adrese je privremeno, može se promijeniti)
  • čekaj(Int) — vrijeme čekanja na odgovor servera prilikom prijema portova (u sekundama)
  • budan(boolean) — oznaka načina na koji je objekt kreiran (lažan - ako se kreira novi objekat, istinski - ako je objekt kreiran iz prethodno "srušenog" - pomoću operacije "hibernacije", po defaultu False)
  • cache_file(str) - naziv datoteke za hibernaciju

Metode

Cage.file_create( server, put ) – kreirajte novu datoteku

Cage.file_rename( server, put, novo_ime ) – preimenujte datoteku

Cage.file_remove( server, put) - brisanje datoteke

Cage.otvoreno( server, put, mod ) - otvori datoteku

Povratak fchannel broj kanala. Parametar protiv - ovo je način otvaranja datoteke: "wm" - ekskluzivno (čitanje/pisanje), "rs" - samo za čitanje i dijeli se samo za čitanje od strane drugih klijenata, "ws" - čitanje/pisanje, i dijeli se samo za čitanje od strane drugim klijentima.

Cage.blizu (fchannel) – zatvorite datoteku

Cage.pisati (fchannel, početak, podaci ) – upisati niz bajtova u datoteku

Cage.čitati (fchannel, početak, len_data ) – čita niz bajtova iz datoteke

Cage.put_pages ( fchannel ) – „gura“ iz bafera na server sve stranice navedenog kanala koje su izmijenjene. Koristi se u onim tačkama u algoritmu kada treba da budete sigurni da su sve operacije na kanalu fizički sačuvane u datoteci na serveru.

Cage.push_all () – „gura“ iz bafera na server sve stranice svih kanala za instancu klase Cage koje su izmijenjene. Koristi se kada morate biti sigurni da su sve operacije na svim kanalima sačuvane na serveru.

izvor: www.habr.com

Dodajte komentar