Cage-Remote-Dateizugriffssystem

Zweck des Systems

Unterstützung für den Fernzugriff auf Dateien auf Computern im Netzwerk. Das System unterstützt „virtuell“ alle grundlegenden Dateioperationen (Erstellen, Löschen, Lesen, Schreiben usw.) durch den Austausch von Transaktionen (Nachrichten) über das TCP-Protokoll.

Anwendungen

Die Funktionalität des Systems ist in folgenden Fällen wirksam:

  • in nativen Anwendungen für mobile und eingebettete Geräte (Smartphones, Bordsteuerungssysteme usw.), die im Falle wahrscheinlicher vorübergehender Kommunikationsunterbrechungen (mit Offline-Schaltung) einen schnellen Zugriff auf Dateien auf Remote-Servern erfordern;
  • in geladenen DBMS, wenn Anfragen auf einigen Servern verarbeitet werden und Daten auf anderen gespeichert werden;
  • in verteilten Unternehmensnetzwerken zum Sammeln und Verarbeiten von Informationen, die einen schnellen Datenaustausch, Redundanz und Zuverlässigkeit erfordern;
  • in komplexen Systemen mit einer Microservice-Architektur, bei denen Verzögerungen beim Informationsaustausch zwischen Modulen kritisch sind.

Struktur

Das Cage-System (es gibt eine Implementierung – eine Beta-Version in Python 3.7 unter Windows) besteht aus zwei Hauptteilen:

  1. Käfigserver - ein Dateiserverprogramm (Funktionspaket), das auf Computern im Netzwerk läuft, deren Dateien Fernzugriff benötigen;
  2. Klasse Käfig mit einer Methodenbibliothek für Client-Software, die die Codierung der Interaktion mit Servern vereinfacht.

Nutzung des Systems auf der Clientseite

Die Methoden der Cage-Klasse ersetzen die üblichen, „routinemäßigen“ Dateisystemoperationen: erstellen, öffnen, schließen, löschen Dateien und auch Daten im Binärformat lesen/schreiben (Angabe der Position und Größe der Daten). Vom Konzept her ähneln diese Methoden den Dateifunktionen der C-Sprache, bei denen das Öffnen/Schließen von Dateien „auf E/A-Kanälen“ erfolgt.

Mit anderen Worten: Der Programmierer arbeitet nicht mit den Methoden von „Datei“-Objekten (Klasse _io in Python), jedoch mit den Methoden der Cage-Klasse.

Wenn eine Instanz eines Cage-Objekts erstellt wird, stellt es eine erste Verbindung mit dem Server (oder mehreren Servern) her, übergibt die Autorisierung anhand der ID des Clients und erhält eine Bestätigung mit der Nummer des zugewiesenen Ports für die Ausführung aller Dateioperationen. Wenn ein Cage-Objekt gelöscht wird, gibt es einen Befehl an den Server aus, die Verbindung zu beenden und die Dateien zu schließen. Der Abbruch der Kommunikation kann durch die Server selbst veranlasst werden.

Das System verbessert die Lese-/Schreibleistung, indem es häufig verwendete Dateifragmente für Client-Programme im RAM-Cache (Puffer) zwischenspeichert.
Client-Software kann beliebig viele Cage-Objekte mit unterschiedlichen Einstellungen (Pufferspeichergröße, Blockgröße beim Austausch mit dem Server usw.) verwenden.

Ein Cage-Objekt kann mit mehreren Dateien auf mehreren Servern kommunizieren. Parameter für die Kommunikation (IP-Adresse bzw. DNS-Server, Hauptport für Autorisierung, Pfad und Dateiname) werden beim Anlegen eines Objekts festgelegt.

Da jedes Cage-Objekt auf mehrere Dateien gleichzeitig zugreifen kann, wird zur Pufferung ein gemeinsamer Speicherbereich genutzt. Cache-Größe – die Anzahl der Seiten und deren Größe, wird dynamisch festgelegt, wenn das Cage-Objekt erstellt wird. Ein Cache von 1 GB entspricht beispielsweise 1000 Seiten à 1 MB oder 10 Seiten à 100 KB oder 1 Million Seiten à 1 KB. Die Auswahl der Größe und Anzahl der Seiten ist für jede Anwendung eine spezifische Aufgabe.

Sie können mehrere Cage-Objekte gleichzeitig verwenden, um unterschiedliche Pufferspeichereinstellungen zu definieren, je nachdem, wie auf Informationen in verschiedenen Dateien zugegriffen wird. Als Basis dient der einfachste Pufferalgorithmus: Nachdem die angegebene Speichermenge erschöpft ist, verdrängen neue Seiten die alten nach dem Prinzip der Eliminierung mit einer minimalen Anzahl von Zugriffen. Die Pufferung ist besonders effektiv bei ungleichmäßiger (im statistischen Sinne) Verteilung, erstens auf verschiedene Dateien und zweitens auf Fragmente jeder Datei.

Die Cage-Klasse unterstützt die Eingabe/Ausgabe nicht nur anhand von Datenadressen (die die Position und Länge des Arrays angeben und Dateisystemoperationen „ersetzen“), sondern auch auf einer niedrigeren, „physischen“ Ebene – anhand von Seitenzahlen im Pufferspeicher.

Die ursprüngliche Funktion wird für Cage-Objekte unterstützt "Winterschlaf" („sleep“) – sie können (z. B. im Falle einer Verbindungsunterbrechung mit Servern oder wenn die Anwendung stoppt usw.) in eine lokale Dump-Datei auf der Client-Seite „komprimiert“ werden und aus dieser Datei (nach der Wiederaufnahme) schnell wiederhergestellt werden Verbindung, beim Neustart der Anwendung). Dadurch ist es möglich, den Datenverkehr bei der Aktivierung des Client-Programms nach einem vorübergehenden Offline-Zustand deutlich zu reduzieren, da sich häufig verwendete Dateifragmente bereits im Cache befinden.

Cage umfasst etwa 3600 Codezeilen.

Prinzipien zum Aufbau von Servern

Cageserver-Dateiserver können mit beliebig vielen Ports betrieben werden, von denen einer („Main“) nur zur Autorisierung aller Clients, der Rest zum Datenaustausch dient. Das Cage-Serverprogramm erfordert nur Python. Parallel dazu kann ein Computer mit einem Dateiserver jede andere Arbeit ausführen.

Der Server startet zunächst als Kombination aus zwei Hauptprozessen:

  1. „Verbindungen“ – ein Prozess zur Durchführung serverinitiierter Client-Handshake- und Client-Handoff-Operationen;
  2. „Operationen“ – ein Prozess zum Ausführen von Aufgaben (Operationen) von Clients für die Arbeit mit Dateien sowie zum Schließen von Kommunikationssitzungen auf Befehl von Clients.

Beide Prozesse sind nicht synchronisiert und als endlose Zyklen des Empfangens und Sendens von Nachrichten basierend auf Multiprozess-Warteschlangen, Proxy-Objekten, Sperren und Sockets organisiert.
Der Prozess „Verbindungen“ weist jedem Client einen Port zum Empfangen und Senden von Daten zu. Die Anzahl der Ports wird beim Start des Servers festgelegt. Die Korrespondenz zwischen Ports und Clients wird im Proxy-Speicher gespeichert, der von Prozessen gemeinsam genutzt wird.

Der Operations-Prozess unterstützt die gemeinsame Nutzung von Dateiressourcen, wobei mehrere verschiedene Clients diese gemeinsam nutzen können (quasiparallel, da der Zugriff durch Sperren gesteuert wird), um Daten aus einer Datei zu lesen, wenn dies beim ersten Öffnen durch den „ersten“ Client erlaubt war.

Die Verarbeitung von Befehlen zum Erstellen/Löschen/Öffnen/Schließen von Dateien auf dem Server erfolgt im Prozess „Operationen“ selbst streng sequentiell unter Verwendung des Dateisubsystems des Betriebssystems des Servers.

Zur allgemeinen Lese-/Schreibbeschleunigung werden diese Vorgänge in Threads ausgeführt, die vom Operations-Prozess generiert werden. Die Anzahl der Threads entspricht normalerweise der Anzahl der geöffneten Dateien. Lese-/Schreibaufgaben von Clients werden an eine gemeinsame Warteschlange gesendet, und der erste freie Thread übernimmt die Aufgabe von seinem Kopf. Mit einer speziellen Logik können Sie das Überschreiben von Daten im RAM des Servers ausschließen.

Der „Operations“-Prozess überwacht die Aktivität von Clients und beendet ihren Dienst sowohl auf deren Befehl hin als auch bei Überschreitung des Inaktivitäts-Timeouts.

Um die Zuverlässigkeit zu gewährleisten, führt Cageserver Protokolle aller Transaktionen. Ein allgemeines Journal enthält Kopien von Nachrichten von Kunden mit Aufgaben zum Erstellen/Öffnen/Umbenennen/Löschen von Dateien. Für jede Arbeitsdatei wird ein separates Protokoll erstellt, das Kopien von Nachrichten mit Aufgaben zum Lesen und Schreiben von Daten in dieser Arbeitsdatei sowie Arrays von (neuen) Daten, die geschrieben werden, und Datenarrays, die beim Überschreiben (Schreiben neuer Daten) zerstört wurden, aufzeichnet „über“ die alten). ).

Diese Protokolle bieten die Möglichkeit, sowohl neue Änderungen an Backups wiederherzustellen als auch vom aktuellen Inhalt auf einen Zeitpunkt in der Vergangenheit zurückzusetzen.

Cageserver umfasst etwa 3100 Codezeilen.

Cage-Remote-Dateizugriffssystem

Starten des Cageserver-Dateiserverprogramms

Beim Starten im Dialog müssen Sie Folgendes definieren:
- der Haupthafen für die Autorisierung;
— die Anzahl der Ports für den Austausch von Transaktionen mit autorisierten Kunden (ab 1 oder mehr beginnt der Nummernpool beim Hauptport, gefolgt von der Nummer).

Verwendung der Cage-Klasse

Klasse Käfig.Käfig( Cage_name="", Seitengröße=0, Anzahl Seiten=0, Maxstrlen=0, Server_IP={}, Wait=0, Wake=False, Cache_file="" )

Aus dieser Klasse werden Objekte erstellt, die mit Dateiservern interagieren und Pufferspeicher enthalten.

Parameter

  • Käfigname(str) ist ein bedingter Objektname, der zur Identifizierung von Clients auf der Serverseite verwendet wird
  • Seitengröße(int) – Größe einer Seite Pufferspeicher (in Bytes)
  • Anzahl Seiten(int) ist die Anzahl der Pufferspeicherseiten
  • maxstrlen(int) – maximale Länge einer Bytefolge bei Schreib- und Lesevorgängen
  • server_ip(diktieren) ist ein Wörterbuch mit den Adressen der verwendeten Server, wobei der Schlüssel der bedingte Name des Servers (Server-ID innerhalb der Anwendung) und der Wert die Zeichenfolge mit der Adresse ist: „IP-Adresse:Port“ oder „DNS: Port“ (der Vergleich von Namen und echten Adressen ist temporär, er kann geändert werden)
  • warten(int) – Wartezeit auf eine Antwort vom Server beim Empfang von Ports (in Sek.)
  • wach(boolean) – Flag der Objekterstellungsmethode (falsch - wenn ein neues Objekt erstellt wird, Wahre - wenn das Objekt aus dem zuvor „kollabierten“ Objekt erstellt wird – unter Verwendung der „Ruhezustand“-Operation, standardmäßig „Falsch“
  • Cache_Datei(str) – Dateiname für den Ruhezustand

Methoden

Käfig.file_create( Server, Pfad ) – eine neue Datei erstellen

Käfig.Datei_umbenennen( Server, Pfad, neuer_Name ) – Benennen Sie die Datei um

Käfig.file_remove( Server, Pfad) – eine Datei löschen

Käfig.XNUMXh geöffnet( Server, Pfad, Mod ) - Datei öffnen

Rückgabe fchannel Kanal Nummer. Parameter mod – Dies ist der Dateiöffnungsmodus: „wm“ – exklusiv (Lesen/Schreiben), „rs“ – schreibgeschützt und nur zum Lesen durch andere Clients freigegeben, „ws“ – lesen/schreiben und nur zum Lesen durch andere freigegeben Kunden.

Käfig.schließen (fchannel) - Schließen Sie die Datei

Käfig.schreiben (fchannel, begin, data ) – schreibt eine Bytefolge in eine Datei

Käfig.lesen (fchannel, begin, len_data ) – liest eine Bytefolge aus einer Datei

Käfig.put_pages ( fchannel ) – „schiebt“ alle Seiten des angegebenen Kanals, die geändert wurden, aus dem Puffer an den Server. Es wird an den Stellen im Algorithmus verwendet, an denen sichergestellt werden muss, dass alle Vorgänge auf dem Kanal physisch in einer Datei auf dem Server gespeichert werden.

Käfig.push_all () – „schiebt“ alle Seiten aller Kanäle für eine Instanz der Cage-Klasse, die geändert wurden, aus dem Puffer an den Server. Es wird verwendet, wenn sichergestellt werden muss, dass alle Vorgänge auf allen Kanälen auf dem Server gespeichert werden.

Source: habr.com

Kommentar hinzufügen