Systemets FormÄl
UnderstÞttelse af fjernadgang til filer pÄ computere i netvÊrket. Systemet "understÞtter" alle primÊre filoperationer (oprettelse, sletning, lÊsning, skrivning osv.) ved at udveksle transaktioner (meddelelser) via TCP-protokollen.
AnvendelsesomrÄder
Systemets funktionalitet er effektiv i fĂžlgende tilfĂŠlde:
- i native applikationer til mobile og embedded enheder (smartphones, on-board kontrolsystemer mv.), der krÊver hurtig adgang til filer pÄ fjernservere under forhold med mulige midlertidige afbrydelser i forbindelsen (ved at gÄ offline);
- i belastede databasesystemer, hvis behandlingen af anmodninger foregÄr pÄ én server, mens data opbevares pÄ en anden;
- i distribuerede virksomhedsnetsvÊrk til indsamling og behandling af information, der krÊver hÞj dataudvekslingshastighed, sikkerhedskopiering og pÄlidelighed;
- i komplekse systemer med mikroservices-arkitektur, hvor forsinkelser i informationsudveksling mellem moduler er kritisk vigtige.
Struktur
Cage-systemet (der er en implementering â beta-version pĂ„ Python 3.7 pĂ„ Windows OS) omfatter to hoveddele:
- Cageserver â en programfilserver (funktionspakke), der kĂžrer pĂ„ computere i netvĂŠrket, som har brug for fjernadgang til filer;
- klasse Cage med et bibliotek af metoder til klientsoftware, der forenkler kodningen af interaktionen med servere.
Brug af systemet pÄ klientsiden
Metoderne i Cage-klassen erstatter almindelige, "rutinemÊssige" operationer i filsystemet: oprettelse, Äbning, lukning, sletning af filer, samt lÊsning/skrivning af data i binÊrt format (med angivelse af position og stÞrrelse af data). Konceptuelt er disse metoder tÊt pÄ filfunktionerne i C-sproget, hvor Äbning/lukning af filer foregÄr "pÄ kanaler" for ind- og uddata.
Med andre ord arbejder programmĂžren ikke med metoderne for "filobjekter" (klassen _io i Python), men med metoderne i Cage-klassen.
Ved oprettelse af en forekomst af objekter Cage etablerer den en indledende forbindelse til serveren (eller flere servere), gennemgÄr godkendelse ved klientens Id og modtager en bekrÊftelse med nummeret pÄ den tildelte port for at udfÞre alle filoperationer. NÄr Cage-objektet fjernes, giver det serveren kommandoen til at stoppe forbindelsen og lukke filer. Afbrydelsen af forbindelsen kan ogsÄ initieres af serverne selv.
Systemet forbedrer lÊse-/skrivehastigheden baseret pÄ buffring af ofte anvendte filfragmenter i cache (buffer) i det volatile hukommelse.
Klientsoftwaren kan bruge et vilkÄrligt antal Cage-objekter med forskellige indstillinger (mÊngde af bufferhukommelse, blokstÞrrelser ved kommunikation med serveren osv.).
Et Cage-objekt kan udveksle data med flere filer pÄ flere servere. Parametrene for forbindelsen (IP-adresse eller DNS-server, hovedport til autorisation, sti og filnavn) angives ved oprettelsen af objektet.
Da hvert Cage-objekt kan arbejde simultant med mange filer, anvendes et fĂŠlles hukommelsesrum til buffring. Cache-stĂžrrelsen â antallet af sider og deres stĂžrrelse â sĂŠttes dynamisk ved oprettelsen af Cage-objektet. For eksempel er en cache pĂ„ 1 GB lig med 1000 sider pĂ„ 1 MB, eller 10.000 sider pĂ„ 100 KB, eller 1 million sider pĂ„ 1 KB. Valget af stĂžrrelse og antal sider er en specifik opgave for hver anvendelsessituation.
Det er muligt at bruge flere Cage-objekter samtidigt for at definere forskellige indstillinger for bufferhukommelse afhÊngigt af adgangsforholdene til oplysningerne i forskellige filer. En simpel buffer-algoritme anvendes grundlÊggende: nÄr den tildelte mÊngde hukommelse er udtÞmt, erstatter nye sider gamle ifÞlge princippet for udsmidning med minimale adgangsnumre. Buffring er isÊr effektiv i tilfÊlde af uregelmÊssig (i statistisk forstand) samtidig adgang, fÞrst til forskellige filer og dernÊst til fragmenter af hver fil.
Cage-klassen understĂžtter input/output ikke kun efter dataadresser (med angivelse af position og lĂŠngde af arrayet, "erstatte" filsystemoperationer), men ogsĂ„ pĂ„ et lavere, "fysisk" niveau â efter side-numre i bufferhukommelsen.
For Cage-objekter understĂžttes den originale funktion "hibernation" («pause») â de kan «minimeres» (for eksempel ved tab af forbindelse til serverne eller ved stop af applikationen osv.) til en lokal dump-fil pĂ„ klientsiden og hurtigt genskabes fra denne fil (efter genoptagelse af forbindelsen, ved genstart af applikationen). Dette muliggĂžr en betydelig reduktion af trafikken, nĂ„r klientprogrammet genoptages efter et midlertidigt offline-ophold, da ofte anvendte filfragmenter allerede vil vĂŠre i cachen.
Cage er omkring 3600 linjer kode.
Principper for serveropbygning
Cageserver fil-servere kan startes med et vilkÄrligt antal porte, hvoraf en («primÊr») kun bruges til autorisering af alle klienter, mens de Þvrige bruges til dataudveksling. For Cage-serverprogrammet krÊves kun Python. Samtidig kan computeren med fil-serveren udfÞre andet arbejde.
Serveren startes fĂžrst som en samling af to hovedprocesser:
- «Forbindelser» â processen for at udfĂžre forbindelsesetablering med klienterne og afslutte forbindelsen efter serverens initiativ;
- «Operationer» â processen til at udfĂžre opgaver (operationer) for klienter i forhold til filer samt til at afslutte sessionsforbindelser efter klienternes kommandoer.
Begge processer er ikke synkroniserede og organiseret som uendelige cyklusser for modtagelse og afsendelse af meddelelser baseret pÄ multiprocess-queues, proxy-objekter, lÄse og sockets.
Processen «Forbindelser» tildeler hver klient en port til dataoverfÞrsel. Antallet af porte angives ved opstart af serveren. Forholdet mellem porte og klienter opbevares i delt proxy-hukommelse mellem processerne.
Processen «Operationer» understÞtter deling af filressourcer, hvorved flere forskellige klienter kan lÊse data fra en fil fÊlles (kvasi-parallelt, da adgangen styres af lÄse) hvis dette blev tilladt ved filens indledende Äbning af den «fÞrste» klient.
Behandling af kommandoer til oprettelse/sletning/Äbning/lukning af filer pÄ serveren foregÄr i selve «Operationer»-processen strengt sekventielt ved hjÊlp af serverens OS filsystem.
For overall read/write speed improvement, these operations are carried out in threads created by the "Operations" process. The number of threads typically equals the number of open files. Read/write tasks from clients are submitted to a common queue, and the first available thread picks a task from its head. Special logic allows for the exclusion of data overwrite operations in the server's RAM.
The "Operations" process monitors client activity and stops servicing them either at their commands or upon exceeding the inactivity timeout.
To ensure reliability, Cageserver maintains logs of all transactions. One common log contains copies of messages from clients with tasks to create/open/rename/delete files. For each working file, a separate log is created, which records copies of messages with read and write data tasks in this working file, as well as arrays of written (new) data and arrays of data that have been destroyed during overwrites (writing new data "over" old data).
These logs provide the ability for both recovering new changes in backups and for "rolling back" from the current content to a desired point in the past.
Cageserver consists of about 3100 lines of code.

Launching the file server program Cageserver
When started, the dialogue must specify:
â the main port for authorization;
â the number of ports for transaction exchange with authorized clients (from 1 and more, the pool of numbers starts from the next one after the main port number).
Using the Cage class
klasse cage.Cage( cage_name=", pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file=" )
Objects are created from this class that interact with file servers and contain buffer memory.
Parametre
- cage_name(str) â a conditional name for the object used when identifying clients on the server side
- pagesize(int) â the size of one page of buffer memory (in bytes)
- numpages(int) â the number of pages of buffer memory
- maxstrlen(int) â the maximum length of byte strings in read and write operations
- server_ip(dict) â a dictionary with the addresses used servere, hvor nĂžglen er det betingede servernavn (server-id'et indenfor applikationen), og vĂŠrdien er en streng med adressen: âip address:portâ eller âDNS:portâ (kortlĂŠgningen af navne og virkelige adresser er midlertidig, den kan ĂŠndres)
- vent(int) â ventetiden for svar fra serveren ved modtagelse af porte (i sek.)
- vĂ„gen(boolean) â flag for metoden til at oprette objektet (False â hvis der oprettes et nyt objekt, Sand â hvis objektet oprettes fra et tidligere âindlejretâ â ved brug af operationen âhibernationâ, som standard er False)
- cache_file(str) â filnavnet til hibernation
Metoder
Cage.file_create( server, sti ) â opret en ny fil
Cage.file_rename( server, sti, new_name ) â omdĂžb filen
Cage.file_remove( server, sti) â slet filen
Cage.open( server, sti, mod ) â Ă„bn filen
Returnerer fchannel kanalnummer. Parameteren mod â er tilstanden for Ă„bning af filen: âwmâ â monopol (lĂŠsning/skrivning), ârsâ â kun lĂŠsning, og delt kun til lĂŠsning af andre kunder, âwsâ â lĂŠsning/skrivning, og delt kun til lĂŠsning af andre kunder.
Cage.close (fchannel) â luk filen
Cage.write (fchannel, begin, data ) â skriv en byte-streng til filen
Cage.write (fchannel, begin, len_data ) â lĂŠs en byte-streng fra filen
Cage.put_pages ( fchannel ) â âskubberâ alle sider fra den angivne kanal, som er blevet modificeret, ud af bufferen til serveren. Bruges i de punkter i algoritmen, hvor det er nĂždvendigt at vĂŠre sikker pĂ„, at alle operationer pĂ„ kanalen er fysisk gemt i filen pĂ„ serveren.
Cage.push_all () â âskubberâ alle sider fra bufferen til serveren for alle kanaler for instansen af klassen Cage, som er blevet modificeret. Bruges, nĂ„r det er nĂždvendigt at vĂŠre sikker pĂ„, at alle operationer pĂ„ alle kanaler er gemt pĂ„ serveren.
Kilde: habr.com
