Cage Remote File Access System

Scopu di u sistema

Supportu per l'accessu remotu à i schedari nantu à l'urdinatori in a reta. U sistema "virtualmente" supporta tutte l'operazioni basiche di i schedari (creazione, eliminazione, lettura, scrittura, etc.) scambiendu transacciones (messages) cù u protocolu TCP.

Applicazioni

A funziunalità di u sistema hè efficace in i seguenti casi:

  • in l'applicazioni native per i dispositi mobili è incrustati (smartphones, sistemi di cuntrollu di bordu, etc.) chì necessitanu un accessu rapidu à i fugliali nantu à i servitori remoti di fronte à eventuali interruzzioni tempuranee in a cumunicazione (cù andendu offline);
  • in i DBMS caricati, se u prucessu di dumanda hè realizatu in certi servitori, è l'almacenamiento di dati hè realizatu in altri;
  • in rete corporativa distribuita per a cullizzioni è u trattamentu di l'infurmazioni, chì necessitanu un scambiu di dati à alta velocità, redundanza è affidabilità;
  • in sistemi cumplessi cù l'architettura di microserviziu, induve i ritardi in u scambiu d'infurmazioni trà i moduli sò critichi.

strutura

U sistema Cage (ci hè una implementazione - versione beta in Python 3.7 in Windows) include duie parti principali:

  1. Cageserver - un prugramma di u servitore di schedari (un pacchettu di funzioni) chì funziona nantu à l'urdinatori in a reta chì i schedari necessitanu accessu remotu;
  2. класс Cage cù una biblioteca di metudi per u software di u cliente, simplificà a codificazione di l'interazzione cù i servitori.

Utilizà u sistema da u latu di u cliente

I metudi di a classa Cage rimpiazzanu l'operazioni di u sistema di file "di routine" di solitu: creazione, apre, chjude, sguassà i schedari, è ancu lettura / scrittura di dati in furmatu binariu (indicà a pusizione è a dimensione di e dati). Conceptually, sti metudi sò vicinu à e funzioni di u schedariu di a lingua C, induve l'apertura / chjusu di i schedari hè realizatu "nantu à i canali" di input / output.

In altri palori, u programatore ùn travaglia micca cù metudi d'uggetti "file" (class _io in Python), ma cù metudi di a classa Cage.

Quandu una istanza di un oggettu Cage hè creatu, stabilisce una cunnessione iniziale cù un servitore (o parechji servitori), hè autorizatu da u Client Id, è riceve cunferma cù un numeru di portu dedicatu per tutte l'operazioni di u schedariu. Quandu un oggettu Cage hè sguassatu, urdineghja à u servitore per cessà di cumunicà è chjude i schedari. A terminazione di a cumunicazione pò ancu esse iniziata da i servitori stessi.

U sistema migliurà a prestazione di lettura/scrittura buffering frammenti di fugliali spessu usati di i prugrammi cliente in a cache RAM (buffer).
U software di u cliente pò aduprà ogni quantità di oggetti Cage cù diverse paràmetri (taglia di memoria di buffer, dimensione di bloccu quandu si scambia cù u servitore, etc.).

Un unicu oggettu Cage pò cumunicà cù parechje schedarii in parechji servitori. I paràmetri di cumunicazione (indirizzu IP o servitore DNS, portu principale per l'autorizazione, u percorsu è u nome di u schedariu) sò specificati quandu creanu l'ughjettu.

Siccomu ogni ughjettu Cage pò travaglià cù parechji schedari à u stessu tempu, u spaziu di memoria spartutu hè utilizatu per u buffering. Cache size - u numeru di pagine è a so dimensione, hè stabilitu dinamicamente quandu crea un oggettu Cage. Per esempiu, una cache di 1 GB hè 1000 pagine di 1 MB ognunu, o 10 mila pagine di 100 KB ognunu, o 1 milione di pagine di 1 KB ognunu. A selezzione di a dimensione è u numeru di pagine hè un compitu specificu per ogni casu d'applicazione.

Pudete aduprà parechje oggetti Cage à u stessu tempu per definisce diverse paràmetri di memoria di buffer secondu cumu si accede à l'infurmazioni in diversi schedari. Cum'è una basa, l'algoritmu di buffering più simplice hè utilizatu: dopu chì una data quantità di memoria hè esaurita, e pagine novi spustanu i vechji secondu u principiu di retirement cù un minimu numeru di accessi. U buffering hè soprattuttu efficace in u casu di l'accessu spartutu irregolare (in un sensu statisticu), prima, à diversi schedari, è, in segundu, à frammenti di ogni schedariu.

A classa Cage supporta l'I / O micca solu per l'indirizzi di dati (indicà a pusizione è a durata di l'array, "sustituendu" l'operazioni di u sistema di fugliale), ma ancu à un livellu "fisicu" più bassu - per numeri di pagina in memoria di buffer.

A funzione originale hè supportata per l'uggetti Cage "hibernazione" ("sleep") - ponu esse "collapsed" (per esempiu, in casu di perdita di cunnessione cù i servitori, o quandu l'applicazione hè fermata, etc.) in un schedariu di dump locale in u latu di u cliente è rapidamente restauratu da stu schedariu (dopu chì a cumunicazione hè ripresa, quandu riavvia l'applicazione). Questu permette di riduce significativamente u trafficu quandu attivate u prugramma di u cliente dopu à andà temporaneamente "offline", postu chì i frammenti di fugliale utilizati spessu saranu digià in a cache.

Cage hè circa 3600 linee di codice.

Principi di custruzzione di u servitore

I servitori di file Cageserver ponu esse eseguiti cù un numeru arbitrariu di porti, unu di i quali ("principale") hè utilizatu solu per l'autorizazione di tutti i clienti, u restu sò usati per u scambiu di dati. U prugramma di u servitore Cage richiede solu Python. In parallelu, l'urdinatore cù u servitore di fugliale pò esse realizatu qualsiasi altru travagliu.

U servitore principia inizialmente cum'è una cullizzioni di dui prucessi principali:

  1. "Connessioni" - un prucessu per eseguisce l'operazioni di stabilisce a cumunicazione cù i clienti è finisce à l'iniziativa di u servitore;
  2. "Operazioni" - un prucessu per eseguisce i travaglii (operazioni) di i clienti per travaglià cù i schedari, è ancu per chjude e sessioni di cumunicazione basate nantu à i cumandamenti di u cliente.

I dui prucessi ùn sò micca sincronizzati è sò urganizati cum'è cicli infiniti di riceve è mandà messagi basati in fila multiprocessu, oggetti proxy, chjusi è sockets.
U prucessu di Cunnessione attribuisce un portu per ogni cliente per riceve è trasmette dati. U numaru di porti hè stabilitu quandu u servitore principia. A mappatura trà i porti è i clienti hè almacenata in memoria proxy interprocess-shared.

U prucessu di Operazioni supporta a spartera di risorse di fugliale in modu chì parechji clienti diffirenti ponu sparte (quasi-parallèle, postu chì l'accessu hè cuntrullatu da chjusi) leghje dati da un schedariu s'ellu era permessu quandu era inizialmente apertu da u "primu" cliente.

U processu di cumandamenti per creà / sguassate / apre / chjude i fugliali nantu à u servitore hè realizatu in u prucessu "Operazioni" stessu in sequenza stretta cù u sottosistema di fugliale di u SO di u servitore.

Per accelerà in generale a lettura / scrittura, queste operazioni sò realizate in fili generati da u prucessu "Operazioni". U numaru di fili hè di solitu uguali à u numeru di schedari aperti. I travaglii di lettura / scrittura da i clienti sò sottumessi à a fila generale è u primu filu liberu piglia u compitu da u so capu. A logica speciale permette di eliminà e operazioni di riscrittura di dati in a RAM di u servitore.

U prucessu di l'Operazioni monitoreghja l'attività di u cliente è cessà di u serviziu sia nantu à i so cumandamenti sia quandu u timeout di inattività hè superatu.

Per assicurà a affidabilità, Cageserver mantene logs di tutte e transazzione. Un logu generale cuntene copie di i missaghji da i clienti cù compiti per creà / apre / rinumate / sguassà i schedari. Un logu separatu hè creatu per ogni fugliale di travagliu, in quale copie di i missaghji cù i travaglii per leghje è scrive dati in stu schedariu di travagliu sò registrati, è ancu arrays di dati scritti (novi) è arrays di dati chì sò stati distrutti durante a sovrascrittura (scrittura). novi dati "in cima" di i vechji). ).

Questi logs furniscenu l'abilità di restaurà novi cambiamenti à e copie di salvezza è di rinvià u cuntenutu attuale à un puntu in u passatu.

Cageserver hè circa 3100 linee di codice.

Cage Remote File Access System

Lanciazione di u prugramma di u servitore di file Cageserver

Quandu principia, in u dialogu avete bisognu di definisce:
- portu principale per l'autorizazione;
- u numeru di porti per scambià transazzione cù i clienti autorizati (da 1 o più, u gruppu di numeri principia da quellu vicinu à u numeru di portu principale).

Utilizà a Classe Cage

burghisìa gabbia.Cage( cage_name="", pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, wake=False, cache_file="" )

L'uggetti sò creati da questa classa chì interagiscenu cù i servitori di file è cuntenenu memoria buffer.

login

  • nome_gabbia(st) - nome condicionale di l'ughjettu, chì hè utilizatu per identificà i clienti in u latu di u servitore
  • dimensione di pagine(tram) - dimensione di una pagina di memoria buffer (in byte)
  • numeri(tram) - numeru di pagine di memoria buffer
  • maxstrlen(tram) - a lunghezza massima di una stringa di byte in operazioni di scrittura è lettura
  • server_ip(detta) - un dizziunariu cù l'indirizzi di i servitori utilizati, induve a chjave hè u nome condicionale di u servitore (id di u servitore in l'applicazione), è u valore hè una stringa cù l'indirizzu: "IP address:port" o "DNS: portu" (a comparazione di nomi è indirizzi veri hè tempurale, pò esse cambiatu)
  • aspittà(tram) - tempu d'aspittà per una risposta da u servitore quandu riceve porti (in seconde)
  • svighjati(booleanu) - bandiera di cumu hè creatu l'ughjettu (False - se un novu ogettu hè creatu, True - se un ughjettu hè creatu da un precedente "collapsed" - utilizendu l'operazione "hibernazione", False per difettu)
  • cache_file(st) - nome di u schedariu per l'hibernazione

Metodi

Gabbia.file_create( servitore, caminu ) - crea un novu schedariu

Gabbia.file_rename( server, path, new_name ) - rinominate u schedariu

Gabbia.file_remove( servitore, caminu) - sguassà un schedariu

Gabbia.apartu( servitore, caminu, mod ) - apre u schedariu

Ritorna fchannel numeru di canali. Parametru contru à - questu hè u modu di apertura di u schedariu: "wm" - esclusivu (lettura/scrittura), "rs" - solu lettura, è spartutu solu per leghje da altri clienti, "ws" - lettura/scrittura, è spartutu solu per leghje da altri clienti.

Gabbia.chiudi (fchannel) - chjude u schedariu

Gabbia.scrivemu (fchannel, principià, dati ) - scrivite una stringa di byte à un schedariu

Gabbia.leghje (fchannel, begin, len_data ) - leghje una stringa di byte da un schedariu

Gabbia.mette_pagine ( fchannel ) - "pushes" da u buffer à u servitore tutte e pagine di u canali specificatu chì sò state mudificate. Hè utilizatu à quelli punti in l'algoritmu quandu avete bisognu à esse sicuru chì tutte l'operazioni nantu à u canali sò salvate fisicamente in un schedariu nantu à u servitore.

Gabbia.push_all () - "pushes" da u buffer à u servitore tutte e pagine di tutti i canali per una istanza di a classa Cage chì sò state mudificate. Adupratu quandu avete bisognu à esse sicuru chì tutte l'operazioni nantu à tutti i canali sò salvate in u servitore.

Source: www.habr.com

Add a comment