Namjena sustava
Podrška za udaljeni pristup datotekama na računalima u mreži. Sustav "virtualno" podržava sve osnovne operacije s datotekama (stvaranje, brisanje, čitanje, pisanje i dr.) putem razmjene transakcija (poruka) po TCP protokolu.
Područja primjene
Funkcionalnost sustava je učinkovita u sljedećim slučajevima:
- u nativnim aplikacijama za mobilne i ugrađene uređaje (pametan telefoni, sustavi za upravljanje na brodu itd.), koji zahtijevaju brz pristup datotekama na udaljenim poslužiteljima u uvjetima vjerojatnih vremenskih prekida veze (kada odlaze u offline);
- u opterećenim DBMS-ima, ako se obrada zahtjeva provodi na jednim poslužiteljima, a pohrana podataka – na drugim;
- u distribuiranim korporativnim mrežama za prikupljanje i obradu informacija, koje zahtijevaju visoku brzinu prijenosa podataka, rezervaciju i pouzdanost;
- u složenim sustavima s mikroservisnom arhitekturom, gdje su kašnjenja u razmjeni informacija između modula od kritične važnosti.
Struktura
Sustav Cage (ima implementaciju — beta verziju u Pythonu 3.7 na Windows operativnom sustavu) uključuje dva glavna dijela:
- Cageserver — program datotečnog poslužitelja (paket funkcija), koji se pokreće na računalima u mreži, čijim datotekama je potreban udaljeni pristup;
- klasa Cage s bibliotekom metoda za klijentski softver, koja pojednostavljuje kodiranje interakcije s poslužiteljima.
Korištenje sustava na strani klijenata
Metode klase Cage zamjenjuju uobičajene, "rutinske" operacije datotečnog sustava: stvaranje, otvaranje, zatvaranje, brisanje datotekâ, kao i čitanje/pisanje podataka u binarnom formatu (s navođenjem pozicije i veličine podataka). Konceptualno su te metode približne datotečnim funkcijama jezika C, gdje se otvaranje/zatvaranje datoteka provodi "na kanalima" ulazno-izlaznih operacija.
Drugim riječima, programer radi ne s metodama "datotečnih" objekata (klasa _io u Pythonu), nego s metodama klase Cage.
Pri stvaranju instance objekta Cage uspostavlja se početna veza s poslužiteljem (ili više poslužitelja), prolazi autorizaciju putem ID klijenta i dobiva potvrdu s brojem dodijeljenog porta za izvršavanje svih operacija s datotekama. Pri brisanju objekta Cage daje poslužitelju naredbu za prekid veze i zatvaranje datoteka. Prekid veze mogu inicirati i sami poslužitelji.
Sustav poboljšava brzinu čitanja/pisanja temeljem predmemoriranja često korištenih dijelova datoteka u predmemoriji (bufi) radne memorije klijentskih programa.
Klijentski softver može koristiti bilo broj objekata Cage s različitim postavkama (veličina predmemorije, veličina blokova pri razmjeni s poslužiteljem itd.).
Jedan objekt Cage može razmjenjivati podatke s više datoteka na više poslužitelja. Parametri za vezu (IP adresa ili DNS poslužitelja, glavni port za autorizaciju, putanja i naziv datoteke) definiraju se prilikom stvaranja objekta.
Budući da svaki objekt Cage može istovremeno raditi s mnogim datotekama, za predmemoriranje se koristi zajednički prostor memorije. Veličina predmemorije - broj stranica i njihova veličina, određuje se dinamički prilikom stvaranja objekta Cage. Na primjer, predmemorija od 1 GB - to je 1000 stranica po 1 MB, ili 10.000 stranica po 100 KB, ili 1 milijun stranica po 1 KB. Odabir veličine i broja stranica specifičan je zadatak za svaki pojedini slučaj primjene.
Može se istovremeno koristiti više objekata Cage kako bi se odredile različite postavke predmemorije ovisno o karakteristikama pristupa informacijama u različitim datotekama. Kao osnovni primjenjuje se najjednostavniji algoritam predmemoriranja: nakon iscrpljivanja zadanog volumena memorije nove stranice istiskuju stare prema principu izlaska s minimalnim brojem pristupa. Predmemoriranje je osobito učinkovito u slučaju nejednakog (u statističkom smislu) zajedničkog pristupa, s jedne strane, različitim datotekama, a s druge strane, dijelovima svake datoteke.
Klasa Cage podržava ulaz/izlaz ne samo po adresama podataka (uz navođenje pozicije i duljine niza, 'zamjenjujući' operacije datotečnog sustava), nego i na nižoj, 'fizičkoj' razini - prema brojevima stranica u predmemoriji.
Za objekte Cage podržava se izvorna funkcija „hibernacije“ («spavanje») – mogu se „smanjiti“ (na primjer, u slučaju prekida veze s poslužiteljima ili pri zaustavljanju aplikacije i slično) u lokalnu dump datoteku na strani klijenta i brzo obnoviti iz te datoteke (nakon ponovnog uspostavljanja veze, pri ponovnom pokretanju aplikacije). Ovo omogućava značajno smanjenje prometa prilikom aktivacije rada klijentskog programa nakon privremenog odlaska „u offline“, budući da često korišteni dijelovi datoteka već će biti pohranjeni u predmemoriji.
Cage — to je oko 3600 redaka koda.
Načela izgradnje poslužitelja
Cage poslužitelji za datoteke mogu se pokretati s proizvoljnim brojem portova, jedan od kojih („glavni“) koristi se samo za autorizaciju svih klijenata, dok se ostali koriste za razmjenu podataka. Za program poslužitelja Cage potreban je samo Python. Paralelno, računalni poslužitelj datoteka može obavljati bilo koji drugi posao.
Poslužitelj se pokreće u početku kao skupina dva glavna procesa:
- „Veze“ – proces za izvršavanje operacija uspostavljanja veze s klijentima i njeno prekidanje na inicijativu poslužitelja;
- „Operacije“ – proces za izvršavanje zadataka (operacija) klijenata vezanih uz rad s datotekama, kao i za zatvaranje sesija veze po naredbama klijenata.
Oba procesa nisu sinkronizirana i organizirana su kao beskrajni ciklusi primanja i slanja poruka temeljenih na multiprocess prioritetnim redovima, proxy objektima, zaključavanju i soketima.
Proces „Veze“ dodjeljuje svakom klijentu port za prijenos podataka. Broj portova određuje se prilikom pokretanja poslužitelja. Odnos između portova i klijenata pohranjuje se u dijeljenoj proxy memoriji između procesa.
Proces „Operacije“ podržava dijeljenje datotečnih resursa, pri čemu nekoliko različitih klijenata može zajednički (kvaziparalelno, budući da se pristup upravlja zaključcima) čitati podatke iz jedne datoteke, ako je to odobreno prilikom njenog početnog otvaranja od „prvog“ klijenta.
Obrada naredbi za kreiranje/brisanje/otvaranje/zatvaranje datoteka na serveru izvodi se u samom procesu „Operacije“ strogo slijedno koristeći datotečni sustav OS-a poslužitelja.
Za opće ubrzanje čitanja i pisanja, ove operacije se vrše u niti (threads), koje pokreće proces "Operacije". Broj niti obično odgovara broju otvorenih datoteka. Zadaci za čitanje/pisanje od klijenata podnose se u zajedničku queue, a prva slobodna nit preuzima zadatak s njenog vrha. Posebna logika omogućava isključivanje operacija prepisivanja podataka u radnoj memoriji poslužitelja.
Proces "Operacije" prati aktivnost klijenata i prekida njihovu uslugu kako po njihovim naredbama, tako i u slučaju prekoračenja vremenskog ograničenja neaktivnosti.
Za osiguranje pouzdanosti, Cageserver vodi dnevnike svih transakcija. Jedan zajednički dnevnik sadrži kopije poruka od klijenata sa zadacima za stvaranje/otvaranje/preimenovanje/brisanje datoteka. Za svaku radnu datoteku kreira se poseban dnevnik u kojem se bilježe kopije poruka sa zadacima za čitanje i pisanje podataka u toj radnoj datoteci, kao i nizovi spremljenih (novih) podataka i nizovi podataka koji su uništeni prepisivanjem (upisivanjem novih podataka "preko" starih).
Ovi dnevnici omogućuju kako oporavak novih promjena u rezervnim kopijama, tako i "povratak" s trenutnog sadržaja na određeni trenutak u prošlosti.
Cageserver se sastoji od oko 3100 linija koda.

Pokretanje programa datotečnog poslužitelja Cageserver
Prilikom pokretanja u dijalogu treba odrediti:
— glavni port za autorizaciju;
— broj portova za razmjenu transakcijama s autoriziranim klijentima (od 1 i više, skup brojeva počinje s onim nakon glavnog port broja).
Korištenje klase Cage
class cage.Cage( cage_name=», pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file=»» )
Iz ove klase se kreiraju objekti koji vrše interakciju s datotečnim poslužiteljima i sadrže bafer memoriju.
Postavke
- cage_name(str) — uvjetno ime objekta koje se koristi pri identifikaciji klijenata na strani poslužitelja
- pagesize(int) — veličina jedne stranice bafer memorije (u bajtovima)
- numpages(int) — broj stranica bafer memorije
- maxstrlen(int) — maksimalna dužina bajtne niza u operacijama pisanja i čitanja
- server_ip(dict) — rječnik s adresama koje se koriste poslužitelja, gdje je ključ uvjetno ime poslužitelja (id poslužitelja unutar aplikacije), a vrijednost je niz s adresom: “ip adresa:port” ili “DNS:port” (mape imena i stvarnih adresa su privremene, mogu se mijenjati)
- wait(int) — vrijeme čekanja odgovora od poslužitelja prilikom primanja portova (u sekundama)
- budan(boolean) — zastavica načina stvaranja objekta (False — ako se stvara novi objekt, True — ako se objekt stvara iz ranije „smanjenog“ — primjenom operacije „hibernacija“, prema zadanim postavkama False)
- cache_file(str) — ime datoteke za hibernaciju
Metode
Cage.file_create( poslužitelj, putanja ) – stvoriti novu datoteku
Cage.file_rename( poslužitelj, putanja, novo_ime ) – preimenuj datoteku
Cage.file_remove( poslužitelj, putanja) – obrisi datoteku
Cage.open( poslužitelj, putanja, mod ) – otvori datoteku
Vraća fchannel broj kanala. Parametar mod — način otvaranja datoteke: „wm“ — monopolni (čitanje/zapis), „rs“ — samo za čitanje, i dijeljen samo za čitanje od strane drugih klijenata, „ws“ — čitanje/zapis, i dijeljen samo za čitanje od strane drugih klijenata.
Cage.close (fchannel) – zatvori datoteku
Cage.write (fchannel, početak, podaci ) – zapisati bajtni niz u datoteku
Cage.read (fchannel, početak, len_data ) – pročitati bajtni niz iz datoteke
Cage.put_pages ( fchannel ) – „izbacuje“ iz predmemorije na poslužitelj sve stranice navedenog kanala koje su modificirane. Koristi se u onim točkama algoritma kada je potrebno biti siguran da su sve operacije na kanalu fizički spremljene u datoteci na poslužitelju.
Cage.push_all () – „izbacuje“ iz predmemorije na poslužitelj sve stranice svih kanala za instancu klase Cage, koje su modificirane. Koristi se kada je potrebno biti siguran da su sve operacije na svim kanalima spremljene na poslužitelju.
Izvor: habr.com
