Účel systému
Podpora vzdáleného přístupu k souborům na počítačích v síti. Systém „virtuálně“ podporuje všechny základní souborové operace (vytváření, mazání, čtení, zápis atd.) prostřednictvím výměny transakcí (zpráv) pomocí protokolu TCP.
Oblasti použití
Funkčnost systému je efektivní v následujících případech:
- v nativních aplikacích pro mobilní a embedded zařízení (chytré telefony, palubní řídicí systémy atd.), které vyžadují rychlý přístup k souborům na vzdálených serverech za podmínek pravděpodobných časových výpadků v připojení (při odchodu do offline);
- v zatížených DBMS, pokud je zpracování požadavků prováděno na jedněch serverech, zatímco uchovávání dat – na jiných;
- v distribuovaných podnikových sítích pro sběr a zpracování informací, které vyžadují vysokou rychlost výměny dat, zálohování a spolehlivost;
- v komplexních systémech s mikroservisní architekturou, kde zpoždění v výměně informací mezi moduly má kritický význam.
Struktura
Systém Cage (existuje implementace – beta verze na Python 3.7 v OS Windows) zahrnuje dvě hlavní části:
- Cageserver — program souborového serveru (balíček funkcí), který je spuštěn na počítačích v síti, k souborům kterých je třeba vzdáleného přístupu;
- třída Cage s knihovnou metod pro klientské softwarové aplikace, která usnadňuje kódování interakce se servery.
Použití systému na straně klientů
Metody třídy Cage nahrazují běžné, „rutinní“ operace souborového systému: vytváření, otevírání, zavírání, mazání souborů, jakož i čtení/zápis dat v binárním formátu (s uvedením pozice a velikosti dat). Koncepčně tyto metody přibližují k souborovým funkcím jazyka C, kde se otevírání/zavírání souborů provádí „na kanálech“ vstupu/výstupu.
Jinými slovy, programátor nepracuje s metodami „souborových“ objektů (třídy _io v Pythonu), ale s metodami třídy Cage.
Při vytváření instance objektu Cage se navazuje počáteční spojení se serverem (nebo několika servery), provádí autorizaci podle ID klienta a získává potvrzení s číslem přiděleného portu pro provádění všech souborových operací. Při odstranění objektu Cage vydává serveru příkaz k ukončení spojení a uzavření souborů. Ukončení spojení mohou iniciovat i samotné servery.
Systém zvyšuje výkonnost čtení/zápisu na základě vyrovnání často používaných fragmentů souborů klientskými programy v mezipaměti (cache) operační paměti.
Klientský software může použít libovolný počet objektů Cage s různými nastaveními (velikost vyrovnávací paměti, velikost bloků při výměně se serverem atd.).
Jeden objekt Cage může vyměňovat data s několika soubory na několika serverech. Parametry pro spojení (IP adresa nebo DNS serveru, hlavní port pro autorizaci, cesta a název souboru) jsou zadány při vytvoření objektu.
Jelikož každý objekt Cage může současně pracovat s mnoha soubory, pro vyrovnávání se používá sdílený prostor paměti. Velikost cache – množství stránek a jejich velikost, se stanovuje dynamicky při vytvoření objektu Cage. Například cache o velikosti 1 GB – to je 1000 stránek po 1 MB, nebo 10 000 stránek po 100 kB, nebo 1 milion stránek po 1 kB. Výběr velikosti a počtu stránek je konkrétní úkol pro každý aplikační případ.
Lze současně použít několik objektů Cage, aby se definovala různá nastavení vyrovnávací paměti v závislosti na zvláštnostech přístupu k informacím v různých souborech. Jako základní se používá nejjednodušší algoritmus vyrovnávání: po vyčerpání stanoveného objemu paměti nové stránky vytlačují staré podle principu vyřazení s minimálním počtem přístupů. Vyrovnávání je obzvláště efektivní v případě nerovnoměrného (v statistickém smyslu) společného přístupu, jednak k různým souborům, a jednak k fragmentům každého souboru.
Třída Cage podporuje vstup/výstup nejen podle adres dat (se zadáním pozice a délky pole, "nahrazující" operace souborového systému), ale také na nižší, "fyzické" úrovni – podle čísel stránek v vyrovnávací paměti.
Pro objekty Cage je podporována originální funkce "hibernace" („sny“) – lze je „sbalit“ (například v případě ztráty spojení se servery nebo při zastavení aplikace atd.) do místního dumpu na straně klienta a rychle obnovit z tohoto souboru (po obnovení spojení, při opětovném spuštění aplikace). To umožňuje významné snížení datového provozu při aktivaci klientského programu po dočasném „offline“ režimu, protože často používané části souborů již budou v cache.
Cage – to je přibližně 3600 řádků kódu.
Principy výstavby serverů
Cage-serverové soubory lze spouštět s libovolným počtem portů, přičemž jeden z nich („hlavní“) se používá pouze pro autorizaci všech klientů, ostatní – pro výměnu dat. Pro program serveru Cage je potřebný pouze Python. Současně může počítač s file-serverem vykonávat jakoukoli jinou práci.
Server se na začátku spouští jako soubor dvou hlavních procesů:
- „Spojení“ – proces pro provádění operací navazování spojení s klienty a ukončení spojení na podnět serveru;
- „Operace“ – proces pro provádění úkolů (operací) klientů týkajících se práce se soubory a také pro ukončení sezení podle příkazů klientů.
Oba procesy nejsou synchronizovány a jsou organizovány jako nekonečné cykly příjmu a odesílání zpráv na základě multiprocessních front, proxy-objektů, zámků a socketů.
Proces „Spojení“ přiděluje každému klientovi port pro přijímání a odesílání dat. Počet portů je stanoven při spuštění serveru. Shoda mezi porty a klienty se uchovává ve sdílené mezi procesy proxy-paměti.
Proces „Operace“ podporuje rozdělení souborových zdrojů, přičemž několik různých klientů může společně (kvaziparalelně, protože přístup je řízen zámky) číst data z jednoho souboru, pokud to bylo povoleno při jeho počátečním otevření „prvním“ klientem.
Zpracování příkazů pro vytváření/mazání/otevření/uzavření souborů na serveru se provádí přímo v procesu „Operace“ přísně sekvenčně za použití souborového subsystému operačního systému serveru.
Pro urychlení čtení/zápisu se tyto operace provádějí v vláknech (threads), které vytváří proces „Operace“. Počet vláken je obvykle roven počtu otevřených souborů. Úkoly pro čtení/zápis od klientů jsou zasílány do společné fronty a první uvolněné vlákno si vezme úkol z jejího začátku. Speciální logika vylučuje operace přepisování dat v operační paměti serveru.
Proces „Operace“ sleduje aktivitu klientů a ukončuje jejich obsluhu jak na jejich příkazy, tak při překročení časového limitu neaktivity.
Pro zajištění spolehlivosti Cageserver vede záznamy všech transakcí. Jeden společný záznam obsahuje kopie zpráv od klientů s úkoly na vytváření/otevírání/přejmenovávání/mazání souborů. Pro každý pracovní soubor se vytváří samostatný záznam, ve kterém jsou zapisovány kopie zpráv s úkoly na čtení a zápis dat v tomto pracovním souboru, stejně jako pole zapisovaných (nových) dat a pole dat, která byla zničena při přepisování (zápisu nových dat „přes“ stará).
Tyto záznamy poskytují možnost jak pro obnovení nových změn v zálohách, tak pro „vracení“ od aktuálního obsahu k potřebnému okamžiku v minulosti.
Cageserver má přibližně 3100 řádků kódu.

Spuštění programu souborového serveru Cageserver
Při spuštění je třeba určit:
— hlavní port pro autorizaci;
— počet portů pro výměnu transakcí s autorizovanými klienty (od 1 a více, rozsah čísel začíná hned po čísle hlavního portu).
Použití třídy Cage
třída cage.Cage( cage_name=», pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file=»» )
Z této třídy jsou vytvářeny objekty, které provádějí interakci se souborovými servery a obsahují vyrovnávací paměť.
Parametry
- cage_name(str) — podmíněné jméno objektu, které se používá při identifikaci klientů na straně serveru
- pagesize(int) — velikost jedné stránky vyrovnávací paměti (v bytech)
- numpages(int) — počet stránek vyrovnávací paměti
- maxstrlen(int) — maximální délka bajtového řetězce při operacích zápisu a čtení
- server_ip(dict) — slovník s adresami používaných servery, kde klíčem je podmínkové jméno serveru (id serveru uvnitř aplikace) a hodnotou je řetězec s adresou: “ip adresa:port” nebo “DNS:port” (mapování jmen a skutečných adres je dočasné, lze je měnit)
- wait(int) — čas čekání na odpověď od serveru při získávání portů (v sek.)
- probuzený(boolean) — příznak způsobu vytváření objektu (Při provádění scénáře Nornir se do konzole vyprodukují podrobné logy. — pokud je vytvářen nový objekt, Pravda — pokud je objekt vytvářen z dříve „uspaného“ — použitím operace „hibernace“, výchozí hodnota False)
- cache_file(str) — název souboru pro hibernaci
Metody
Cage.file_create( server, cesta ) – vytvořit nový soubor
Cage.file_rename( server, cesta, new_name ) – přejmenovat soubor
Cage.file_remove( server, cesta) – odstranit soubor
Cage.open( server, cesta, mod ) – otevřít soubor
Vrátí fchannel číslo kanálu. Parametr mod — je režim otevření souboru: „wm“ — monopolní (čtení/zápis), „rs“ — pouze čtení, a sdílený pouze pro čtení jinými klienty, „ws“ — čtení/zápis, a sdílený pouze pro čtení jinými klienty.
Cage.close (fchannel) – zavřít soubor
Cage.write (fchannel, začátek, data ) – zapsat bajtový řetězec do souboru
Cage.read (fchannel, začátek, len_data ) – přečíst bajtový řetězec ze souboru
Cage.put_pages ( fchannel ) – „vytlačuje“ z bufferu na server všechny stránky daného kanálu, které byly modifikovány. Používá se v těch bodech algoritmu, kdy je třeba mít jistotu, že všechny operace na kanálu jsou fyzicky uloženy v souboru na serveru.
Cage.push_all () – „vytlačuje“ z bufferu na server všechny stránky všech kanálů pro instanci třídy Cage, které byly modifikovány. Používá se, když je třeba mít jistotu, že všechny operace na všech kanálech jsou uložené na serveru.
Zdroj: habr.com
