Cage Remote File Access System

Systemformål

Understøttelse af fjernadgang til filer på computere på netværket. Systemet understøtter "stort set" alle grundlæggende filoperationer (oprettelse, sletning, læsning, skrivning osv.) ved at udveksle transaktioner (meddelelser) ved hjælp af TCP-protokollen.

applikationer

Systemets funktionalitet er effektiv i følgende tilfælde:

  • i indbyggede applikationer til mobile og indlejrede enheder (smartphones, indbyggede kontrolsystemer osv.), der kræver hurtig adgang til filer på fjernservere i lyset af mulige midlertidige afbrydelser i kommunikationen (ved at gå offline);
  • i indlæste DBMS'er, hvis forespørgselsbehandling udføres på nogle servere, og datalagring udføres på andre;
  • i distribuerede virksomhedsnetværk til indsamling og behandling af information, der kræver højhastighedsdataudveksling, redundans og pålidelighed;
  • i komplekse systemer med mikroservicearkitektur, hvor forsinkelser i udvekslingen af ​​information mellem moduler er kritiske.

Struktur

Cage-systemet (der er en implementering - betaversion i Python 3.7 på Windows) inkluderer to hoveddele:

  1. Cageserver — et filserverprogram (en pakke af funktioner), der kører på computere på netværket, hvis filer kræver fjernadgang;
  2. klasse Cage med et bibliotek af metoder til klientsoftware, der forenkler kodningen af ​​interaktion med servere.

Brug af systemet på klientsiden

Cage-klassens metoder erstatter de sædvanlige "rutinemæssige" filsystemoperationer: oprettelse, åbning, lukning, sletning filer, samt læse/skrive data i binært format (angiver dataenes position og størrelse). Konceptuelt ligger disse metoder tæt på filfunktionerne i C-sproget, hvor åbning/lukning af filer udføres "på kanaler" for input/output.

Med andre ord arbejder programmøren ikke med metoder til at "file" objekter (klasse _io i Python), men med metoder i Cage-klassen.

Når en forekomst af et Cage-objekt oprettes, etablerer det en indledende forbindelse med en server (eller flere servere), autoriseres af klient-id'et og modtager bekræftelse med et dedikeret portnummer for alle filhandlinger. Når et Cage-objekt slettes, instruerer det serveren om at stoppe med at kommunikere og lukke filerne. Afbrydelse af kommunikation kan også initieres af serverne selv.

Systemet forbedrer læse-/skriveydelsen ved at bufre ofte brugte filfragmenter af klientprogrammer i RAM-cachen (bufferen).
Klientsoftware kan bruge et hvilket som helst antal Cage-objekter med forskellige indstillinger (bufferhukommelsesstørrelse, blokstørrelse ved udveksling med serveren osv.).

Et enkelt Cage-objekt kan kommunikere med flere filer på flere servere. Kommunikationsparametre (IP-adresse eller DNS-server, hovedport for autorisation, sti og filnavn) angives ved oprettelse af objektet.

Da hvert Cage-objekt kan arbejde med flere filer på samme tid, bruges delt hukommelsesplads til buffering. Cachestørrelse – antallet af sider og deres størrelse indstilles dynamisk, når du opretter et Cage-objekt. For eksempel er en 1 GB cache 1000 sider á 1 MB hver, eller 10 tusinde sider på 100 KB hver, eller 1 million sider på 1 KB hver. Valg af størrelse og antal sider er en specifik opgave for hver ansøgningssag.

Du kan bruge flere Cage-objekter på samme tid til at definere forskellige bufferhukommelsesindstillinger afhængigt af, hvordan der tilgås oplysninger i forskellige filer. Som en grundlæggende bruges den enkleste bufferalgoritme: efter at en given mængde hukommelse er opbrugt, fortrænger nye sider gamle i henhold til princippet om pensionering med et minimum antal adgange. Buffring er især effektiv i tilfælde af ujævn (i statistisk forstand) delt adgang, for det første til forskellige filer og for det andet til fragmenter af hver fil.

Cage-klassen understøtter I/O ikke kun af dataadresser (angiver positionen og længden af ​​arrayet, "erstatning" af filsystemoperationer), men også på et lavere, "fysisk" niveau - ved sidetal i bufferhukommelsen.

Den originale funktion understøttes for Cage-objekter "dvale" ("sleep") - de kan "kollapses" (for eksempel i tilfælde af tab af forbindelse til servere, eller når applikationen stoppes osv.) til en lokal dumpfil på klientsiden og hurtigt gendannes fra denne fil (efter at kommunikationen er genoptaget, når du genstarter programmet). Dette gør det muligt at reducere trafikken betydeligt, når klientprogrammet aktiveres efter midlertidigt at gå "offline", da ofte brugte filfragmenter allerede vil være i cachen.

Cage er omkring 3600 linjer kode.

Principper for serverkonstruktion

Cageserver filservere kan køres med et vilkårligt antal porte, hvoraf den ene ("main") kun bruges til autorisation af alle klienter, resten bruges til dataudveksling. Cage-serverprogrammet kræver kun Python. Sideløbende kan computeren med filserveren udføre ethvert andet arbejde.

Serveren starter i første omgang som en samling af to hovedprocesser:

  1. "Forbindelser" – en proces til at udføre operationerne med at etablere kommunikation med klienter og afslutte den på initiativ af serveren;
  2. "Operationer" – en proces til at udføre opgaver (operationer) af klienter til at arbejde med filer, samt til at afslutte kommunikationssessioner baseret på klientkommandoer.

Begge processer er ikke synkroniserede og er organiseret som endeløse sløjfer af modtagelse og afsendelse af beskeder baseret på multiproces-køer, proxy-objekter, låse og sockets.
Forbindelsesprocessen allokerer en port til hver klient til at modtage og transmittere data. Antallet af porte indstilles, når serveren starter. Kortlægningen mellem porte og klienter er gemt i interproces-delt proxyhukommelse.

Operations-processen understøtter deling af filressourcer, så flere forskellige klienter kan dele (kvasi-parallel, da adgang styres af låse) læs data fra én fil, hvis dette var tilladt, da den oprindeligt blev åbnet af den "første" klient.

Behandling af kommandoer til at oprette/slette/åbne/lukke filer på serveren udføres i selve "Operations"-processen strengt sekventielt ved hjælp af filundersystemet i serverens OS.

For generelt at fremskynde læsning/skrivning udføres disse operationer i tråde, der er skabt af "Operations"-processen. Antallet af tråde er normalt lig med antallet af åbne filer. Læse-/skriveopgaver fra klienter sendes til den generelle kø, og den første ledige tråd tager opgaven fra hovedet. Særlig logik giver dig mulighed for at eliminere dataomskrivningsoperationer i serverens RAM.

Operationsprocessen overvåger klientaktivitet og stopper med at servicere dem enten efter deres kommandoer, eller når inaktivitetstimeoutet overskrides.

For at sikre pålidelighed fører Cageserver log over alle transaktioner. Én generel log indeholder kopier af meddelelser fra klienter med opgaver til at oprette/åbne/omdøbe/slette filer. Der oprettes en separat log for hver arbejdsfil, hvori kopier af meddelelser med opgaver til læsning og skrivning af data i denne arbejdsfil registreres, samt arrays af skrevne (nye) data og arrays af data, der blev ødelagt under overskrivning (skrivning). nye data "ovenpå" gamle). ).

Disse logfiler giver mulighed for både at gendanne nye ændringer til sikkerhedskopier og rulle det nuværende indhold tilbage til et tidligere tidspunkt.

Cageserver er omkring 3100 linjer kode.

Cage Remote File Access System

Start af Cageserver-filserverprogrammet

Når du starter, skal du i dialogen definere:
— hovedhavn for godkendelse;
— antallet af porte til udveksling af transaktioner med autoriserede kunder (fra 1 eller flere starter puljen af ​​numre fra den ved siden af ​​hovedportnummeret).

Brug af Cage Class

klasse bur.Cage( cage_name="", pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file="" )

Objekter oprettes fra denne klasse, der interagerer med filservere og indeholder bufferhukommelse.

Parametre

  • bur_navn(str) - betinget navn på objektet, som bruges til at identificere klienter på serversiden
  • sidestørrelse(int) — størrelsen på én side bufferhukommelse (i bytes)
  • tal(int) — antal bufferhukommelsessider
  • maxstrlen(int) - den maksimale længde af en bytestreng i skrive- og læseoperationer
  • server_ip(dict) - en ordbog med adresserne på de anvendte servere, hvor nøglen er det betingede navn på serveren (server-id inde i applikationen), og værdien er en streng med adressen: "ip-adresse:port" eller "DNS: port" (sammenligningen af ​​navne og rigtige adresser er midlertidig, den kan ændres)
  • vente(int) — ventetid på svar fra serveren ved modtagelse af porte (i sekunder)
  • vågen(boolean) — flag for, hvordan objektet er oprettet (False - hvis der oprettes et nyt objekt, Sand - hvis et objekt er oprettet fra et tidligere "kollapset" - ved hjælp af "dvale"-operationen, Falsk som standard)
  • cache_fil(str) - filnavn til dvaletilstand

metoder

Bur.file_create( server, sti ) – opret en ny fil

Bur.fil_omdøb( server, sti, nyt_navn ) – omdøb filen

Bur.file_remove( server, sti) - slet en fil

Bur.åbent( server, sti, mod ) - åben fil

Vender tilbage fkanal kanalnummer. Parameter mod - dette er filåbningstilstanden: "wm" - eksklusiv (læse/skrive), "rs" - skrivebeskyttet og kun delt til læsning af andre klienter, "ws" - læse/skrive og kun delt til læsning af andre kunder.

Bur.tæt (fkanal) – luk filen

Bur.skriver (fchannel, start, data ) – skriv en bytestreng til en fil

Bur.læse (fchannel, start, len_data ) – læs en bytestreng fra en fil

Bur.put_sider ( fkanal ) – "skubber" fra bufferen til serveren alle sider på den specificerede kanal, der er blevet ændret. Det bruges på de punkter i algoritmen, når du skal være sikker på, at alle operationer på kanalen fysisk er gemt i en fil på serveren.

Bur.push_all () – "skubber" fra bufferen til serveren alle sider i alle kanaler for en forekomst af Cage-klassen, der er blevet ændret. Bruges når du skal være sikker på at alle handlinger på alle kanaler er gemt på serveren.

Kilde: www.habr.com

Tilføj en kommentar