Úvod

Distribuovaný zálohovací systém byl napsán jako projekt do předmětu Distribuované objektové systémy v prostředí CORBA. Tato implementace je kompletně napsána v jazyce Java a popis jejích rozhraní naleznete v Backup.idl. Nákres jádra systému a stručný popis struktur, typů, sekvencí a vyjímek naleznete na obrázku Backup.png.

Požadavky

Systém byl napsán v jazyce Java 1.2, některé části (Storage, GUI) využívají prostředí Swing a JFC, zbytek by měl být zpětně kompatibilní s jazykem JDK 1.1. Systém byl odladěn na ORBu ORBACUS 4.0 pod OS Linux s jádrem 2.2.x a v případě jeho přenosu pod jiný ORB či OS bude nutné upravit spouštěcí skripty a zejména inicializaci NameService. Bez nároku na jakoukoliv kontrolu funkčnosti byl systém přeložen i pod ORBem JacOrb-1.2.2, ovšem nebyl použit jeho NameService.

Vhodné úpravy

Překlad

Před započetím překladu musí být do CLASSPATH přidán balík obsahující ORB a (pokud není v tomtéž balíku) balík obsahující NameService. V případě ORBACUSu verze 4 se jedná o balíky OB.jar a OBNaming.jar
  1. Vygenerovat z IDL stuby a skeletony pomocí generátoru (jidl, idl2java, atd).
  2. Přeložit všechny soubory .java, např. jikes *.java
  3. Upravit skript run2 tak, aby server a port, uvedený za corbaloc:: odpovídal serveru a portu na němž bude běžet NameService
  4. Upravit skript goNaming, aby odpovídal NameService použitého ORBu a portu, na němž má NameService běžet.

Spuštění

  1. skriptem startLN se spustí Logger a NameService.
  2. skriptem startS spustit na lib. počítači Storage, v adresáři jí vyhrazeném
  3. skriptem startC spustit na lib. počítači řídící jednotku
  4. skriptem startAg s parametrem jméno_agenta a popř. -nopass, pokud má běžet bez hesla, spustit na zálohovaném stroji agenta. Pokud již agent s tímto jménem běží, agent nebude spuštěn.
  5. skriptem startGUI spustit v prostředí (X) Windows grafické uživatelské rozhraní, zadat v něm jméno a heslo agenta a pak dále pracovat se zál. pravidly nebo provést obnovu.

Popis jednotlivých tříd

Společné třídy

Global Pomocná třída, zaobalující styk s NameService do volání vlastních metod mj. má metodu LogMessage, která na Logger zapíše zprávu
NotInitializedException Vyjímka v Javě, která je vyhozen v případě, kdy Global není inicializován voláním metody initialize
DateUtil Pomocná třída, která převádí datum v řetězci (DateTime) na java.util.Date a naopak
SIDUtil Pomocná třída pro práci se Session ID a jeho generování

Servery

Třídy *Server slouží ke spuštění implementace objektu (*Impl) a jeho zaregistrování u NameService.

Implementace objektů

LoggerImpl Implementace interface Logger - chybová konzola
AgentImpl Implementace interface Agent - zálohovací agent
StorageImpl Implementace interface Storage - jednotka, uchovávající zálohy
DummyStorageImpl Implementace interface Storage prostřednictvím použití agenta, pro testovací účely předcházející zprovoznění Storage
ControlImpl Implementace interface Control - řídící jednotka
FileChunkerImpl Implementace interface FileChunker rozsekávajícího soubory na malé části, aby snadněji prošly sítí a nezabraly veškerou paměť
FileIteratorImpl Implementace interface FileIterator posílajícího postupně jednotlivé soubory

Storage a agent

FileSender Javovský Interface, popisující objekt, implementující metody getFile pro získání souboru objektem FileIterator
FileMaskExpander Expanze souborové masky na agentovi
FileMaskExpander Expanze souborové masky na agentovi
StorageFileMaskExpander Expanze souborové masky na Storage při obnově, včetně zip archívu, v němž je soubor uložen
RestoreInfo Uložený rozsah obnovováni od-do (pro Storage)

GUI - uživatelské rozhraní

GUI Základní část grafického rozhraní
RefreshGUI Vlákno, které v pravidelných intervalech posílá požadavek na refresh okna se seznamem pravidel, aby se promítly změny, které plynou z činnosti řídící jednotky či jiného GUI
LoginFrame Přihlašovací okno - zadejte název agenta a heslo
RuleListPanel Okno se seznamem pravidel pro agenta
RulePanel Okno pro zobrazení, změnu a tvorbu pravidla
ExpireFrame Okno pro zrušení starých záloh tohoto agenta
RestoreFrame Okno pro zadání intervalu obnovy a masek obnovovaných souborů
MessageFrame Okno se zprávou (restoring...)

Komunikace mezi jednotlivými částmi

Zadávání pravidel

GUI pošle na Agenta po přihlašovacím okně zprávu checkPassword (pokud agent zadaného jména existuje) a pokud je heslo v pořádku získá všechna pravidla z Control. Ta zobrazí a k dalšímu odebírání a přidávání pravidel na řídící jednotce používá metod addRule a removeRule.

Zálohování

Řídící logika periodicky prochází seznam pravidel a hledá ta, jejichž čas začátku je menší nebo roven současnému. Tato pravidla pak vybere, jde-li o opakované pravidlo, pak přidá do seznamu nové pravidlo přeplánované na nový čas (interval opakování nemůže být menší než minimální interval, nastavený v řídící jednotce - std. 15 minut). Sloučí pravidla pro jednoho agenta dohromady, aby nebyly některé zálohy prováděny duplicitně. Pak pro každé pravidlo pošle na agenta, který mu odpovídá zprávu startSession s heslem, jež má uloženo a vygenerovaným Session ID a na Storage zprávu backupFiles s tímto Session ID, Agentem a seznamem masek souborů. Storage zašle na agenta zprávu sendFiles a ten mu vrátí iterátor souborů. Dále jsou používány metody nextFile, nextChunk, ... Na závěr pošle Storage na agenta zprávu endSession a vyřadí tím toto Session ID ze seznamu použitelných.

Obnova souborů

Obdobně jako zálohování probíhá obnova, zdrojem je však místo řídící jednotky GUI a místo backupFiles na Storage je posláno restoreFiles na agenta. Ten také pošle na závěr endSession na Storage. Vlastní obnově může předcházet (a v naší implementaci GUI i předchází) poslání zprávy setRestoreInterval, která udává rozmezí, v němž začaly zálohy obnovovaných souborů.