Sistema di accesso remoto ai file Cage

Scopo del sistema

Supporto per l'accesso remoto ai file sui computer della rete. Il sistema supporta “virtualmente” tutte le operazioni di base sui file (creazione, cancellazione, lettura, scrittura, ecc.) scambiando transazioni (messaggi) utilizzando il protocollo TCP.

applicazioni

La funzionalità del sistema è efficace nei seguenti casi:

  • nelle applicazioni native per dispositivi mobili ed embedded (smartphone, sistemi di controllo di bordo, ecc.) che richiedono un accesso rapido a file su server remoti a fronte di possibili interruzioni temporanee della comunicazione (con messa offline);
  • nei DBMS caricati, se l'elaborazione delle query viene eseguita su alcuni server e l'archiviazione dei dati su altri;
  • nelle reti aziendali distribuite per la raccolta e l'elaborazione delle informazioni, che richiedono scambio di dati ad alta velocità, ridondanza e affidabilità;
  • in sistemi complessi con architettura a microservizi, dove i ritardi nello scambio di informazioni tra i moduli sono critici.

Struttura

Il sistema Cage (esiste un'implementazione - versione beta in Python 3.7 su Windows) comprende due parti principali:

  1. Server della gabbia — un programma file server (un pacchetto di funzioni) che viene eseguito su computer della rete i cui file richiedono l'accesso remoto;
  2. classe Gabbia con una libreria di metodi per il software client, semplificando la codifica dell'interazione con i server.

Utilizzo del sistema lato client

I metodi della classe Cage sostituiscono le consuete operazioni “di routine” del file system: creazione, apertura, chiusura, eliminazione file, così come leggere/scrivere dati in formato binario (indicando la posizione e la dimensione dei dati). Concettualmente questi metodi sono vicini alle funzioni file del linguaggio C, dove l'apertura/chiusura dei file viene eseguita “sui canali” di input/output.

In altre parole, il programmatore non lavora con metodi di oggetti “file” (class _io in Python), ma con metodi della classe Cage.

Quando viene creata un'istanza di un oggetto Cage, stabilisce una connessione iniziale con un server (o più server), è autorizzata dal Client Id e riceve conferma con un numero di porta dedicato per tutte le operazioni sui file. Quando un oggetto Cage viene eliminato, indica al server di interrompere la comunicazione e di chiudere i file. La terminazione della comunicazione può essere avviata anche dai server stessi.

Il sistema migliora le prestazioni di lettura/scrittura memorizzando i frammenti di file dei programmi client utilizzati di frequente nella cache RAM (buffer).
Il software client può utilizzare un numero qualsiasi di oggetti Cage con impostazioni diverse (dimensione della memoria del buffer, dimensione del blocco durante lo scambio con il server, ecc.).

Un singolo oggetto Cage può comunicare con più file su più server. I parametri di comunicazione (indirizzo IP o server DNS, porta principale per autorizzazione, percorso e nome file) vengono specificati durante la creazione dell'oggetto.

Poiché ciascun oggetto Cage può funzionare con più file contemporaneamente, per il buffering viene utilizzato lo spazio di memoria condivisa. Dimensione della cache: il numero di pagine e la loro dimensione vengono impostati dinamicamente durante la creazione di un oggetto Cage. Ad esempio, una cache da 1 GB corrisponde a 1000 pagine da 1 MB ciascuna, oppure 10mila pagine da 100 KB ciascuna o 1 milione di pagine da 1 KB ciascuna. La selezione della dimensione e del numero di pagine è un compito specifico per ciascun caso di domanda.

È possibile utilizzare più oggetti Cage contemporaneamente per definire diverse impostazioni di memoria buffer a seconda del modo in cui si accede alle informazioni in file diversi. Di base viene utilizzato l'algoritmo di buffering più semplice: dopo che una determinata quantità di memoria è esaurita, le nuove pagine sostituiscono quelle vecchie secondo il principio del pensionamento con un numero minimo di accessi. Il buffering è particolarmente efficace in caso di accesso condiviso non uniforme (in senso statistico), in primo luogo a file diversi e, in secondo luogo, a frammenti di ciascun file.

La classe Cage supporta l'I/O non solo tramite indirizzi di dati (che indicano la posizione e la lunghezza dell'array, "sostituendo" le operazioni del file system), ma anche a un livello "fisico" inferiore, tramite i numeri di pagina nella memoria buffer.

La funzione originale è supportata per gli oggetti Cage "letargo" ("sleep") - possono essere "compressi" (ad esempio, in caso di perdita di connessione con i server, o quando l'applicazione viene arrestata, ecc.) in un file di dump locale sul lato client e ripristinati rapidamente da questo file (dopo aver ripreso la comunicazione, quando si riavvia l'applicazione). Ciò consente di ridurre significativamente il traffico quando si attiva il programma client dopo essere temporaneamente "offline", poiché i frammenti di file utilizzati di frequente saranno già nella cache.

Cage è composto da circa 3600 righe di codice.

Principi di costruzione del server

I file server Cageserver possono essere eseguiti con un numero arbitrario di porte, una delle quali (“principale”) viene utilizzata solo per l'autorizzazione di tutti i client, le restanti vengono utilizzate per lo scambio di dati. Il programma server Cage richiede solo Python. Parallelamente, il computer con il file server può eseguire qualsiasi altro lavoro.

Il server inizia inizialmente come una raccolta di due processi principali:

  1. "Connessioni" – un processo per eseguire le operazioni di stabilire una comunicazione con i clienti e terminarla su iniziativa del server;
  2. "Operazioni" – un processo per eseguire attività (operazioni) dei client per lavorare con i file, nonché per chiudere sessioni di comunicazione in base ai comandi del client.

Entrambi i processi non sono sincronizzati e sono organizzati come cicli infiniti di ricezione e invio di messaggi basati su code multiprocesso, oggetti proxy, blocchi e socket.
Il processo di connessione assegna una porta a ciascun client per ricevere e trasmettere dati. Il numero di porte viene impostato all'avvio del server. La mappatura tra porte e client viene archiviata nella memoria proxy condivisa tra processi.

Il processo Operazioni supporta la condivisione delle risorse file in modo che più client diversi possano condividere (quasi parallelo, poiché l'accesso è controllato da blocchi) legge i dati da un file se ciò era consentito al momento della sua apertura da parte del "primo" client.

L'elaborazione dei comandi per creare/eliminare/aprire/chiudere file sul server viene eseguita nel processo "Operazioni" stesso in modo rigorosamente sequenziale utilizzando il sottosistema file del sistema operativo del server.

Per velocizzare generalmente la lettura/scrittura, queste operazioni vengono eseguite nei thread generati dal processo “Operazioni”. Il numero di thread è solitamente uguale al numero di file aperti. Le attività di lettura/scrittura dai client vengono inviate alla coda generale e il primo thread libero prende l'attività dalla sua testa. Una logica speciale consente di eliminare le operazioni di riscrittura dei dati nella RAM del server.

Il processo Operazioni monitora l'attività dei client e interrompe la loro assistenza in base ai loro comandi o quando viene superato il timeout di inattività.

Per garantire l'affidabilità, Cageserver conserva i registri di tutte le transazioni. Un registro generale contiene copie di messaggi provenienti da client con attività per creare/aprire/rinominare/eliminare file. Viene creato un registro separato per ciascun file di lavoro, in cui vengono registrate copie dei messaggi con attività di lettura e scrittura dei dati in questo file di lavoro, nonché matrici di dati scritti (nuovi) e matrici di dati che sono state distrutte durante la sovrascrittura (scrittura nuovi dati “sopra” a quelli vecchi). ).

Questi registri offrono la possibilità sia di ripristinare nuove modifiche ai backup sia di ripristinare il contenuto corrente a un punto nel passato.

Cageserver contiene circa 3100 righe di codice.

Sistema di accesso remoto ai file Cage

Avvio del programma file server Cageserver

All'avvio, nella finestra di dialogo è necessario definire:
— porto principale per l'autorizzazione;
— il numero di porte per lo scambio di transazioni con clienti autorizzati (da 1 o più, il pool di numeri inizia da quello successivo al numero di porta principale).

Utilizzando la classe Cage

classe gabbia.Gabbia( gabbia_name="", pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, sveglio=False, cache_file="" )

Da questa classe vengono creati oggetti che interagiscono con i file server e contengono memoria buffer.

Parametri

  • nome_gabbia(str) - nome condizionale dell'oggetto, utilizzato per identificare i client sul lato server
  • dimensioni della pagina(int) — dimensione di una pagina di memoria buffer (in byte)
  • numpagine(int) — numero di pagine di memoria buffer
  • maxstrlen(int) - la lunghezza massima di una stringa di byte nelle operazioni di scrittura e lettura
  • IP del server(detto) - un dizionario con gli indirizzi dei server utilizzati, dove la chiave è il nome condizionale del server (id del server all'interno dell'applicazione) e il valore è una stringa con l'indirizzo: “indirizzo ip:porta” o “DNS: port” (il confronto tra nomi e indirizzi reali è temporaneo, può essere modificato)
  • aspettare(int) - tempo di attesa per una risposta dal server quando si ricevono le porte (in secondi)
  • sveglio(booleano) — indicatore di come viene creato l'oggetto (Falso - se viene creato un nuovo oggetto, I veri - se un oggetto viene creato da uno precedentemente “compresso” - utilizzando l'operazione di “ibernazione”, False per impostazione predefinita)
  • file_cache(str) - nome del file per l'ibernazione

Методы

Gabbia.file_crea( server, percorso ) – crea un nuovo file

Gabbia.file_rinomina( server, percorso, nuovo_nome ) – rinominare il file

Gabbia.file_rimuovi( server, percorso) - elimina un file

Gabbia.aprire( server, percorso, mod ) - apri il file

ritorna fchannel numero del canale. Parametro mod - questa è la modalità di apertura del file: "wm" - esclusiva (lettura/scrittura), "rs" - di sola lettura e condivisa solo per la lettura da altri client, "ws" - lettura/scrittura e condivisa solo per la lettura da parte di altri clienti.

Gabbia.close (fchannel) – chiude il file

Gabbia.scrivere (fchannel, inizio, dati ) – scrive una stringa di byte in un file

Gabbia.read (fchannel, inizio, len_data ) – legge una stringa di byte da un file

Gabbia.put_pages ( fchannel ) – “spinge” dal buffer al server tutte le pagine del canale specificato che sono state modificate. Viene utilizzato in quei punti dell'algoritmo in cui è necessario essere sicuri che tutte le operazioni sul canale siano fisicamente salvate in un file sul server.

Gabbia.push_all () – “spinge” dal buffer al server tutte le pagine di tutti i canali per un'istanza della classe Cage che sono state modificate. Utilizzato quando è necessario essere sicuri che tutte le operazioni su tutti i canali vengano salvate sul server.

Fonte: habr.com

Aggiungi un commento