Cage Remote File Access System

Sistema celo

Subteno por fora aliro al dosieroj en komputiloj en la reto. La sistemo "preskaŭ" subtenas ĉiujn bazajn dosieroperaciojn (kreo, forigo, legado, skribo, ktp.) per interŝanĝado de transakcioj (mesaĝoj) uzante la TCP-protokolon.

Aplikoj

La funkcieco de la sistemo estas efika en la sekvaj kazoj:

  • en denaskaj aplikoj por poŝtelefonoj kaj enkonstruitaj aparatoj (smartphones, enbordaj kontrolsistemoj, ktp.), kiuj postulas rapidan aliron al dosieroj sur foraj serviloj antaŭ eblaj provizoraj interrompoj en komunikado (kun malkonektado);
  • en ŝarĝitaj DBMSoj, se pritraktado de demandoj estas efektivigita sur iuj serviloj, kaj datumstokado estas efektivigita sur aliaj;
  • en distribuitaj kompaniaj retoj por kolektado kaj prilaborado de informoj, postulante altrapidan datumŝanĝon, redundon kaj fidindecon;
  • en kompleksaj sistemoj kun mikroserva arkitekturo, kie prokrastoj en la interŝanĝo de informoj inter moduloj estas kritikaj.

strukturo

La Cage-sistemo (estas efektivigo - beta-versio en Python 3.7 en Vindozo) inkluzivas du ĉefajn partojn:

  1. Cageserver — dosierservila programo (pakaĵo da funkcioj), kiu funkcias per komputiloj en la reto, kies dosieroj postulas foran aliron;
  2. klaso kaĝo kun biblioteko de metodoj por klienta programaro, simpligante la kodigon de interago kun serviloj.

Uzante la sistemon ĉe la klienta flanko

La metodoj de la Cage-klaso anstataŭigas la kutimajn, "rutinajn" dosiersistemajn operaciojn: kreado, malfermo, fermo, forigo dosierojn, same kiel legado/skribado de datumoj en binara formato (indikante la pozicion kaj grandecon de la datumoj). Koncipe, ĉi tiuj metodoj estas proksimaj al la dosierfunkcioj de la C-lingvo, kie malfermi/fermi dosierojn estas faritaj "sur kanaloj" de enigo/eligo.

Alivorte, la programisto ne laboras kun metodoj de "dosiero" objektoj (klaso _io en Python), sed kun metodoj de la Cage-klaso.

Kiam okazo de Cage-objekto estas kreita, ĝi establas komencan ligon kun servilo (aŭ pluraj serviloj), estas rajtigita de la Kliento Id, kaj ricevas konfirmon kun dediĉita havennumero por ĉiuj dosieroperacioj. Kiam Cage-objekto estas forigita, ĝi instrukcias la servilon ĉesi komuniki kaj fermi la dosierojn. Finiĝo de komunikado ankaŭ povas esti iniciatita de la serviloj mem.

La sistemo plibonigas legadon/skriban efikecon bufferante ofte uzatajn dosierfragmentojn de klientprogramoj en la RAM-kaŝmemoro (bufro).
Klienta programaro povas uzi ajnan nombron da Cage-objektoj kun malsamaj agordoj (buffermemorgrandeco, blokgrandeco dum interŝanĝado kun la servilo, ktp.).

Ununura Cage-objekto povas komuniki kun pluraj dosieroj sur pluraj serviloj. Komunikaj parametroj (IP-adreso aŭ DNS-servilo, ĉefa haveno por rajtigo, vojo kaj dosiernomo) estas specifitaj dum kreado de la objekto.

Ĉar ĉiu Cage-objekto povas labori kun pluraj dosieroj samtempe, komuna memorspaco estas uzata por bufro. Cache-grandeco - la nombro da paĝoj kaj ilia grandeco, estas agordita dinamike dum kreado de Cage-objekto. Ekzemple, kaŝmemoro de 1 GB estas 1000 paĝoj de 1 MB ĉiu, aŭ 10 mil paĝoj de 100 KB ĉiu, aŭ 1 miliono da paĝoj de 1 KB ĉiu. Elekti la grandecon kaj nombron da paĝoj estas specifa tasko por ĉiu aplikaĵo.

Vi povas uzi plurajn Cage-objektojn samtempe por difini malsamajn bufromemorajn agordojn depende de kiel informoj estas aliritaj en malsamaj dosieroj. Kiel baza, oni uzas la plej simplan bufran algoritmon: post kiam certa kvanto da memoro estas elĉerpita, novaj paĝoj anstataŭigas malnovajn laŭ la principo de retiriĝo kun minimuma nombro da aliroj. Buffering estas precipe efika en la kazo de neegala (en statistika signifo) komuna aliro, unue, al malsamaj dosieroj, kaj, due, al fragmentoj de ĉiu dosiero.

La Cage-klaso subtenas I/O ne nur per datenadresoj (indikante la pozicion kaj longon de la tabelo, "anstataŭigante" dosiersistemajn operaciojn), sed ankaŭ je pli malalta, "fizika" nivelo - per paĝnumeroj en bufromemoro.

La originala funkcio estas subtenata por Cage-objektoj "vintrodormo" ("dormo") - ili povas esti "kolapsitaj" (ekzemple, okaze de perdo de konekto kun serviloj, aŭ kiam la aplikaĵo estas ĉesigita, ktp.) en lokan rubodosieron ĉe la klientflanko kaj rapide restarigitaj de ĉi tiu dosiero (post kiam komunikado estas rekomencita, kiam vi rekomencas la aplikaĵon). Ĉi tio ebligas signife redukti trafikon kiam vi aktivigas la klientprogramon post provizore "senrete", ĉar ofte uzataj dosierfragmentoj jam estos en la kaŝmemoro.

Cage estas ĉirkaŭ 3600 linioj de kodo.

Principoj de servila konstruo

Cagesserver-dosierserviloj povas funkcii per arbitra nombro da havenoj, unu el kiuj ("ĉefa") estas uzata nur por rajtigo de ĉiuj klientoj, la ceteraj estas uzataj por interŝanĝo de datumoj. La Cage-servila programo postulas nur Python. Paralele, la komputilo kun la dosierservilo povas plenumi ajnan alian laboron.

La servilo komenciĝas komence kiel kolekto de du ĉefaj procezoj:

  1. "Konektoj" - procezo por plenumi la operaciojn establi komunikadon kun klientoj kaj ĉesigi ĝin laŭ iniciato de la servilo;
  2. "Operacioj" – procezo por plenumi taskojn (operaciojn) de klientoj por labori kun dosieroj, kaj ankaŭ por fermi komunikajn sesiojn bazitajn sur klientaj komandoj.

Ambaŭ procezoj ne estas sinkronigitaj kaj estas organizitaj kiel senfinaj bukloj de ricevado kaj sendado de mesaĝoj bazitaj sur multprocezaj atendovicoj, prokuraj objektoj, seruroj kaj ingoj.
La procezo de Konekto asignas havenon por ĉiu kliento por ricevi kaj transdoni datumojn. La nombro da havenoj estas agordita kiam la servilo komenciĝas. La mapado inter havenoj kaj klientoj estas konservita en interproces-dividita prokurmemoro.

La Operacia procezo subtenas kunhavigi dosierresursojn tiel ke pluraj malsamaj klientoj povas kunhavigi (kvazaŭ paralela, ĉar aliro estas kontrolita per seruroj) legis datumojn de unu dosiero se tio estis permesita kiam ĝi estis komence malfermita fare de la "unua" kliento.

Pretigo de komandoj por krei/forigi/malfermi/fermi dosierojn sur la servilo estas efektivigita en la "Operaciaj" procezo mem strikte sinsekve uzante la dosiersubsistemon de la servila OS.

Por ĝenerale akceli legadon/skribi, ĉi tiuj operacioj estas faritaj en fadenoj generitaj de la "Operacioj" procezo. La nombro da fadenoj estas kutime egala al la nombro da malfermitaj dosieroj. Legaj/skribi taskoj de klientoj estas submetitaj al la ĝenerala atendovico kaj la unua libera fadeno prenas la taskon de sia kapo. Speciala logiko ebligas al vi forigi datumreskribajn operaciojn en la RAM de la servilo.

La Operacia procezo monitoras klientan agadon kaj ĉesas servi ilin aŭ laŭ iliaj komandoj aŭ kiam la senaktivectempo estas superita.

Por certigi fidindecon, Cageserver konservas protokolojn de ĉiuj transakcioj. Unu ĝenerala protokolo enhavas kopiojn de mesaĝoj de klientoj kun taskoj por krei/malfermi/alinomi/forigi dosierojn. Aparta protokolo estas kreita por ĉiu labordosiero, en kiu estas registritaj kopioj de mesaĝoj kun taskoj por legi kaj skribi datumojn en ĉi tiu labordosiero, same kiel tabeloj de skribitaj (novaj) datumoj kaj tabeloj de datumoj, kiuj estis detruitaj dum anstataŭigo (skribado). novaj datumoj "supere" de malnovaj). ).

Ĉi tiuj protokoloj disponigas la kapablon kaj restarigi novajn ŝanĝojn al sekurkopioj kaj refari aktualan enhavon al punkto en la pasinteco.

Cageserver estas ĉirkaŭ 3100 linioj de kodo.

Cage Remote File Access System

Lanĉante la programon de dosierservilo Cageserver

Komencante, en la dialogo vi devas difini:
— ĉefa haveno por rajtigo;
— la nombro da havenoj por interŝanĝi transakciojn kun rajtigitaj klientoj (de 1 aŭ pli, la aro de nombroj komenciĝas de tiu apud la ĉefa havennumero).

Uzante la Cage Class

klaso kaĝo.kaĝo( cage_name="", pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, wake=False, cache_file="" )

Objektoj estas kreitaj de ĉi tiu klaso, kiuj interagas kun dosierserviloj kaj enhavas bufran memoron.

parametroj

  • kaĝo_nomo(p) - kondiĉa nomo de la objekto, kiu estas uzata por identigi klientojn ĉe la servilo
  • paĝgrandeco(int) - grandeco de unu paĝo de bufromemoro (en bajtoj)
  • nombroj(int) — nombro da bufromemorpaĝoj
  • maxstrlen(int) - la maksimuma longo de bajta ĉeno en skribaj kaj legaj operacioj
  • servilo_ip(dikt) - vortaro kun la adresoj de la uzataj serviloj, kie la ŝlosilo estas la kondiĉa nomo de la servilo (servila id ene de la aplikaĵo), kaj la valoro estas ĉeno kun la adreso: "ip-adreso:porto" aŭ "DNS: haveno" (la komparo de nomoj kaj veraj adresoj estas provizora, ĝi povas esti ŝanĝita)
  • atendu(int) - atendanta tempo por respondo de la servilo dum ricevado de havenoj (en sekundoj)
  • maldorma(bulea) — flago de kiel la objekto estas kreita (falsa - se nova objekto estas kreita, veraj - se objekto estas kreita de antaŭe "kolapsita" - uzante la operacion "vintrodormo, False defaŭlte)
  • kaŝmemoro_dosiero(p) - dosiernomo por vintrodormo

Metodoj

Kaĝo.dosiero_krei( servilo, vojo ) – kreu novan dosieron

Kaĝo.dosiero_alinomi( servilo, vojo, nova_nomo ) - renomu la dosieron

Kaĝo.dosiero_forigi( servilo, vojo) - forigi dosieron

Kaĝo.malfermita( servilo, vojo, mod ) - malfermu dosieron

Revenas fkanalo kanalnumero. Parametro mod - ĉi tiu estas la dosiermalferma reĝimo: "wm" - ekskluziva (legi/skribi), "rs" - nurlegebla, kaj kundividata nur por legado de aliaj klientoj, "ws" - legi/skribi, kaj dividita nur por legado de aliaj klientoj.

Kaĝo.proksimaj (fkanalo) – fermu la dosieron

Kaĝo.skribi (fchannel, komenci, datumoj ) – skribu bajtan ĉenon al dosiero

Kaĝo.legi (fchannel, komenci, len_data ) – legi bajtan ĉenon el dosiero

Kaĝo.meti_paĝojn ( fkanalo ) - "puŝas" de la bufro al la servilo ĉiujn paĝojn de la specifita kanalo kiuj estis modifitaj. Ĝi estas uzata ĉe tiuj punktoj en la algoritmo kiam vi devas esti certa, ke ĉiuj operacioj sur la kanalo estas fizike konservitaj en dosiero sur la servilo.

Kaĝo.push_all () – "puŝas" de la bufro al la servilo ĉiujn paĝojn de ĉiuj kanaloj por ekzemplo de la Cage-klaso kiu estis modifita. Uzita kiam vi devas esti certa, ke ĉiuj operacioj sur ĉiuj kanaloj estas konservitaj en la servilo.

fonto: www.habr.com

Aldoni komenton