Сістэма выдаленага файлавага доступу Cage

прызначэнне сістэмы

Падтрымка выдаленага доступу да файлаў на кампутарах у сетцы. Сістэма "віртуальна" падтрымлівае ўсе асноўныя файлавыя аперацыі (стварэнне, выдаленне, чытанне, запіс і інш.) шляхам абмену транзакцыямі (паведамленнямі) па пратаколе ТСР.

вобласці прымянення

Функцыянал сістэмы эфектыўны ў наступных выпадках:

  • у натыўных прыкладаннях для мабільных і embedded прылад (смартфоны, бартавыя сістэмы кіравання і да т.п.), якія патрабуюць хуткага доступу да файлаў на выдаленых серверах ва ўмовах верагодных часавых перапынкаў у сувязі (з сыходам у афлайн);
  • у нагружаных СКБД, калі апрацоўка запытаў вырабляецца на адных серверах, а захоўванне дадзеных - на іншых;
  • у размеркаваных карпаратыўных сетках збору і апрацоўкі інфармацыі, якія патрабуюць высокай хуткасці абмену дадзенымі, рэзерваванні і надзейнасці;
  • у складаных сістэмах з мікрасэрвіснай архітэктурай, дзе затрымкі ў абмене інфармацыі паміж модулямі маюць крытычна важнае значэнне.

Структура

Сістэма Cage (маецца рэалізацыя – beta-версія на Python 3.7 у АС Windows) уключае дзве асноўныя часткі:

  1. Cageserver - праграма файл-сервера (пакет функцый), якая запускаецца на кампутарах у сетцы, да файлаў якіх неабходны выдалены доступ;
  2. клас Клетка з бібліятэкай метадаў для кліенцкага ПЗ, якое спрашчае кадаваньне ўзаемадзеяння з серверамі.

Выкарыстанне сістэмы на баку кліентаў

Метады класа 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. Раўналежна кампутар з файл-серверам можа выконваць любую іншую працу.

Сервер запускаецца спачатку як сукупнасць двух асноўных працэсаў:

  1. "Злучэнні" - працэс для выканання аперацый устанаўлення сувязі з кліентамі і яе спынення па ініцыятыве сервера;
  2. "Аперацыі" - працэс для выканання заданняў (аперацый) кліентаў па рабоце з файламі, а таксама для закрыцця сеансаў сувязі па камандах кліентаў.

Абодва працэсу не сінхранізаваны і арганізаваны як бясконцыя цыклы прыёму і адпраўкі паведамленняў на аснове мультыпрацэсных чэргаў, проксі-аб'ектаў, замкаў і сокетаў.
Працэс "Злучэнні" вылучае кожнаму кліенту порт для прыёму-перадачы дадзеных. Колькасць партоў задаецца пры запуску сервера. Адпаведнасць паміж партамі і кліентамі захоўваецца ў падзялянай паміж працэсамі проксі-памяці.

Працэс "Аперацыі" падтрымлівае падзел файлавых рэсурсаў, пры гэтым некалькі розных кліентаў могуць сумесна (квазіпаралельна, так як доступ кіруецца замкамі) чытаць дадзеныя з аднаго файла, калі гэта было дазволена пры яго пачатковым адкрыцці "першым" кліентам.

Апрацоўка каманд на стварэнне/выдаленне /адкрыццё/зачыненне файлаў на серверы вырабляецца ў самім працэсе "Аперацыі" строга паслядоўна з выкарыстаннем файлавай падсістэмы АС сервера.

Для агульнага паскарэння чытання/запісу гэтыя аперацыі ажыццяўляюцца ў патоках (threads), якія спараджаюцца працэсам "Аперацыі". Лік струменяў, як правіла, роўна колькасці адчыненых файлаў. Заданні на чытанне/запіс ад кліентаў падаюцца ў агульную чаргу і першы які вызваліўся струмень забірае заданне з яе галавы. Адмысловая логіка дазваляе выключыць аперацыі перазапісу дадзеных у аператыўнай памяці сервера.

Працэс "Аперацыі" сочыць за актыўнасцю кліентаў і спыняе іх абслугоўванне як па іх камандам, так і пры перавышэнні таймаўту неактыўнасці.

Для забеспячэння надзейнасці Cageserver вядзе часопісы ўсіх транзакцый. Адзін агульны часопіс змяшчае копіі паведамленняў ад кліентаў з заданнямі на стварэнне / адкрыццё / перайменаванне / выдаленне файлаў. Для кожнага працоўнага файла ствараецца асобны часопіс, у якім запісваюцца копіі паведамленняў з заданнямі на чытанне і запіс дадзеных у гэтым працоўным файле, а таксама масівы якія запісваюцца (новых) дадзеных і масівы дадзеных, якія апынуліся знішчаныя пры перазапісе (запісы новых дадзеных "па-над" старых ).

Гэтыя часопісы забяспечваюць магчымасць як для аднаўлення новых змен у рэзервовых копіях, так і для "адкату" ад бягучага змесціва да патрэбнага моманту ў мінулым.

Cageserver - гэта каля 3100 радкоў кода.

Сістэма выдаленага файлавага доступу Cage

Запуск праграмы файл-сервера Cageserver

Пры запуску ў дыялогу трэба вызначыць:
- асноўны порт для аўтарызацыі;
- колькасць партоў для абмену транзакцыямі з аўтарызаванымі кліентамі (ад 1-га і больш, пул нумароў пачынаецца з наступнага за нумарам асноўнага порта).

Выкарыстанне класа 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(дыктуюць) - слоўнік з адрасамі выкарыстоўваных сервераў, дзе ключом з'яўляецца ўмоўнае імя сервера (id сервера ўсярэдзіне прыкладання), а значэннем радок з адрасам: "ip address:port" або "DNS:port" (супастаўленне імёнаў і рэальных адрасоў - часавае, яго можна мяняць)
  • чакаць(INT) - час чакання адказу ад сервера пры атрыманні партоў (у сек.)
  • чувае(лагічны) - сцяг спосабу стварэння аб'екта (фальшывы - калі ствараецца новы аб'ект, праўда - калі аб'ект ствараецца з раней "згорнутага" - ужываннем аперацыі "гібернацыі", па змаўчанні False)
  • cache_file(str) - імя файла для гібернацыі

метады

Клетка.file_create( server, path ) – стварыць новы файл

Клетка.file_rename( server, path, new_name ) – перайменаваць файл

Клетка.file_remove( server, path) – выдаліць файл

Клетка.адкрыць( server, path, mod ) – адкрыць файл

вяртае fchannel нумар канала. Параметр модуль - Гэта рэжым адкрыцця файла: "wm" - манапольны (чытанне / запіс), "rs" - толькі чытанне, і падзяляемы толькі для чытання іншымі кліентамі, "ws" - чытанне / запіс, і падзяляемы толькі для чытання іншымі кліентам.

Клетка.блізка (fchannel) – зачыніць файл

Клетка.запіс (fchannel, begin, data ) – запісаць байтавы радок у файл

Клетка.счытванне (fchannel, begin, len_data ) – прачытаць байтавы радок з файла

Клетка.put_pages ( fchannel ) – "выштурхвае" з буфера на сервер усе старонкі названага канала, якія былі мадыфікаваны. Выкарыстоўваецца ў тых кропках алгарытму, калі трэба быць упэўненым, што ўсе аперацыі на канале фізічна захаваны ў файле на серверы.

Клетка.push_all () – "выштурхвае" з буфера на сервер усе старонкі ўсіх каналаў для асобніка класа Cage, якія былі мадыфікаваны. Выкарыстоўваецца, калі трэба быць упэўненым, што ўсе аперацыі на ўсіх каналах захаваны на серверы.

Крыніца: habr.com

Дадаць каментар