Zweck des Systems
UnterstĂŒtzung des Remote-Zugriffs auf Dateien auf Computern im Netzwerk. Das System unterstĂŒtzt âvirtuellâ alle wichtigen Dateioperationen (Erstellung, Löschung, Lesen, Schreiben usw.) durch den Austausch von Transaktionen (Nachrichten) ĂŒber das TCP-Protokoll.
Anwendungsbereiche
Die FunktionalitÀt des Systems ist in folgenden FÀllen effektiv:
- in nativen Anwendungen fĂŒr mobile und eingebettete GerĂ€te (Smartphones, Bordsteuerungssysteme usw.), die schnellen Zugriff auf Dateien auf entfernten Servern erfordern, insbesondere unter Bedingungen, die vorĂŒbergehende Unterbrechungen der Verbindung (Offline-Nutzung) nach sich ziehen;
- in stark belasteten DBMS, wenn die Verarbeitung von Anfragen auf einem Server erfolgt, wÀhrend die Datenspeicherung auf einem anderen stattfindet;
- in verteilten Unternehmensnetzwerken zur Erfassung und Verarbeitung von Informationen, die eine hohe Datenaustauschgeschwindigkeit, Redundanz und ZuverlÀssigkeit erfordern;
- in komplexen Systemen mit Mikrodiensten, wo Verzögerungen im Austausch von Informationen zwischen Modulen von entscheidender Bedeutung sind.
Struktur
Das Cage-System (eine Implementierung â Beta-Version auf Python 3.7 unter Windows) umfasst zwei Hauptteile:
- Cageserver â ein Programm fĂŒr Datei-Server (Funktionspaket), das auf Computern im Netzwerk ausgefĂŒhrt wird, auf deren Dateien ein Remote-Zugriff erforderlich ist;
- Klasse Cage mit einer Bibliothek von Methoden fĂŒr Client-Software, die die Kodierung der Interaktion mit Servern vereinfacht.
Verwendung des Systems auf der Client-Seite
Die Methoden der Klasse Cage ersetzen die gewöhnlichen, âroutinehaftenâ Operationen des Dateisystems: Erstellung, Ăffnen, SchlieĂen, Löschen von Dateien sowie lesen/schreiben von Daten im binĂ€ren Format (unter Angabe der Position und GröĂe der Daten). Konzeptuell sind diese Methoden den Datei-Funktionen der Programmiersprache C Ă€hnlich, wo das Ăffnen/SchlieĂen von Dateien âĂŒber KanĂ€leâ fĂŒr Ein- und Ausgabe erfolgt.
Mit anderen Worten, der Programmierer arbeitet nicht mit den Methoden von âDateiâ-Objekten (Klasse _io in Python), sondern mit den Methoden der Klasse Cage.
Bei der Erstellung einer Instanz des Objekts Cage wird eine initiale Verbindung zum Server (oder mehreren Servern) hergestellt, die Autorisierung mittels Client-ID durchgefĂŒhrt und eine BestĂ€tigung mit der Nummer des reservierten Ports fĂŒr alle Dateioperationen empfangen. Beim Löschen des Cage-Objekts gibt es dem Server den Befehl, die Verbindung zu beenden und die Dateien zu schlieĂen. Die Beendigung der Verbindung kann auch von den Servern selbst initiiert werden.
Das System erhöht die Lese-/Schreibgeschwindigkeit durch das Caching hÀufig verwendeter Dateiabschnitte in den Client-Programmen im Arbeitsspeicher (Puffer).
Die Client-Software kann beliebig viele Cage-Objekte mit unterschiedlichen Einstellungen (Speichervolumen, BlockgröĂe beim Austausch mit dem Server usw.) verwenden.
Ein Cage-Objekt kann Daten mit mehreren Dateien auf mehreren Servern austauschen. Die Parameter fĂŒr die Verbindung (IP-Adresse oder DNS-Server, Hauptport fĂŒr die Autorisierung, Pfad und Dateiname) werden bei der Erstellung des Objekts festgelegt.
Da jedes Cage-Objekt gleichzeitig mit mehreren Dateien arbeiten kann, wird dafĂŒr ein gemeinsamer Speicherbereich fĂŒr das Caching verwendet. Die GröĂe des Caches â die Anzahl der Seiten und deren GröĂe â wird dynamisch bei der Erstellung des Cage-Objekts festgelegt. Zum Beispiel ist ein 1 GB Cache 1000 Seiten zu 1 MB, oder 10.000 Seiten zu 100 KB, oder 1 Million Seiten zu 1 KB. Die Auswahl der GröĂe und Anzahl der Seiten ist eine spezifische Aufgabe fĂŒr jeden Anwendungsfall.
Es können mehrere Cage-Objekte gleichzeitig verwendet werden, um unterschiedliche Pufferungseinstellungen je nach Zugriffsmerkmalen auf Informationen in verschiedenen Dateien festzulegen. Als Basis wird ein einfachster Pufferungsalgorithmus verwendet: Nach Erschöpfung des festgelegten Speichervolumens verdrĂ€ngen neue Seiten die alten nach dem Prinzip der minimalen Zugriffsanzahl. Die Pufferung ist besonders effektiv bei ungleichmĂ€Ăigem (statistisch gesehen) gleichzeitigen Zugriff, erstens auf verschiedene Dateien und zweitens auf Abschnitte jeder Datei.
Die Klasse Cage unterstĂŒtzt Ein- und Ausgabe nicht nur anhand von Datenadressen (mit Angabe der Position und LĂ€nge des Arrays, wodurch sie die Dateioperationssysteme "ersetzt"), sondern auch auf einer niedrigeren, "physikalischen" Ebene â anhand von Seitennummern im Arbeitsspeicher.
FĂŒr Cage-Objekte wird die originale Funktion unterstĂŒtzt "Hibernate" (âSchlafâ) â sie können âzusammengefasstâ werden (zum Beispiel im Falle eines Verbindungsabbruchs zu den Servern oder beim Stoppen der Anwendung usw.) in eine lokale Dump-Datei auf der Client-Seite und schnell aus dieser Datei wiederhergestellt werden (nach Wiederherstellung der Verbindung, beim erneuten Start der Anwendung). Dies ermöglicht eine erhebliche Reduzierung des Datenverkehrs, wenn das Client-Programm nach einer temporĂ€ren âOfflineâ-Phase wieder aktiviert wird, da hĂ€ufig verwendete Dateifragemente bereits im Cache vorhanden sein werden.
Cage ist ungefÀhr 3600 Zeilen Code.
Prinzipien des Serveraufbaus
Cageserver-Dateiserver können mit einer beliebigen Anzahl von Ports gestartet werden, von denen einer (âhauptsĂ€chlichâ) nur fĂŒr die Authentifizierung aller Clients verwendet wird, wĂ€hrend die anderen fĂŒr den Datenaustausch dienen. Die Cage-Serveranwendung benötigt nur Python. Gleichzeitig kann der Computer mit dem Datei-Server jede andere Arbeit ausfĂŒhren.
Der Server wird zunÀchst als Kombination aus zwei Hauptprozessen gestartet:
- âVerbindungenâ â ein Prozess zur DurchfĂŒhrung von Verbindungsherstellungen mit Clients und deren Beendigung auf Initiative des Servers;
- âOperationenâ â ein Prozess zur DurchfĂŒhrung von AuftrĂ€gen (Operationen) der Clients im Umgang mit Dateien sowie zum SchlieĂen von Verbindungssitzungen auf Anweisung der Clients.
Beide Prozesse sind nicht synchronisiert und organisiert als endlose Schleifen zum Empfang und Versand von Nachrichten auf Basis multiprozessualer Warteschlangen, Proxy-Objekten, Sperren und Sockets.
Der Prozess âVerbindungenâ weist jedem Client einen Port fĂŒr den Datenempfang und -versand zu. Die Anzahl der Ports wird beim Starten des Servers festgelegt. Die Zuordnung zwischen Ports und Clients wird im zwischen den Prozessen geteilten Proxy-Speicher gespeichert.
Der Prozess âOperationenâ unterstĂŒtzt die Teilung der Dateiresourcen, wobei mehrere verschiedene Clients gleichzeitig (quasi-parallel, da der Zugriff ĂŒber Sperren gesteuert wird) Daten aus einer Datei lesen können, sofern dies beim anfĂ€nglichen Ăffnen durch den âerstenâ Client genehmigt wurde.
Die Verarbeitung von Befehlen zum Erstellen/Löschen/Ăffnen/SchlieĂen von Dateien Server erfolgt im Prozess âOperationenâ streng sequenziell unter Verwendung des Dateisystems des Server-Betriebssystems.
Um die allgemeine Geschwindigkeit von Lese-/SchreibvorgĂ€ngen zu erhöhen, werden diese Operationen in Threads durchgefĂŒhrt, die vom Prozess âOperationenâ erzeugt werden. Die Anzahl der Threads entspricht in der Regel der Anzahl der geöffneten Dateien. Lese-/SchreibauftrĂ€ge von Kunden werden in eine gemeinsame Warteschlange eingereicht, und der erste verfĂŒgbare Thread nimmt den Auftrag vom Kopf der Warteschlange an. Eine spezielle Logik ermöglicht es, DatenĂŒberschreibungen im Arbeitsspeicher des Servers auszuschlieĂen.
Der Prozess âOperationenâ ĂŒberwacht die AktivitĂ€t der Kunden und stellt deren Bedienung sowohl auf deren Anforderung als auch bei Ăberschreitung des Zeitlimits fĂŒr InaktivitĂ€t ein.
Um die ZuverlĂ€ssigkeit sicherzustellen, fĂŒhrt Cageserver Protokolle ĂŒber alle Transaktionen. Ein allgemeines Protokoll enthĂ€lt Kopien der Nachrichten von Kunden mit AuftrĂ€gen zum Erstellen, Ăffnen, Umbenennen und Löschen von Dateien. FĂŒr jede Arbeitsdatei wird ein separates Protokoll erstellt, in dem Kopien von Nachrichten mit AuftrĂ€gen zum Lesen und Schreiben von Daten in dieser Arbeitsdatei sowie Arrays der geschriebenen (neuen) Daten und Arrays von Daten, die beim Ăberschreiben (Speichern neuer Daten âĂŒberâ alten) gelöscht wurden, aufgezeichnet werden.
Diese Protokolle ermöglichen sowohl die Wiederherstellung neuer Ănderungen aus Sicherungskopien als auch das âRollbackâ des aktuellen Inhalts zu einem gewĂŒnschten Zeitpunkt in der Vergangenheit.
Cageserver besteht aus etwa 3100 Zeilen Code.

Starten des Datei-Servers Cageserver
Beim Starten im Dialog muss Folgendes festgelegt werden:
â der Hauptport fĂŒr die Autorisierung;
â die Anzahl der Ports fĂŒr den Austausch von Transaktionen mit autorisierten Kunden (ab mindestens einem, der Pool von Nummern beginnt mit der Nummer nach dem Hauptport).
Verwendung der Klasse Cage
class cage.Cage( cage_name=», pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file=»» )
Aus dieser Klasse werden Objekte erstellt, die die Interaktion mit Datei-Servern ermöglichen und ĂŒber Pufferspeicher verfĂŒgen.
Parameter
- cage_name(str) â der bedingte Name des Objekts, der bei der Identifizierung von Kunden auf der Serverseite verwendet wird
- pagesize(int) â die GröĂe einer Seite im Pufferspeicher (in Bytes)
- numpages(int) â die Anzahl der Seiten im Pufferspeicher
- maxstrlen(int) â die maximale LĂ€nge der Byte-Zeichenfolge bei Lese- und Schreiboperationen
- server_ip(dict) â ein Wörterbuch mit den verwendeten Adressen Server, wo der SchlĂŒssel der bedingte Name des Servers (Server-ID innerhalb der Anwendung) ist und der Wert eine Zeichenfolge mit der Adresse ist: âip-Adresse:portâ oder âDNS:portâ (die Zuordnung von Namen und realen Adressen ist vorĂŒbergehend und kann geĂ€ndert werden)
- warte(int) â die Wartezeit auf eine Antwort vom Server beim Empfang der Ports (in Sek.)
- wach(boolean) â das Flag fĂŒr die Art und Weise, wie das Objekt erstellt wird (Falsch â wenn ein neues Objekt erstellt wird, Wahr â wenn das Objekt aus einem zuvor «reduzierten» Zustand erstellt wird â durch Anwendung der Operation «Hibernation», standardmĂ€Ăig Falsch)
- cache_file(str) â der Name der Datei fĂŒr die Hibernation
Methoden
Cage.file_create( server, pfad ) â eine neue Datei erstellen
Cage.file_rename( server, pfad, neuer_name ) â die Datei umbenennen
Cage.file_remove( server, pfad) â die Datei löschen
Cage.öffnen( server, pfad, mod ) â die Datei öffnen
Gibt zurĂŒck fchannel die Kanalnummer. Der Parameter mod â ist der Modus zum Ăffnen der Datei: âwmâ â monopol (lesen/schreiben), ârsâ â nur lesen, und von anderen Clients nur zum Lesen freigegeben, âwsâ â lesen/schreiben, und von anderen Clients nur zum Lesen freigegeben.
Cage.schlieĂen (fchannel) â die Datei schlieĂen
Cage.schreiben (fchannel, beginn, daten ) â eine Byte-Zeichenfolge in die Datei schreiben
Cage.lesen (fchannel, beginn, len_daten ) â eine Byte-Zeichenfolge aus der Datei lesen
Cage.put_pages ( fchannel ) â âschiebtâ alle modifizierten Seiten des angegebenen Kanals aus dem Puffer auf den Server. Wird an den Stellen des Algorithmus verwendet, an denen sichergestellt werden muss, dass alle VorgĂ€nge auf dem Kanal physisch in der Datei auf dem Server gespeichert sind.
Cage.push_all () â âschiebtâ alle modifizierten Seiten aller KanĂ€le fĂŒr die Instanz der Klasse Cage aus dem Puffer auf den Server. Wird verwendet, wenn sichergestellt werden muss, dass alle VorgĂ€nge auf allen KanĂ€len auf dem Server gespeichert sind.
Quelle: habr.com
