Das System fĂŒr den Remote-Dateizugriff Cage

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:

  1. Cageserver – ein Programm fĂŒr Datei-Server (Funktionspaket), das auf Computern im Netzwerk ausgefĂŒhrt wird, auf deren Dateien ein Remote-Zugriff erforderlich ist;
  2. 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:

  1. „Verbindungen“ – ein Prozess zur DurchfĂŒhrung von Verbindungsherstellungen mit Clients und deren Beendigung auf Initiative des Servers;
  2. „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.

Das System fĂŒr den Remote-Dateizugriff Cage

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

60GB SSD 8Gb DDR4