Cage systeem voor externe bestandstoegang

Systeemdoel

Ondersteuning voor externe toegang tot bestanden op computers in het netwerk. Het systeem ondersteunt “virtueel” alle basisbewerkingen van bestanden (aanmaken, verwijderen, lezen, schrijven, enz.) door transacties (berichten) uit te wisselen met behulp van het TCP-protocol.

toepassingen

De functionaliteit van het systeem is effectief in de volgende gevallen:

  • in native applicaties voor mobiele en embedded apparaten (smartphones, ingebouwde besturingssystemen, enz.) die snelle toegang tot bestanden op externe servers vereisen in het licht van mogelijke tijdelijke onderbrekingen in de communicatie (door offline te gaan);
  • in geladen DBMS'en, als de queryverwerking op sommige servers wordt uitgevoerd en de gegevensopslag op andere;
  • in gedistribueerde bedrijfsnetwerken voor het verzamelen en verwerken van informatie, die snelle gegevensuitwisseling, redundantie en betrouwbaarheid vereisen;
  • in complexe systemen met microservice-architectuur, waarbij vertragingen in de uitwisseling van informatie tussen modules van cruciaal belang zijn.

Structuur

Het Cage-systeem (er is een implementatie - bètaversie in Python 3.7 op Windows) bestaat uit twee hoofdonderdelen:

  1. Cageserver — een bestandsserverprogramma (een pakket functies) dat draait op computers in het netwerk waarvan de bestanden externe toegang vereisen;
  2. klasse Kooi met een bibliotheek met methoden voor clientsoftware, waardoor de codering van de interactie met servers wordt vereenvoudigd.

Gebruik van het systeem aan de clientzijde

De methoden van de klasse Cage vervangen de gebruikelijke, “routinematige” bestandssysteembewerkingen: aanmaken, openen, sluiten, verwijderen bestanden, evenals gegevens lezen/schrijven in binair formaat (geeft de positie en grootte van de gegevens aan). Conceptueel liggen deze methoden dicht bij de bestandsfuncties van de C-taal, waarbij het openen/sluiten van bestanden wordt uitgevoerd “op kanalen” van invoer/uitvoer.

Met andere woorden, de programmeur werkt niet met methoden van “file”-objecten (class _io in Python), maar met methoden van de klasse Cage.

Wanneer een exemplaar van een Cage-object wordt gemaakt, brengt het een eerste verbinding tot stand met een server (of meerdere servers), wordt het geautoriseerd door de Client-ID en ontvangt het een bevestiging met een speciaal poortnummer voor alle bestandsbewerkingen. Wanneer een Cage-object wordt verwijderd, instrueert het de server om de communicatie te stoppen en de bestanden te sluiten. Het beëindigen van de communicatie kan ook door de servers zelf worden geïnitieerd.

Het systeem verbetert de lees-/schrijfprestaties door veelgebruikte bestandsfragmenten van clientprogramma's in de RAM-cache (buffer) te bufferen.
Clientsoftware kan een willekeurig aantal Cage-objecten gebruiken met verschillende instellingen (buffergeheugengrootte, blokgrootte bij uitwisseling met de server, enz.).

Eén Cage-object kan communiceren met meerdere bestanden op meerdere servers. Communicatieparameters (IP-adres of DNS-server, hoofdpoort voor autorisatie, pad en bestandsnaam) worden opgegeven bij het maken van het object.

Omdat elk Cage-object tegelijkertijd met meerdere bestanden kan werken, wordt gedeelde geheugenruimte gebruikt voor buffering. Cachegrootte – het aantal pagina's en hun grootte wordt dynamisch ingesteld bij het maken van een Cage-object. Een cache van 1 GB is bijvoorbeeld 1000 pagina's van elk 1 MB, of 10 pagina's van elk 100 KB, of 1 miljoen pagina's van elk 1 KB. Het selecteren van het formaat en het aantal pagina's is voor elke toepassing een specifieke taak.

U kunt meerdere Cage-objecten tegelijkertijd gebruiken om verschillende buffergeheugeninstellingen te definiëren, afhankelijk van hoe toegang wordt verkregen tot informatie in verschillende bestanden. Als basis wordt het eenvoudigste bufferalgoritme gebruikt: nadat een bepaalde hoeveelheid geheugen is uitgeput, vervangen nieuwe pagina's de oude volgens het principe van pensionering met een minimum aantal toegangen. Buffering is vooral effectief in het geval van ongelijke (in statistische zin) gedeelde toegang, ten eerste tot verschillende bestanden, en ten tweede tot fragmenten van elk bestand.

De Cage-klasse ondersteunt I/O niet alleen door dataadressen (die de positie en lengte van de array aangeven, waardoor bestandssysteembewerkingen worden "vervangen"), maar ook op een lager, "fysiek" niveau - door paginanummers in het buffergeheugen.

De originele functie wordt ondersteund voor Cage-objecten "winterslaap" ("slaap") - ze kunnen worden "samengevouwen" (bijvoorbeeld in het geval van een verlies van verbinding met servers, of wanneer de applicatie wordt gestopt, enz.) in een lokaal dumpbestand aan de clientzijde en snel hersteld van dit bestand (nadat de communicatie is hervat, wanneer u de toepassing opnieuw start). Dit maakt het mogelijk om het verkeer aanzienlijk te verminderen bij het activeren van het clientprogramma nadat het tijdelijk “offline” is gegaan, omdat veelgebruikte bestandsfragmenten zich al in de cache bevinden.

Cage bestaat uit ongeveer 3600 regels code.

Principes van serverconstructie

Cageserver-bestandsservers kunnen worden uitgevoerd met een willekeurig aantal poorten, waarvan er één (“hoofd”) alleen wordt gebruikt voor autorisatie van alle clients, de rest wordt gebruikt voor gegevensuitwisseling. Het Cage-serverprogramma vereist alleen Python. Tegelijkertijd kan de computer met de bestandsserver elk ander werk uitvoeren.

De server start aanvankelijk als een verzameling van twee hoofdprocessen:

  1. "Verbindingen" – een proces voor het uitvoeren van de handelingen voor het tot stand brengen van communicatie met clients en het beëindigen ervan op initiatief van de server;
  2. "Activiteiten" – een proces voor het uitvoeren van taken (bewerkingen) van clients om met bestanden te werken, evenals voor het sluiten van communicatiesessies op basis van clientopdrachten.

Beide processen zijn niet gesynchroniseerd en zijn georganiseerd als eindeloze lussen van het ontvangen en verzenden van berichten op basis van wachtrijen met meerdere processen, proxy-objecten, sloten en sockets.
Het verbindingsproces wijst een poort toe aan elke client om gegevens te ontvangen en te verzenden. Het aantal poorten wordt ingesteld wanneer de server start. De mapping tussen poorten en clients wordt opgeslagen in een interprocess gedeeld proxygeheugen.

Het Operations-proces ondersteunt het delen van bestandsbronnen, zodat meerdere verschillende clients kunnen delen (quasi-parallel, aangezien de toegang wordt gecontroleerd door vergrendelingen) gegevens uit één bestand lezen als dit was toegestaan ​​toen het voor het eerst werd geopend door de "eerste" client.

De verwerking van opdrachten voor het maken/verwijderen/openen/sluiten van bestanden op de server wordt uitgevoerd in het "Bewerkingen"-proces zelf, strikt opeenvolgend met behulp van het bestandssubsysteem van het besturingssysteem van de server.

Om het lezen/schrijven in het algemeen te versnellen, worden deze bewerkingen uitgevoerd in threads die voortkomen uit het “Operations”-proces. Het aantal threads is meestal gelijk aan het aantal geopende bestanden. Lees-/schrijftaken van clients worden naar de algemene wachtrij gestuurd en de eerste vrije thread neemt de taak uit het hoofd. Met speciale logica kunt u bewerkingen voor het herschrijven van gegevens in het RAM van de server elimineren.

Het Operations-proces bewaakt de clientactiviteit en stopt met het bedienen ervan op basis van hun opdrachten of wanneer de time-out voor inactiviteit wordt overschreden.

Om de betrouwbaarheid te garanderen, houdt Cageserver logboeken bij van alle transacties. Eén algemeen logboek bevat kopieën van berichten van clients met taken voor het maken/openen/hernoemen/verwijderen van bestanden. Voor elk werkbestand wordt een apart log gemaakt, waarin kopieën van berichten met taken voor het lezen en schrijven van gegevens in dit werkbestand worden vastgelegd, evenals arrays met geschreven (nieuwe) gegevens en arrays met gegevens die tijdens het overschrijven zijn vernietigd (schrijf nieuwe gegevens ‘bovenop’ oude).

Deze logboeken bieden de mogelijkheid om zowel nieuwe wijzigingen in back-ups te herstellen als de huidige inhoud terug te zetten naar een punt in het verleden.

Cageserver bevat ongeveer 3100 regels code.

Cage systeem voor externe bestandstoegang

Het Cageserver-bestandsserverprogramma starten

Bij het starten moet u in het dialoogvenster het volgende definiëren:
— hoofdhaven voor vergunningverlening;
— het aantal poorten voor het uitwisselen van transacties met geautoriseerde klanten (vanaf 1 of meer begint de pool van nummers vanaf het nummer naast het hoofdpoortnummer).

Gebruik van de kooiklasse

klasse kooi.Kooi( Cage_name="", paginagrootte=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, wake=False, cache_file="" )

Vanuit deze klasse worden objecten gemaakt die communiceren met bestandsservers en buffergeheugen bevatten.

Parameters

  • kooinaam(str) - voorwaardelijke naam van het object, die wordt gebruikt om clients aan de serverzijde te identificeren
  • pagina grootte(int) — grootte van één pagina buffergeheugen (in bytes)
  • aantal(int) — aantal buffergeheugenpagina's
  • maxstrlen(int) - de maximale lengte van een bytereeks bij schrijf- en leesbewerkingen
  • server IP(dict) - een woordenboek met de adressen van de gebruikte servers, waarbij de sleutel de voorwaardelijke naam van de server is (server-ID binnen de applicatie), en de waarde een string is met het adres: “ip-adres:poort” of “DNS: poort” (de vergelijking van namen en echte adressen is tijdelijk, het kan veranderen)
  • wachten(int) — wachttijd voor een reactie van de server bij het ontvangen van poorten (in seconden)
  • wakker(boolean) — vlag van hoe het object is gemaakt (Niet waar - als er een nieuw object wordt gemaakt, Waar - als een object wordt gemaakt op basis van een eerder "samengevouwen" object - met behulp van de "slaapstand"-bewerking, standaard False)
  • cache_bestand(str) - bestandsnaam voor de slaapstand

methoden

Kooi.bestand_create( server, pad ) – maak een nieuw bestand

Kooi.bestandsnaam wijzigen( server, pad, nieuwe_naam ) – hernoem het bestand

Kooi.bestand_verwijderen( server, pad) - verwijder een bestand

Kooi.open( server, pad, mod ) - open bestand

geeft terug fkanaal kanaal nummer. Parameter mod - dit is de modus voor het openen van bestanden: "wm" - exclusief (lezen/schrijven), "rs" - alleen-lezen en alleen gedeeld voor lezen door andere clients, "ws" - lezen/schrijven en alleen gedeeld voor lezen door andere klanten.

Kooi.dichtbij (fkanaal) – sluit het bestand

Kooi.schrijven (fchannel, begin, gegevens ) – schrijf een bytestring naar een bestand

Kooi.dit artikel lezen (fchannel, begin, len_data ) – lees een bytereeks uit een bestand

Kooi.zet_pagina's ( fkanaal ) – “pusht” van de buffer naar de server alle pagina's van het opgegeven kanaal die zijn gewijzigd. Het wordt gebruikt op die punten in het algoritme waarop u er zeker van moet zijn dat alle bewerkingen op het kanaal fysiek worden opgeslagen in een bestand op de server.

Kooi.push_all () – “pusht” van de buffer naar de server alle pagina's van alle kanalen voor een exemplaar van de klasse Cage die zijn gewijzigd. Wordt gebruikt wanneer u er zeker van wilt zijn dat alle bewerkingen op alle kanalen op de server worden opgeslagen.

Bron: www.habr.com

Voeg een reactie