Назначение на системата
Поддръжка на отдалечен достъп до файлове на компютри в мрежата. Системата «виртуално» поддържа всички основни файлови операции (създаване, изтриване, четене, запис и др.) чрез обмен на транзакции (съобщения) по протокол TCP.
Области на приложение
Функционалността на системата е ефективна в следните случаи:
- в нативни приложения за мобилни и вградени устройства (смартфони, бордови системи за управление и т.н.), изискващи бърз достъп до файлове на отдалечени сървъри при вероятни времеви прекъсвания в свързаността (с излизане в офлайн);
- в натоварени СУБД, когато обработката на запитвания се извършва на едни сървъри, а съхранението на данни – на други;
- в разпределени корпоративни мрежи за събиране и обработка на информация, изискващи висока скорост на обмен на данни, резервиране и надеждност;
- в сложни системи с микроуслуги, където закъсненията в обмена на информация между модулите са от критично значение.
Структура
Системата Cage (има реализация — бета-версия на Python 3.7 в ОС Windows) включва две основни части:
- Cageserver — програма файл-сървър (пакет функции), която се стартира на компютри в мрежата, до файловете на които е необходим отдалечен достъп;
- клас Cage с библиотека от методи за клиентски приложения, улесняваща кодирането на взаимодействието със сървърите.
Използване на системата от страна на клиентите
Методите на класа Cage заменят обикновените, «рутине» операции на файловата система: създаване, отваряне, затваряне, изтриване на файлове, както и четене/писане на данни в бинарен формат (с указание на позицията и размера на данните). Концептуално тези методи са приближени до файловите функции на езика C, където отварянето/затварянето на файлове се извършва «на канали» за вход-изход.
С други думи, програмистът работи не с методите на «файловите» обекти (клас _io в Python), а с методите на класа Cage.
При създаването на екземпляр на обекта Cage той установява начална връзка със сървера (или с няколко сървъра), преминава авторизация по Id на клиента и получава потвърждение с номера на определен порт за извършване на всички файлови операции. При изтриване на обекта Cage, той изпраща команда на сървера за прекратяване на връзката и затваряне на файловете. Прекратяването на връзката може да бъде инициирано и от самите сървъри.
Системата увеличава производителността на четене/запис, основана на буферирането на често използвани фрагменти от файлове в кеша (буфера) на оперативната памет на клиентските програми.
Клиентският софтуер може да използва произволен брой обекти Cage с различни настройки (обем на буферната памет, размер на блоковете при обмен с сървера и др.).
Един обект Cage може да обменя данни с няколко файла на няколко сървъра. Параметрите за свързване (IP адрес или DNS на сървъра, основен порт за авторизация, път и име на файла) се задават при създаването на обекта.
Тъй като всеки обект Cage може да работи едновременно с множество файлове, за буфериране се използва общо пространство в паметта. Размерът на кеша – броят на страниците и техния размер, се задава динамично при създаването на обекта Cage. Например, кеш от 1 Гбайт е 1000 страници по 1 Мбайт или 10 хиляди страници по 100 Кбайт или 1 милион страници по 1 Кбайт. Изборът на размер и брой страници е конкретна задача за всеки отделен случай.
Може да се използват няколко обекта Cage едновременно, за да се определят различни настройки на буферната памет в зависимост от особеностите на достъпа до информация в различни файлове. Както основен, се прилага най-простият алгоритъм за буфериране: след изчерпването на зададения обем памет, новите страници заменят старите по принципа на изхвърляне с минимален брой достъпи. Буферирането е особено ефективно в случаи на неравномерно (в статистически смисъл) споделено достъпване, от една страна, до различни файлове, а от друга, до фрагменти от всеки файл.
Класът Cage поддържа въвеждане/извеждане не само по адреси на данни (с указване на позиция и дължина на масива, заменяйки операции на файловата система), но и на по-ниско, 'физическо' ниво — по номера на страниците в буферната памет.
За обектите Cage се поддържа оригинална функция „хибернация“ («сна») – те могат да бъдат «свити» (например, в случай на загуба на връзка със сървърите, или при спиране на приложението и др.) в локален дъмп файл на страна на клиента и бързо възстановени от този файл (след възстановяване на връзката, при повторно стартиране на приложението). Това позволява значително намаляване на трафика при активиране на клиентската програма след временно отсъствие «в офлайн», тъй като често използваните фрагменти от файлове вече ще се намират в кеша.
Cage — това е около 3600 реда код.
Принципи на изграждане на сървъри
Файл-сървърите Cageserver могат да се стартират с произволен брой портове, един от които («основен») се използва само за авторизация на всички клиенти, а останалите — за обмен на данни. За програмата на сървъра Cage е необходим само Python. Паралелно, компютърът с файл-сървъра може да извършва всяка друга работа.
Сървърът се стартира първоначално като набор от два основни процеса:
- «Свързване» – процес за извършване на операции по установяване на връзка с клиентите и прекратяване на връзката по инициатива на сървъра;
- «Операции» – процес за изпълнение на задачи (операции) на клиентите по работа с файлове, както и за затваряне на сесиите по команди на клиентите.
И двата процеса не са синхронизирани и са организирани като безкрайни цикли за прием и изпращане на съобщения на базата на многопроцесорни опашки, прокси обекти, блокировки и сокети.
Процесът «Свързване» разпредели на всеки клиент порт за приемане и предаване на данни. Броят на портовете се задава при стартиране на сървъра. Съответствието между портовете и клиентите се съхранява в споделена между процесите прокси памет.
Процесът «Операции» поддържа разделение на файловите ресурси, като позволява на няколко различни клиента заедно (квазипаралелно, тъй като достъпът се управлява от блокировки) да четат данни от един файл, ако това е било разрешено при първоначалното му отваряне от «първия» клиент.
Обработката на команди за създаване/изтриване/отваряне/затваряне на файлове на сървър се извършва в самия процес «Операции» строго последователно с използване на файловата подсистема на ОС на сървъра.
За общо ускорение на операциите по четене/писане, тези действия се извършват в потоци (threads), създавани от процеса "Операции". Броят на потоковете обикновено е равен на броя на отворените файлове. Заявките за четене/писане от клиентите се подават в обща опашка и първият освободил се поток взима задача от началото й. Специална логика позволява изключването на операции по презаписване на данни в оперативната памет на сървъра.
Процесът "Операции" следи активността на клиентите и прекратява обслужването им както по техни команди, така и при превишаване на таймаута на неактивност.
За осигуряване на надеждност, Cageserver води журнали на всички транзакции. Един общ журнал съдържа копия на съобщения от клиентите с задания за създаване/отваряне/преименуване/изтриване на файлове. За всеки работен файл се създава отделен журнал, в който се записват копия на съобщенията с задания за четене и писане на данни в този работен файл, както и масиви на записваните (нови) данни и масиви на данни, които са били унищожени при презаписване (запис на нови данни "върху" стари).
Тези журнали предоставят възможност както за възстановяване на новите промени в резервни копия, така и за "откат" от текущото съдържание към желан момент в миналото.
Cageserver е с около 3100 реда код.

Стартиране на програмата файл-сървър Cageserver
При стартиране в диалога трябва да се определи:
— основен порт за авторизация;
— брой портове за обмен на транзакции с авторизирани клиенти (от 1 и повече, пулът номера започва от следващия след основния порт).
Използване на класа Cage
class cage.Cage( cage_name=», pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file=»» )
От този клас се създават обекти, които извършват взаимодействие с файл-сървърите и съдържат буферна памет.
Параметри
- cage_name(str) — условно име на обект, което се използва при идентификация на клиентите на страната на сървера
- pagesize(int) — размер на една страница от буферната памет (в байтове)
- numpages(int) — брой на страниците от буферната памет
- maxstrlen(int) — максимална дължина на байтовата строка при операции по запис и четене
- server_ip(dict) — речник с адресите на използваните сървъри, където ключът е условното име на сървъра (идентификатор на сървъра в приложението), а стойността е стринг с адреса: “ip адрес:порт” или “DNS:порт” (съответствието на имената и реалните адреси е временно, може да бъде променяно)
- wait(int) — времето за изчакване на отговор от сървъра при получаване на портовете (в секунди)
- събуден(булев) — флаг за метода на създаване на обект (False — ако се създава нов обект, True — ако обектът се създава от преди „свити“ — чрез операцията „хибернация“, по подразбиране False)
- файл_кеш(str) — име на файла за хибернация
Методите
Cage.създаване_на_файл( сървър, път ) – създаване на нов файл
Cage.преименуване_на_файл( сървър, път, ново_име ) – преименуване на файл
Cage.премахване_на_файл( сървър, път) – изтриване на файл
Cage.open( сървър, път, мод ) – отваряне на файл
Връща канал номер на канала. Параметър мод — режим за отваряне на файла: „wm“ — монополен (четене/запис), „rs“ — само за четене, и споделен само за четене от други клиенти, „ws“ — четене/запис и споделен само за четене от други клиенти.
Cage.close (канал) – затваряне на файл
Cage.write (канал, начало, данни ) – записване на байтов низ във файл
Cage.read (канал, начало, дължина_данни ) – прочитане на байтов низ от файл
Cage.изпрати_страници ( канал ) – „изпраща“ от буфера на сървера всички страници на посочения канал, които са били модифицирани. Използва се в точките на алгоритъма, когато е нужно да сме сигурни, че всички операции на канала физически са запазени във файла на сървера.
Cage.изпрати_всички () – „изпраща“ от буфера на сървера всички страници на всички канали за екземпляра на класа Cage, които са били модифицирани. Използва се, когато трябва да сме сигурни, че всички операции на всички канали са запазени на сървера.
Източник: habr.com
