Systemzweck
Unterstützung für den Remotezugriff auf Dateien auf Computern im Netzwerk. Das System unterstützt „virtuell“ alle grundlegenden Dateivorgänge (Erstellen, Löschen, Lesen, Schreiben usw.), indem Transaktionen (Nachrichten) mithilfe des TCP-Protokolls ausgetauscht werden.
Anwendungsbereiche
Die Funktionalität des Systems ist in folgenden Fällen wirksam:
- in nativen Anwendungen für mobile und eingebettete Geräte (Smartphones, integrierte Steuerungssysteme usw.), die unter den Bedingungen wahrscheinlicher vorübergehender Verbindungsunterbrechungen (mit dem Offline-Betrieb) einen schnellen Zugriff auf Dateien auf Remote-Servern erfordern;
- in geladenen DBMS, wenn Anforderungen auf einigen Servern und Datenspeicher auf anderen verarbeitet werden;
- in verteilten Unternehmensnetzwerken zur Erfassung und Verarbeitung von Informationen, die einen schnellen Datenaustausch, Redundanz und Zuverlässigkeit erfordern;
- in komplexen Systemen mit Microservice-Architektur, in denen Verzögerungen beim Informationsaustausch zwischen Modulen kritisch sind.
Struktur
Das Cage-System (es gibt eine Implementierung - Beta-Version unter Python 3.7 unter Windows) besteht aus zwei Hauptteilen:
- Cageserver - ein Dateiserverprogramm (Funktionspaket), das auf Computern im Netzwerk ausgeführt wird, die Remotezugriff auf Dateien benötigen.
- Cage- Klasse mit einer Methodenbibliothek für Client-Software, die die Codierung von Serverinteraktionen vereinfacht.
Verwenden des Systems auf der Clientseite
Die Methoden der Cage-Klasse ersetzen die üblichen "routinemäßigen" Dateisystemoperationen: Erstellen, Öffnen, Schließen, Löschen von Dateien sowie Lesen / Schreiben von Daten im Binärformat (Angabe der Position und Größe der Daten). Konzeptionell liegen diese Methoden in der Nähe der Dateifunktionen der Sprache C, bei denen das Öffnen / Schließen von Dateien "auf den Kanälen" der Eingabe / Ausgabe erfolgt.
Mit anderen Worten, der Programmierer arbeitet nicht mit Methoden von "Datei" -Objekten (Klasse _io in Python), sondern mit Methoden der Cage-Klasse.
Beim Erstellen einer Instanz des Cage-Objekts wird die anfängliche Verbindung mit dem Server (oder mehreren Servern) hergestellt, die Autorisierung anhand der Client-ID übergeben und eine Bestätigung mit der dedizierten Portnummer für alle Dateivorgänge erhalten. Wenn ein Cage-Objekt gelöscht wird, weist es den Server an, die Verbindung zu beenden und die Dateien zu schließen. Die Beendigung der Kommunikation kann die Server selbst initiieren.
Das System verbessert die Lese- / Schreibleistung basierend auf dem Puffern häufig verwendeter Dateifragmente von Client-Programmen im Cache (Puffer) des RAM.
Die Client-Software kann eine beliebige Anzahl von Cage-Objekten mit verschiedenen Einstellungen verwenden (Größe des Pufferspeichers, Größe der Blöcke beim Austausch mit dem Server usw.).
Ein einzelnes Cage-Objekt kann Daten mit mehreren Dateien auf mehreren Servern austauschen. Kommunikationsparameter (IP-Adresse oder DNS-Server, Hauptport für die Autorisierung, Pfad und Dateiname) werden beim Erstellen des Objekts festgelegt.
Da jedes Cage-Objekt mit mehreren Dateien gleichzeitig arbeiten kann, wird der gemeinsam genutzte Speicherplatz zum Puffern verwendet. Cache-Größe - Die Anzahl der Seiten und ihre Größe werden beim Erstellen eines Cage-Objekts dynamisch festgelegt. Ein 1-GB-Cache umfasst beispielsweise 1.000 Seiten mit jeweils 1 MB oder 10.000 Seiten mit jeweils 100 KB oder 1 Million Seiten mit jeweils 1 KB. Die Auswahl der Seitengröße und der Anzahl der Seiten ist eine spezifische Aufgabe für jede Anwendung.
Sie können mehrere Cage-Objekte gleichzeitig verwenden, um je nach den Funktionen für den Zugriff auf Informationen in verschiedenen Dateien unterschiedliche Pufferspeichereinstellungen zu definieren. Grundsätzlich wird der einfachste Pufferalgorithmus verwendet: Nachdem die angegebene Speichermenge erschöpft ist, verdrängen neue Seiten die alten Seiten nach dem Prinzip des Ruhestands mit einer minimalen Anzahl von Treffern. Das Puffern ist besonders effektiv bei ungleichmäßiger (im statistischen Sinne) Freigabe, zum einen für verschiedene Dateien und zum anderen für Fragmente jeder Datei.
Die Cage-Klasse unterstützt die Eingabe / Ausgabe nicht nur an Datenadressen (Angabe der Position und Länge des Arrays, "Ersetzen" von Dateisystemoperationen), sondern auch auf einer niedrigeren "physischen" Ebene - nach Seitenzahlen im Pufferspeicher.
Für Cage-Objekte wird die ursprüngliche Funktion "Ruhezustand" ("Ruhezustand") unterstützt. Sie können "minimiert" werden (z. B. bei Trennung vom Server oder beim Stoppen der Anwendung usw.) und schnell in eine lokale Speicherauszugsdatei auf der Clientseite Wiederherstellung aus dieser Datei (nach Wiederaufnahme der Kommunikation, wenn Sie die Anwendung neu starten). Dies ermöglicht es, den Datenverkehr beim Aktivieren des Client-Programms nach einem vorübergehenden "Offline" -Verfahren erheblich zu reduzieren, da sich häufig verwendete Dateifragmente bereits im Cache befinden.
Cage besteht aus ca. 3.600 Codezeilen.
Prinzipien zum Erstellen von Servern
Cageserver-Dateiserver können mit einer beliebigen Anzahl von Ports gestartet werden, von denen einer (der „Haupt“) nur zur Autorisierung aller Clients verwendet wird, der Rest für den Datenaustausch. Das Cage-Serverprogramm benötigt nur Python. Parallel dazu kann ein Computer mit einem Dateiserver jede andere Arbeit ausführen.
Der Server startet zunächst als Kombination von zwei Hauptprozessen:
- "Verbindungen" - ein Prozess zum Ausführen von Vorgängen zum Herstellen der Kommunikation mit Clients und deren Beendigung auf Initiative des Servers;
- "Operationen" - ein Prozess zum Ausführen von Aufgaben (Operationen) von Clients beim Arbeiten mit Dateien sowie zum Schließen von Kommunikationssitzungen mit Clientbefehlen.
Beide Prozesse sind nicht synchronisiert und als endlose Zyklen des Empfangens und Sendens von Nachrichten basierend auf Multiprozesswarteschlangen, Proxyobjekten, Sperren und Sockets organisiert.
Der Prozess „Verbindungen“ bietet jedem Client einen Port zum Empfangen und Senden von Daten. Die Anzahl der Ports wird beim Start des Servers festgelegt. Die Korrespondenz zwischen Ports und Clients wird in einem Proxy-Speicher gespeichert, der von Prozessen gemeinsam genutzt wird.
Der Operations-Prozess unterstützt die Trennung von Dateiressourcen, und mehrere verschiedene Clients können Daten aus einer Datei zusammen lesen ( quasi parallel , da der Zugriff durch Sperren gesteuert wird), wenn dies beim ersten Öffnen durch den "ersten" Client zulässig war.
Die Verarbeitung von Befehlen zum Erstellen / Löschen / Öffnen / Schließen von Dateien auf dem Server erfolgt im "Operations" -Prozess streng sequentiell unter Verwendung des Dateisubsystems des Server-Betriebssystems.
Für die allgemeine Lese- / Schreibbeschleunigung werden diese Operationen in Threads ausgeführt, die durch den Prozess "Operationen" erzeugt werden. Die Anzahl der Threads entspricht normalerweise der Anzahl der geöffneten Dateien. Lese- / Schreibaufgaben von Clients werden an die allgemeine Warteschlange gesendet, und der erste freigegebene Thread nimmt die Aufgabe aus ihrem Kopf. Spezielle Logik verhindert das Überschreiben von Daten im RAM des Servers.
Der "Operations" -Prozess überwacht die Aktivität von Kunden und stoppt deren Service sowohl durch ihre Befehle als auch wenn das Inaktivitätszeitlimit überschritten wird.
Um die Zuverlässigkeit zu gewährleisten, protokolliert Cageserver alle Transaktionen. Ein allgemeines Journal enthält Kopien von Nachrichten von Clients mit Aufgaben zum Erstellen / Öffnen / Umbenennen / Löschen von Dateien. Für jede Arbeitsdatei wird ein separates Protokoll erstellt, in das Kopien von Nachrichten mit Aufgaben zum Lesen und Schreiben von Daten in dieser Arbeitsdatei sowie Arrays aufgezeichneter (neuer) Daten und Arrays von Daten geschrieben werden, die beim Überschreiben zerstört wurden (Schreiben neuer Daten "über" alte) )
Diese Protokolle bieten die Möglichkeit, neue Änderungen in Sicherungen wiederherzustellen und vom aktuellen Inhalt auf den richtigen Zeitpunkt in der Vergangenheit zurückzusetzen.
Cageserver besteht aus ca. 3.100 Codezeilen.

Starten des Cageserver-Dateiserverprogramms
Wenn Sie im Dialogfeld starten, müssen Sie Folgendes festlegen:
- Haupthafen für die Genehmigung;
- Die Anzahl der Ports für den Austausch von Transaktionen mit autorisierten Clients (ab 1 oder mehr beginnt der Nummernpool mit dem nächsten nach der Nummer des Hauptports).
Verwenden der Käfigklasse
Klassenkäfig . Cage ( cage_name = "", pagesize = 0, numpages = 0, maxstrlen = 0, server_ip = {}, wait = 0, awake = False, cache_file = "" )
Aus dieser Klasse werden Objekte erstellt, die mit Dateiservern interagieren und Pufferspeicher enthalten.
Parameter
- cage_name ( str ) - Der bedingte Name des Objekts, mit dem Clients auf der Serverseite identifiziert werden
- Seitengröße ( int ) - Größe einer Seite des Pufferspeichers (in Bytes)
- numpages ( int ) - Anzahl der Seiten des Pufferspeichers
- maxstrlen ( int ) - maximale Byte-String-Länge bei Schreib- und Leseoperationen
- server_ip ( dict ) - Ein Wörterbuch mit den Adressen der verwendeten Server, wobei der Schlüssel der bedingte Name des Servers ist (Server-ID in der Anwendung) und der Wert eine Zeichenfolge mit der Adresse: "IP-Adresse: Port" oder "DNS: Port" (übereinstimmende Namen und echte Adressen sind temporär kann geändert werden)
- wait ( int ) - Wartezeit auf eine Antwort vom Server beim Empfang von Ports (in Sekunden)
- awake ( boolean ) - Flag der Methode zum Erstellen des Objekts ( False - wenn ein neues Objekt erstellt wird, True - wenn das Objekt aus einem zuvor "minimierten" Objekt erstellt wird - standardmäßig mit der Operation "Hibernation" False)
- cache_file ( str ) - Dateiname für den Ruhezustand
Methoden
Käfig. file_create ( Server, Pfad ) - erstellt eine neue Datei
Käfig. Dateiname ( Server, Pfad, neuer Name ) - Datei umbenennen
Käfig. file_remove ( Server, Pfad ) - Löscht die Datei
Käfig. open ( Server, Pfad, Mod ) - Datei öffnen
Gibt die Kanalkanalnummer zurück . Der Mod- Parameter ist der Dateiöffnungsmodus: "wm" ist exklusiv (Lesen / Schreiben), "rs" ist schreibgeschützt und wird nur von anderen Clients geteilt, ws wird gelesen / geschrieben und nur von anderen Clients geteilt.
Käfig. close ( fchannel ) - schließt die Datei
Käfig. write ( fchannel, begin, data ) - schreibt eine Byte-Zeichenfolge in eine Datei
Käfig. read ( fchannel, begin, len_data ) - Liest eine Byte-Zeichenfolge aus einer Datei
Käfig. put_pages ( fchannel ) - "schiebt" alle Seiten des angegebenen Kanals, die geändert wurden, vom Puffer zum Server. Es wird an den Stellen im Algorithmus verwendet, an denen Sie sicherstellen müssen, dass alle Vorgänge auf dem Kanal physisch in einer Datei auf dem Server gespeichert sind.
Käfig. push_all () - "schiebt" alle Seiten aller Kanäle für die Cage-Klasseninstanz, die geändert wurden, vom Puffer zum Server. Es wird verwendet, wenn Sie sicherstellen müssen, dass alle Vorgänge auf allen Kanälen auf dem Server gespeichert sind.