A rendszer célja
Támogatja a fájlok távoli elérését a hálózatban lévő számítógépeken. A rendszer "virtuálisan" támogatja az összes alapvető fájlműveletet (létrehozás, törlés, olvasás, írás stb.) tranzakciók (üzenetek) csere révén TCP protokollon keresztül.
Alkalmazási területek
A rendszer funkcionalitása hatékony az alábbi esetekben:
- natív mobil és beágyazott alkalmazásokban (okostelefonok, fedélzeti irányító rendszerek stb.), amelyek gyors hozzáférést igényelnek távoli szervereken lévő fájlokhoz, várható ideiglenes hálózati megszakítások mellett;
- terhelt adatbázisokban, amikor a lekérdezések feldolgozása egyes szervereken, míg az adatok tárolása másokon történik;
- elosztott vállalati hálózatokban információgyűjtéshez és feldolgozáshoz, ahol magas sebességű adatcsere, redundancia és megbízhatóság szükséges;
- komplex mikroszerviz architektúrával rendelkező rendszerekben, ahol az információ modulok közötti cseréjének késleltetése kritikus fontosságú.
Struktúra
A Cage rendszer (elérhető egy Python 3.7 beta verzióban Windows operációs rendszeren) két fő részből áll:
- Cageserver – egy fájlszerver program (funkciókészlet), amely a hálózatban lévő számítógépeken fut, amelyekhez távoli hozzáférés szükséges a fájlokhoz;
- osztály Cage egy kliensoldali szoftver metódus könyvtára, amely megkönnyíti a szerverekkel való együttműködés kódolását.
A rendszer használata a kliensoldalon
A Cage osztály metódusai felváltják a hagyományos "rutinszerű" fájlrendszeri műveleteket: létrehozás, megnyitás, bezárás, törlés fájlok, valamint adatok bináris formátumban való olvasása/írása (az adatok pozíciójának és méretének megadásával). Koncepcionálisan ezek a metódusok közel állnak a C nyelv fájlkezelő funkcióihoz, ahol a fájlok megnyitása/bezárása "bemenet-kimeneti csatornákon" történik.
Más szavakkal, a programozó nem a "fájl" objektumok metódusaival (a _io Pythonban), hanem a Cage osztály metódusaival dolgozik.
Amikor egy Cage objektum példányt létrehoz, kezdeti kapcsolatot létesít a szerverrel (vagy több szerverrel), kliensazonosítóval hitelesít és megerősítést kap az összes fájlművelet végrehajtásához szükséges portszámról. Amikor a Cage objektum eltűnik, megparancsolja a szervernek a kapcsolat megszüntetését és a fájlok lezárását. A kapcsolatok megszüntetését a szerverek is kezdeményezhetik.
A rendszer a gyakran használt fájlfragmentumok programok általi gyorsításán alapuló olvasás/írási teljesítmény növelésére szolgál, amely a memóriában (cache-ben) tárolódik.
A kliensprogram bármennyi Cage objektumot használhat, különböző beállításokkal (cache méret, blokkok mérete a szerverrel való kommunikációban stb.).
Egy Cage objektum egyszerre több fájllal is adatot cserélhet több szerveren. A kapcsolati paraméterek (IP-cím vagy DNS, a fő port az azonosításhoz, a fájl elérési útja és neve) az objektum létrehozásakor kerülnek megadásra.
Mivel minden Cage objektum egyszerre több fájllal is működik, a cache-eléshez közös memóriahasználat szükséges. A cache mérete — az oldalak száma és mérete — dinamikusan, a Cage objektum létrehozásakor van beállítva. Például 1 GB cache 1000 db 1 MB-os vagy 10 000 db 100 kB-os oldalt vagy 1 millió 1 kB-os oldalt jelent. Az oldalak méretének és számának megválasztása az egyes alkalmazásesetekhez kapcsolódó konkrét feladat.
Több Cage objektum egyidejű használatával különböző cache-beállításokat határozhatunk meg attól függően, hogy hogyan férünk hozzá az információkhoz különböző fájlokban. Alapértelmezettként a legegyszerűbb cache-elési algoritmus alkalmazásra kerül: a megadott memória kapacitás kimerülése után az új oldalak a régiakat helyettesítik a lehető legkevesebb hívás elve alapján. A cache-elés különösen hatékony, ha statisztikai szempontból egyenetlen a hozzáférés, egyrészt a különböző fájlokhoz, másrészt pedig minden fájl fragmentumához.
A Cage osztály nemcsak a data címeken végzi a be- és kiírást (a pozíció és a tömb hossza megadásával, „helyettesítve” a fájlrendszer műveleteit), hanem alacsonyabb, „fizikai” szinten is — az oldalak száma alapján a memóriában.
A Cage objektumok számára támogatott az eredeti funkció „hibernálás” («álom») – ezeket „össze lehet hajtani” (például, ha megszakad a kapcsolat a szerverekkel, vagy az alkalmazás leáll, stb.) egy helyi dump fájlba az ügyfél oldalán, és gyorsan vissza lehet állítani ebből a fájlból (a kapcsolat helyreállítása után, az alkalmazás újraindításakor). Ez jelentős forgalommegtakarítást tesz lehetővé az ügyfélszoftver működésbe lépésekor ideiglenes „offline” állapot után, mivel a gyakran használt fájlfragmentumok már a gyorsítótárban lesznek.
A Cage körülbelül 3600 sor kódot tartalmaz.
Szerverek felépítésének alapelvei
A Cageserver fájl-szerverek tetszőleges számú porttal indíthatók, ebből az egyik (a „fő”) kizárólag az összes ügyfél hitelesítésére szolgál, a többi pedig az adatok cseréjére. A Cage szerverprogramhoz csupán Python szükséges. Ezenkívül a fájl-szerver számítógép bármilyen egyéb munkát is végezhet.
A szerver elsőként két fő folyamat összességeként indul:
- „Kapcsolatok” – folyamat az ügyfelekkel való kapcsolat létrehozására és megszüntetésére a szerver kezdeményezésével;
- „Műveletek” – folyamat az ügyfelek fájlokkal kapcsolatos feladatainak (műveleteinek) végrehajtására, valamint a kapcsolat lezárására az ügyfelek parancsai alapján.
Mindkét folyamat nincs szinkronizálva, és végtelen üzenetküldési és -fogadási ciklusokként szerveződnek multiprocesszós sorok, proxy-objektumok, zárolások és socketek alapján.
A „Kapcsolatok” folyamat minden ügyfél számára portot rendel az adatátvitelhez. A portok számát a szerver indításakor kell megadni. A portok és ügyfelek közötti megfeleltetés a folyamatok közötti megosztott proxy-memóriában tárolódik.
A „Műveletek” folyamat támogatja a fájlforrások megosztását, így több különböző ügyfél közösen (kvázi párhuzamosan, mivel a hozzáférést zárolások kezelik) olvashatja ugyanazt a fájlt, ha ezt az kezdeti megnyitáskor az „első” ügyfél engedélyezte.
A fájlok létrehozására/eltávolítására/megnyitására/lezárására vonatkozó parancsok szerveren a „Műveletek” folyamatban szigorúan sorban, a szerver operációs rendszerének fájlrendszerével együttműködve dolgozódnak fel.
Az olvasási/írási műveletek általános felgyorsítása érdekében ezek a műveletek szálakban (threads) valósulnak meg, amelyeket az „Operációk” folyamat hoz létre. A szálak száma jellemzően megegyezik a megnyitott fájlok számával. Az ügyfelektől érkező olvasási/írási feladatok egy közös sorba kerülnek, és az első felszabaduló szál veszi el a feladatot a sor elejéről. Egy speciális logika lehetővé teszi a szerver memóriájában a megírt adatok visszaírásának elkerülését.
Az „Operációk” folyamat figyelemmel kíséri az ügyfelek aktivitását, és megszünteti a kiszolgálásukat, ha úgy parancsolják, vagy ha túllépik a tétlen időkorlátot.
A megbízhatóság biztosítása érdekében a Cageserver naplózza az összes tranzakciót. Egy közös napló tartalmazza az ügyfelektől érkező üzenetek másolatait létrehozási/megnyitási/átnevezési/törlési feladatokkal kapcsolatban. Minden egyes munka fájlhoz külön napló készül, amelyben az adott fájl olvasási és írási feladatainak üzenetei, valamint az írt (új) adathalmazok és a felülírás során megsemmisült adathalmazok találhatók.
Ezek a naplók lehetővé teszik a legújabb módosítások helyreállítását a biztonsági másolatokból, valamint lehetőséget adnak a „visszaállásra” a jelenlegi tartalomról egy korábbi időpontra.
A Cageserver körülbelül 3100 kódsorból áll.

A Cageserver fájl szerver program indítása
Indításkor a párbeszédpanelben meg kell határozni:
— az alapport az azonosításhoz;
— a tranzakciók hivatalos ügyfeleikkel való cseréjéhez szükséges portok számát (1 vagy több, a számok áramlása az alapport következő számával kezdődik).
A Cage osztály használata
class cage.Cage( cage_name=», pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file=»» )
Ebből az osztályból objektumok születnek, amelyek interakciót valósítanak meg a fájl szerverekkel és tartalmaznak puffer memóriát.
Beállítások
- cage_name(str) — az objektum azonosításához használt feltételes név, amely az ügyfelek azonosításában segít a szerver oldalán
- pagesize(egész) — a puffer memória egy oldalának mérete (bájtokban)
- numpages(egész) — a puffer memória oldalainak száma
- maxstrlen(egész) — a byte string maximális hossza írási és olvasási műveletek során
- server_ip(dict) — a használt címek szótára szerverek, ahol a kulcs a szerver feltételes neve (a szerver azonosítója az alkalmazáson belül), az érték pedig egy cím: “ip cím:port” vagy “DNS:port” (a nevek és a valódi címek összehangolása ideiglenes, változtatható)
- várakozás(egész) — a válasz várakozási ideje a szervertől kapott portok esetében (másodpercben)
- ébren(boolean) — a objektum létrehozásának módjára vonatkozó zászló (False — ha új objektumot hozunk létre, Igaz — ha az objektum egy korábban «összeomlott» állapotból áll helyre a „hibernálás” művelet segítségével, alapértelmezés szerint Hamis)
- cache_file(str) — a hibernáláshoz használt fájl neve
Módszerek
Börtön.file_create( szerver, útvonal ) – új fájl létrehozása
Börtön.file_rename( szerver, útvonal, új_név ) – fájl átnevezése
Börtön.file_remove( szerver, útvonal) – fájl törlése
Börtön.open( szerver, útvonal, mod ) – fájl megnyitása
Visszaadja fchannel csatorna száma. A paraméter mod — a fájl megnyitásának módja: „wm” — kizárólagos (olvasás/írás), „rs” — csak olvasás, és más kliensek által megosztott csak olvasásra, „ws” — olvasás/írás, és más kliensek által megosztott csak olvasásra.
Börtön.close (fchannel) – fájl bezárása
Börtön.write (fchannel, kezdet, adat ) – bájt-sorozat írása a fájlba
Börtön.read (fchannel, kezdet, len_data ) – bájt-sorozat olvasása a fájlból
Börtön.put_pages ( fchannel ) – „kiüríti” a pufferből a szerverre az összes módosított oldalt a megadott csatornából. Akkor használatos, ha biztosra akarunk menni, hogy az összes művelet a csatornán fizikailag elmentésre került a fájlban a szerveren.
Börtön.push_all () – „kiüríti” a pufferből a szerverre az összes módosított oldalt minden csatornából a Cage osztály példányához. Akkor használatos, amikor biztosra akarunk menni, hogy az összes művelet az összes csatornán elmentésre került a szerveren.
Forrás: habr.com
