Systemzweck
UnterstĂŒtzung des Fernzugriffs auf Dateien auf Computern im Netzwerk. Das System unterstĂŒtzt "virtuell" alle gĂ€ngigen Dateioperationen (Erstellen, Löschen, 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 Embedded-GerĂ€te (Smartphones, Bordsteuerungssysteme usw.), die schnellen Zugriff auf Dateien auf entfernten Servern benötigen, auch wenn es zu kurzzeitigen Verbindungsunterbrechungen (Offline-Zeiten) kommen kann;
- in stark belasteten Datenbankmanagementsystemen, wenn die Anfragen auf einem Server bearbeitet und die Daten auf einem anderen gespeichert werden;
- in verteilten Unternehmensnetzwerken fĂŒr die Sammlung und Verarbeitung von Informationen, die eine hohe DatenĂŒbertragungsrate, Redundanz und ZuverlĂ€ssigkeit erfordern;
- in komplexen Systemen mit mikroserviceorientierter Architektur, in denen Verzögerungen beim Austausch von Informationen zwischen Modulen von entscheidender Bedeutung sind.
Struktur
Das Cage-System (eine Beta-Version ist fĂŒr Python 3.7 unter Windows verfĂŒgbar) umfasst zwei Hauptkomponenten:
- Cageserver â ein Programm zur Datei-Server-Verwaltung (Funktionspaket), das auf Computern im Netzwerk ausgefĂŒhrt wird, um den Remote-Zugriff auf Dateien zu ermöglichen;
- Klasse Cage mit einer Bibliothek von Methoden fĂŒr Client-Software, die die Interaktion mit Servern vereinfacht.
Verwendung des Systems auf der Clientseite
Die Methoden der Klasse Cage ersetzen die gewöhnlichen, âalltagsmĂ€Ăigenâ Operationen des Dateisystems: Erstellung, Ăffnung, SchlieĂung, Löschung von Dateien sowie das Lesen/Schreiben von Daten im BinĂ€rformat (mit Angabe der Position und GröĂe der Daten). Konzeptuell sind diese Methoden den Dateioperationen der Programmiersprache C Ă€hnlich, bei denen das Ăffnen/SchlieĂen von Dateien ĂŒber Eingabe-/Ausgabe-KanĂ€le erfolgt.
Mit anderen Worten, der Programmierer arbeitet nicht mit den Methoden der âDateiâ-Objekte (der Klasse _io in Python), sondern mit den Methoden der Klasse Cage.
Beim Erstellen einer Cage-Instanz wird eine initiale Verbindung zu einem Server (oder mehreren Servern) hergestellt, die Autorisierung mit der Kunden-ID durchgefĂŒhrt und eine BestĂ€tigung mit der Nummer des zugewiesenen Ports fĂŒr alle Dateioperationen erhalten. Beim Löschen des Cage-Objekts wird ein Befehl an den Server gesendet, um die Verbindung zu beenden und Dateien zu schlieĂen. Auch die Server selbst können die Verbindung beenden.
Das System verbessert die Lese-/Schreibgeschwindigkeit durch die Pufferung hÀufig verwendeter Dateiabschnitte im Cache (Speicher) der Client-Programme.
Die Client-Software kann beliebig viele Cage-Objekte mit unterschiedlichen Einstellungen verwenden (PuffergröĂe, BlockgröĂe beim Austausch mit dem Server usw.).
Ein Cage-Objekt kann Daten mit mehreren Dateien auf mehreren Servern austauschen. Die Verbindungsparameter (IP-Adresse oder DNS des Servers, Hauptport zur Autorisierung, Pfad und Name der Datei) werden beim Erstellen des Objekts festgelegt.
Da jedes Cage-Objekt gleichzeitig mit mehreren Dateien arbeiten kann, wird ein gemeinsamer Speicherbereich fĂŒr das Caching verwendet. Die Cache-GröĂe - Anzahl der Seiten und deren GröĂe - wird dynamisch bei der Erstellung des Cage-Objekts festgelegt. Beispielsweise bedeutet ein 1 GB Cache, dass es 1.000 Seiten mit je 1 MB oder 10.000 Seiten mit je 100 KB oder 1 Million Seiten mit je 1 KB gibt. Die Wahl 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 verschiedene Einstellungen des Pufferspeichers zu bestimmen, je nach den Zugriffsmerkmalen auf Informationen in unterschiedlichen Dateien. Als Basis wird ein einfachster Pufferalgorithmus angewendet: Nach Erschöpfung des zugewiesenen Speicherplatzes verdrĂ€ngen neue Seiten alte in der Reihenfolge der geringsten Zugriffe. Die Pufferung ist besonders effektiv bei ungleichmĂ€Ăigem (im statistischen Sinne) gemeinsamen Zugriff, erstens auf verschiedenen Dateien und zweitens auf Fragmenten jeder Datei.
Die Cage-Klasse unterstĂŒtzt Ein- und Ausgaben nicht nur ĂŒber Datenadressen (unter Angabe der Position und LĂ€nge des Arrays, wodurch Dateisystemoperationen "ersetzt" werden), sondern auch auf einer tieferen, "physischen" Ebene â ĂŒber die Seitenzahlen im Pufferspeicher.
FĂŒr Cage-Objekte wird die Originalfunktion âHibernationâ (âSchlafâ) unterstĂŒtzt â sie können in eine lokale Dump-Datei auf der Client-Seite "eingefroren" werden (zum Beispiel im Falle eines Verbindungsabbruchs zu Servern oder beim Stoppen einer Anwendung usw.) und schnell aus dieser Datei wiederhergestellt werden (nach Wiederherstellung der Verbindung, bei erneutem Starten der Anwendung). Dies ermöglicht eine signifikante Reduzierung des Datenverkehrs, wenn das Client-Programm nach einem temporĂ€ren "Offline-Gang" wieder aktiviert wird, da hĂ€ufig verwendete Dateifragmente bereits im Cache vorhanden sind.
Cage umfasst etwa 3600 Zeilen Code.
Prinzipien des Serveraufbaus
Cageserver-Dateiserver können mit einer beliebigen Anzahl von Ports betrieben werden, wobei einer davon (der âHauptportâ) ausschlieĂlich fĂŒr die Authentifizierung aller Clients verwendet wird, wĂ€hrend die anderen fĂŒr den Datenaustausch zustĂ€ndig sind. FĂŒr das Cage-Server-Programm wird lediglich Python benötigt. Gleichzeitig kann der Computer mit dem Dateiserver auch jede andere Aufgabe ausfĂŒhren.
Der Server wird zunÀchst als Kombination zweier Hauptprozesse gestartet:
- âVerbindungenâ â ein Prozess zur DurchfĂŒhrung von Verbindungsaufbau und -abbruch mit den Clients auf Initiative des Servers;
- âOperationenâ â ein Prozess zur AusfĂŒhrung von Aufgaben (Operationen) der Clients im Umgang mit Dateien sowie zur Beendigung von Verbindungen auf Anforderung der Clients.
Beide Prozesse sind nicht synchronisiert und organisiert als unendliche Schleifen fĂŒr den Empfang und Versand von Nachrichten basierend auf multiplen Warteschlangen, Proxy-Objekten, Locks und Sockets.
Der Prozess âVerbindungenâ weist jedem Client einen Port fĂŒr den Datenempfang und -versand zu. Die Anzahl der Ports wird beim Start des Servers festgelegt. Die Zuordnung zwischen Ports und Clients wird im zwischen den Prozessen geteilten Proxy-Speicher gespeichert.
Der Prozess âOperationenâ unterstĂŒtzt die Trennung von Dateiressourcen, sodass mehrere unterschiedliche Clients gleichzeitig (quasi parallel, da der Zugriff durch Sperren geregelt wird) Daten aus einer Datei lesen können, wenn dies beim ursprĂŒnglichen Ăffnen durch den âerstenâ Client erlaubt 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 das Lesen/Schreiben zu beschleunigen, werden diese Operationen in Threads ausgefĂŒhrt, die durch den Prozess âOperationenâ erzeugt werden. Die Anzahl der Threads entspricht in der Regel der Anzahl der geöffneten Dateien. Lese-/SchreibauftrĂ€ge von Clients werden in eine gemeinsame Warteschlange eingegeben, und der erste freigewordene Thread nimmt den Auftrag von deren Kopf auf. Eine spezielle Logik ermöglicht es, Schreiboperationen im Arbeitsspeicher des Servers auszuschlieĂen.
Der Prozess âOperationenâ ĂŒberwacht die AktivitĂ€t der Clients und beendet deren Bedienung sowohl auf ihre Befehle hin als auch bei Ăberschreitung der InaktivitĂ€tstimeout.
Um die ZuverlĂ€ssigkeit zu gewĂ€hrleisten, protokolliert Cageserver alle Transaktionen. Ein gemeinsames Protokoll enthĂ€lt Kopien der Nachrichten von Kunden mit AuftrĂ€gen zum Erstellen, Ăffnen, Umbenennen oder Löschen von Dateien. FĂŒr jede Arbeitsdatei wird ein separates Protokoll erstellt, in dem Kopien der Nachrichten zu Lese- und SchreibauftrĂ€gen in dieser Arbeitsdatei sowie Arrays der geschriebenen (neuen) Daten und Arrays der Daten, die beim Ăberschreiben (Neuschreiben von Daten "ĂŒber" alte) verloren gingen, aufgezeichnet werden.
Diese Protokolle ermöglichen sowohl die Wiederherstellung neuer Ănderungen in Backups als auch das "Rollback" vom aktuellen Inhalt zu einem gewĂŒnschten Zeitpunkt in der Vergangenheit.
Cageserver besteht aus etwa 3100 Zeilen Code.

Starten des Cageserver-Datei-Server-Programms.
Beim Starten im Dialog mĂŒssen Sie Folgendes festlegen:
â den Hauptport zur Authentifizierung;
â die Anzahl der Ports fĂŒr den Austausch von Transaktionen mit autorisierten Kunden (mindestens 1, der Pool 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 mit Datei-Servern interagieren und ĂŒber einen Zwischenspeicher verfĂŒgen.
Einstellungen
- cage_name(str) - der bedingte Name des Objekts, der zur Identifizierung von Clients auf der Serverseite verwendet wird.
- pagesize(int) - die GröĂe einer Seite im Zwischenspeicher (in Bytes).
- numpages(int) - die Anzahl der Seiten im Zwischenspeicher.
- maxstrlen(int) - die maximale LÀnge der Byte-Zeichenfolge bei Schreib- und LesevorgÀngen.
- server_ip(dict) - ein Wörterbuch mit den verwendeten Adressen, wobei der SchlĂŒssel der bedingte Name des Servers (Server-ID innerhalb der Anwendung) ist und der Wert die Zeichenfolge mit der Adresse: âIP-Adresse:Portâ oder âDNS:Portâ (die Zuordnung von Namen und tatsĂ€chlichen Adressen ist temporĂ€r und kann geĂ€ndert werden). Server, wobei 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 zu tatsĂ€chlichen Adressen ist temporĂ€r und kann geĂ€ndert werden)
- wait(int) - die Wartezeit auf eine Antwort vom Server bei der Abfrage der Ports (in Sekunden).
- awake(boolean) - ein Flag, das die Art der Erstellung des Objekts angibt (False - wenn ein neues Objekt erstellt wird, True - wenn das Objekt aus einem zuvor "eingefrorenen" Zustand erstellt wird - durch die Anwendung der Operation âHibernateâ, per Voreinstellung False).
- cache_file(str) - der Name der Datei fĂŒr das Hibernate.
Methoden
Cage.file_create( server, path ) - eine neue Datei erstellen.
Cage.file_rename( server, path, new_name ) - eine Datei umbenennen.
Cage.file_remove( server, path) - eine Datei löschen.
Cage.öffnen( server, path, mod ) - eine Datei öffnen.
Gibt zurĂŒck fchannel Kanalnummer. Parameter mod â ist der Modus zum Ăffnen einer Datei: âwmâ â monopol (lesen/schreiben), ârsâ â nur lesen und fĂŒr andere Benutzer nur lesbar, âwsâ â lesen/schreiben und fĂŒr andere Benutzer nur lesbar.
Cage.close (fchannel) â Datei schlieĂen
Cage.write (fchannel, begin, data ) â eine Byte-Zeichenkette in die Datei schreiben
Cage.read (fchannel, begin, len_data ) â eine Byte-Zeichenkette aus der Datei lesen
Cage.put_pages ( fchannel ) â âstöĂtâ alle Seiten des angegebenen Kanals aus dem Puffer auf den Server, die modifiziert wurden. Wird an den Stellen des Algorithmus verwendet, an denen sichergestellt werden muss, dass alle Operationen auf dem Kanal physisch in der Datei auf dem Server gespeichert sind.
Cage.push_all () â âstöĂtâ alle Seiten aller KanĂ€le fĂŒr die Instanz der Klasse Cage aus dem Puffer auf den Server, die modifiziert wurden. Wird verwendet, wenn sichergestellt werden muss, dass alle Operationen auf allen KanĂ€len auf dem Server gespeichert sind.
Quelle: habr.com
