Sistema di accesso remoto ai file Cage

Scopo del sistema

Supporta l'accesso remoto ai file sui computer della rete. Il sistema gestisce "virtualmente" tutte le principali operazioni sui file (creazione, eliminazione, lettura, scrittura e altro) tramite lo scambio di transazioni (messaggi) tramite il protocollo TCP.

Ambiti di applicazione

Le funzionalità del sistema sono efficaci nei seguenti casi:

  • in applicazioni native per dispositivi mobili e embedded (smartphone, sistemi di controllo a bordo, ecc.) che richiedono un accesso rapido ai file sui server remoti in caso di potenziali interruzioni temporanee della connessione (uscita offline);
  • in database relazionali ad alto carico, dove l'elaborazione delle richieste avviene su server diversi rispetto allo storage dei dati;
  • in reti aziendali distribuite per la raccolta e l'elaborazione delle informazioni, che richiedono elevata velocità di scambio dati, backup e affidabilità;
  • in sistemi complessi con architettura a microservizi, dove i ritardi nello scambio di informazioni tra i moduli sono di importanza critica.

Struttura

Il sistema Cage (è disponibile un'implementazione — versione beta su Python 3.7 su Windows) comprende due parti principali:

  1. Cageserver — un programma file-server (pacchetto di funzionalità) che viene eseguito sui computer in rete, ai quali è necessario accedere ai file da remoto;
  2. classe Cage con una libreria di metodi per il software client, che semplifica la codifica dell'interazione con i server.

Utilizzo del sistema lato client

I metodi della classe Cage sostituiscono le normali operazioni 'routinè' del filesystem: creazione, apertura, chiusura, eliminazione dei file, nonché lettura/scrittura di dati in formato binario (specificando posizione e dimensione dei dati). Concettualmente, questi metodi sono simili alle funzioni di file del linguaggio C, dove l'apertura/chiusura dei file avviene 'su canali' di input-output.

In altre parole, il programmatore non lavora con i metodi degli oggetti 'file' (classe _io in Python), ma con i metodi della classe Cage.

Quando si crea un'istanza dell'oggetto Cage, stabilisce una connessione iniziale con il server (o con più server), autentica l'ID del cliente e riceve una conferma con il numero della porta dedicata per tutte le operazioni sui file. Quando l'oggetto Cage viene eliminato, invia al server un comando per interrompere la connessione e chiudere i file. La disconnessione può essere iniziata anche dai server stessi.

Il sistema migliora le prestazioni di lettura/scrittura basandosi sulla memorizzazione nella cache dei frammenti di file più utilizzati dalle applicazioni client nella memoria RAM.
Il software client può utilizzare un numero qualsiasi di oggetti Cage con diverse configurazioni (dimensione della memoria cache, dimensione dei blocchi durante lo scambio con il server, ecc.).

Un oggetto Cage può scambiare dati con più file su più server. I parametri per la connessione (indirizzo IP o DNS del server, porta principale per l'autenticazione, percorso e nome del file) sono impostati al momento della creazione dell'oggetto.

Poiché ogni oggetto Cage può operare contemporaneamente con più file, viene utilizzato uno spazio di memoria condiviso per la memorizzazione nella cache. Le dimensioni della cache – il numero di pagine e la loro dimensione – vengono impostate dinamicamente al momento della creazione dell'oggetto Cage. Ad esempio, una cache di 1 GB corrisponde a 1000 pagine da 1 MB, oppure 10.000 pagine da 100 KB, oppure 1 milione di pagine da 1 KB. La scelta della dimensione e del numero di pagine rappresenta una questione specifica per ogni caso applicativo.

È possibile utilizzare più oggetti Cage contemporaneamente per definire diverse impostazioni di memoria tampone in base alle peculiarità di accesso alle informazioni in diversi file. Come base viene applicato il più semplice algoritmo di memorizzazione nella cache: dopo l'esaurimento della memoria assegnata, le nuove pagine sostituiscono le vecchie secondo il principio dell'uscita con il minor numero di accessi. La buffering è particolarmente efficace in presenza di accesso non uniforme (in senso statistico), sia a diversi file che a frammenti di ciascun file.

La classe Cage supporta l'input/output non solo per indirizzi di dati (specificando la posizione e la lunghezza dell'array, "sostituendo" le operazioni del file system), ma anche a un livello più basso, "fisico" — tramite numeri di pagina nella memoria buffer.

Per gli oggetti Cage è supportata la funzione originale "ibernazione" ("sonno") — possono essere "compattati" (ad esempio, in caso di disconnessione dai server, o durante l'arresto dell'applicazione, ecc.) in un file di dump locale sul lato client e rapidamente ripristinati da questo file (dopo il ripristino della connessione, al riavvio dell'applicazione). Questo consente una significativa riduzione del traffico al riavvio del programma client dopo un'interruzione temporanea "offline", poiché i frammenti di file frequentemente utilizzati saranno già presenti nella cache.

Cage è composto da circa 3600 righe di codice.

Principi di costruzione dei server

I file server Cageserver possono essere eseguiti con un numero arbitrario di porte, una delle quali («principale») è utilizzata solo per l'autenticazione di tutti i clienti, mentre le altre sono dedicate al trasferimento dei dati. Per il funzionamento del server Cage è richiesto solamente Python. Inoltre, il computer con il file server può eseguire qualsiasi altro lavoro.

Il server viene avviato innanzitutto come una combinazione di due processi principali:

  1. «Connessioni» – processo per eseguire operazioni di stabilimento e terminazione di collegamenti con i clienti, su iniziativa del server;
  2. «Operazioni» – processo per eseguire i compiti (operazioni) dei clienti relativi alla gestione dei file, e per chiudere le sessioni di comunicazione su comando dei clienti.

Entrambi i processi non sono sincronizzati e sono organizzati come cicli infiniti di ricezione e invio di messaggi basati su code di multiprocessi, oggetti proxy, lock e socket.
Il processo «Connessioni» assegna a ciascun cliente una porta per la trasmissione dei dati. Il numero di porte è definito all'avvio del server. La corrispondenza tra porte e clienti è memorizzata nella memoria condivisa tra processi.

Il processo "Operazioni" supporta la divisione delle risorse dei file, consentendo a diversi clienti di accedere contemporaneamente (quasi in parallelo, poiché l'accesso è gestito da lock) ai dati di un file, se tale operazione è stata autorizzata al momento della sua apertura iniziale da parte del "primo" cliente.

L'elaborazione dei comandi per la creazione/delezione/apertura/chiusura dei file server avviene nel processo "Operazioni" in modo strettamente sequenziale, utilizzando il sottosistema file del server OS.

Per accelerare la lettura/scrittura, queste operazioni vengono eseguite in thread generati dal processo "Operazioni". Il numero di thread è generalmente pari al numero di file aperti. I compiti di lettura/scrittura dei clienti vengono inviati a una coda comune, e il primo thread disponibile preleva il compito dalla testa della coda. Una logica speciale permette di escludere le operazioni di sovrascrittura dei dati nella memoria operativa del server.

Il processo "Operazioni" monitora l'attività dei clienti e interrompe il loro servizio sia su loro comando che in caso di superamento del timeout di inattività.

Per garantire l'affidabilità, Cageserver tiene traccia di tutti i registri delle transazioni. Un registro comune contiene copie dei messaggi dai clienti con richieste per creare, aprire, rinominare o eliminare file. Per ogni file di lavoro, viene creato un registro separato in cui vengono registrate copie dei messaggi con richieste di lettura e scrittura dei dati in quel file di lavoro, insieme agli array dei dati scritti (nuovi) e agli array dei dati che sono stati distrutti durante la riscrittura (scrittura di nuovi dati sopra i vecchi).

Questi registri offrono la possibilità sia di ripristinare le nuove modifiche nei backup, sia di «ripristinare» il contenuto attuale a un momento desiderato del passato.

Cageserver è composto da circa 3100 righe di codice.

Sistema di accesso remoto ai file Cage

Avvio del programma file-server Cageserver

Durante l'avvio nella finestra di dialogo, è necessario definire:
— la porta principale per l'autenticazione;
— il numero di porte per lo scambio di transazioni con i clienti autorizzati (dalla prima in poi, il pool dei numeri inizia dal numero successivo a quello della porta principale).

Utilizzo della classe Cage

class cage.Cage( cage_name=», pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file=»» )

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

Parametri

  • cage_name(str) — nome convenzionale dell'oggetto utilizzato per identificare i clienti lato server
  • pagesize(-int) — dimensione di una pagina di memoria buffer (in Byte)
  • numpages(-int) — numero di pagine nella memoria buffer
  • maxstrlen(-int) — lunghezza massima della stringa in byte nelle operazioni di lettura e scrittura
  • server_ip(dict) — dizionario con gli indirizzi utilizzati server, dove la chiave è il nome convenzionale del server (id del server all'interno dell'applicazione) e il valore è una stringa con l'indirizzo: “ip address:port” o “DNS:port” (correlazione tra nomi e indirizzi reali — temporanea, modificabile)
  • wait(-int) — tempo di attesa per la risposta dal server durante l'ottenimento delle porte (in sec.)
  • awake(booleano) — flag sul metodo di creazione dell'oggetto (Falso — se viene creato un nuovo oggetto, True — se l'oggetto viene creato da un precedente «sospeso» — tramite l'operazione di «ibernazione», per impostazione predefinita False)
  • cache_file(str) — nome del file per l'ibernazione

I metodi

Cage.file_create( server, path ) – creare un nuovo file

Cage.file_rename( server, path, new_name ) – rinominare il file

Cage.file_remove( server, path) – rimuovere il file

Cage.open( server, path, mod ) – aprire il file

Restituisce fchannel numero del canale. Il parametro mod — è la modalità di apertura del file: «wm» — monopolistica (read/write), «rs» — solo lettura, e condivisa solo per lettura da altri client, «ws» — read/write, e condivisa solo per lettura da altri client.

Cage.close (fchannel) – chiudere il file

Cage.write (fchannel, inizio, dati ) – scrivere una stringa di byte nel file

Cage.read (fchannel, inizio, len_data ) – leggere una stringa di byte dal file

Cage.put_pages ( fchannel ) – «espelle» dal buffer sul server tutte le pagine del canale specificato che sono state modificate. Viene utilizzato nei punti dell'algoritmo in cui è necessario essere certi che tutte le operazioni sul canale siano fisicamente salvate nel file sul server.

Cage.push_all () – «espelle» dal buffer sul server tutte le pagine di tutti i canali per l'istanza della classe Cage che sono state modificate. Viene utilizzato quando è necessario essere certi che tutte le operazioni su tutti i canali siano salvate sul server.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster