From a6f50cd59f1923a720e61ab6b6fade1bbefe09f4 Mon Sep 17 00:00:00 2001 From: hjp Date: Sun, 14 Jan 2007 22:30:44 +0000 Subject: [PATCH] Konzept --- doc/arch.obj | 341 ++++++++++++++++++++++++++++++++++++++++++++ doc/arch.png | Bin 0 -> 4843 bytes doc/konzept.html | 357 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 698 insertions(+) create mode 100644 doc/arch.obj create mode 100644 doc/arch.png create mode 100644 doc/konzept.html diff --git a/doc/arch.obj b/doc/arch.obj new file mode 100644 index 0000000..163f420 --- /dev/null +++ b/doc/arch.obj @@ -0,0 +1,341 @@ +%TGIF 4.1.45-QPL +state(0,37,100.000,0,200,0,16,1,6,1,1,0,0,1,0,1,0,'Courier',0,80640,0,0,1,10,0,0,1,0,0,16,0,0,1,1,1,1,1050,1485,0,0,2880,0). +% +% @(#)$Header$ +% %W% +% +unit("1 pixel/pixel"). +color_info(19,65535,0,[ + "magenta", 65535, 0, 65535, 65535, 0, 65535, 1, + "red", 65535, 0, 0, 65535, 0, 0, 1, + "green", 0, 65535, 0, 0, 65535, 0, 1, + "blue", 0, 0, 65535, 0, 0, 65535, 1, + "yellow", 65535, 65535, 0, 65535, 65535, 0, 1, + "pink", 65535, 49344, 52171, 65535, 49344, 52171, 1, + "cyan", 0, 65535, 65535, 0, 65535, 65535, 1, + "CadetBlue", 24415, 40606, 41120, 24415, 40606, 41120, 1, + "white", 65535, 65535, 65535, 65535, 65535, 65535, 1, + "black", 0, 0, 0, 0, 0, 0, 1, + "DarkSlateGray", 12079, 20303, 20303, 12079, 20303, 20303, 1, + "#00000000c000", 0, 0, 49344, 0, 0, 49152, 1, + "#820782070000", 33410, 33410, 0, 33287, 33287, 0, 1, + "#3cf3fbee34d2", 15420, 64507, 13364, 15603, 64494, 13522, 1, + "#3cf3fbed34d3", 15420, 64507, 13364, 15603, 64493, 13523, 1, + "#ffffa6990000", 65535, 42662, 0, 65535, 42649, 0, 1, + "#ffff0000fffe", 65535, 0, 65535, 65535, 0, 65534, 1, + "#fffe0000fffe", 65535, 0, 65535, 65534, 0, 65534, 1, + "#fffe00000000", 65535, 0, 0, 65534, 0, 0, 1 +]). +script_frac("0.6"). +fg_bg_colors('cyan','white'). +dont_reencode("FFDingbests:ZapfDingbats"). +objshadow_info('#c0c0c0',2,2). +page(1,"",1,''). +group([ +oval('blue','',50,500,150,540,1,1,1,1,0,0,0,0,0,'1',0,[ +]), +box('blue','',50,470,150,520,1,1,1,2,0,0,0,0,0,'1',0,[ +]), +oval('cyan','',50,450,150,490,1,1,1,0,0,0,0,0,0,'1',0,[ +]) +], +38,0,0,[ +]). +group([ +oval('blue','',350,500,450,540,1,1,1,44,0,0,0,0,0,'1',0,[ +]), +box('blue','',350,470,450,520,1,1,1,45,0,0,0,0,0,'1',0,[ +]), +oval('cyan','',350,450,450,490,1,1,1,46,0,0,0,0,0,'1',0,[ +]) +], +43,0,0,[ +]). +group([ +oval('blue','',500,500,600,540,1,1,1,48,0,0,0,0,0,'1',0,[ +]), +box('blue','',500,470,600,520,1,1,1,49,0,0,0,0,0,'1',0,[ +]), +oval('cyan','',500,450,600,490,1,1,1,50,0,0,0,0,0,'1',0,[ +]) +], +47,0,0,[ +]). +group([ +box('black','',750,650,800,700,2,1,1,66,0,0,0,0,0,'1',0,[ +]), +oval('black','',760,660,790,690,0,1,1,64,0,0,0,0,0,'1',0,[ +]), +poly('black','',2,[ + 775,660,795,660],0,1,1,65,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]) +], +84,0,0,[ +]). +group([ +box('black','',755,655,805,705,2,1,1,86,0,0,0,0,0,'1',0,[ +]), +oval('black','',765,665,795,695,0,1,1,87,0,0,0,0,0,'1',0,[ +]), +poly('black','',2,[ + 780,665,800,665],0,1,1,88,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]) +], +85,0,0,[ +]). +group([ +box('black','',760,660,810,710,2,1,1,90,0,0,0,0,0,'1',0,[ +]), +oval('black','',770,670,800,700,0,1,1,91,0,0,0,0,0,'1',0,[ +]), +poly('black','',2,[ + 785,670,805,670],0,1,1,92,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]) +], +89,0,0,[ +]). +group([ +box('black','',765,665,815,715,2,1,1,94,0,0,0,0,0,'1',0,[ +]), +oval('black','',775,675,805,705,0,1,1,95,0,0,0,0,0,'1',0,[ +]), +poly('black','',2,[ + 790,675,810,675],0,1,1,96,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]) +], +93,0,0,[ +]). +group([ +box('black','',770,670,820,720,2,1,1,98,0,0,0,0,0,'1',0,[ +]), +oval('black','',780,680,810,710,0,1,1,99,0,0,0,0,0,'1',0,[ +]), +poly('black','',2,[ + 795,680,815,680],0,1,1,100,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]) +], +97,0,0,[ +]). +group([ +box('black','',625,425,825,625,2,2,1,111,0,0,0,0,0,'2',0,[ +]), +group([ +oval('black','',760,460,790,490,0,1,1,52,0,0,0,0,0,'1',0,[ +]), +poly('black','',2,[ + 775,460,795,460],0,1,1,53,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +box('black','',750,450,800,500,0,1,1,54,0,0,0,0,0,'1',0,[ +]) +], +51,0,0,[ +]), +group([ +oval('black','',760,510,790,540,0,1,1,56,0,0,0,0,0,'1',0,[ +]), +poly('black','',2,[ + 775,510,795,510],0,1,1,57,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +box('black','',750,500,800,550,0,1,1,58,0,0,0,0,0,'1',0,[ +]) +], +55,0,0,[ +]), +group([ +oval('black','',760,560,790,590,0,1,1,60,0,0,0,0,0,'1',0,[ +]), +poly('black','',2,[ + 775,560,795,560],0,1,1,61,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]), +box('black','',750,550,800,600,0,1,1,62,0,0,0,0,0,'1',0,[ +]) +], +59,0,0,[ +]), +box('black','',640,450,710,485,2,1,1,104,0,0,0,0,0,'1',0,[ +]), +box('black','',650,455,700,465,2,1,1,106,0,0,0,0,0,'1',0,[ +]), +box('black','',690,475,700,480,2,1,1,107,0,0,0,0,0,'1',0,[ +]), +polygon('black','',14,[ + 650,520,700,520,710,510,740,510,740,520,715,520,710,525,715,530, + 740,530,740,540,710,540,700,530,650,530,650,520],2,1,1,0,108,0,0,0,0,0,'1',0, + "0000",[ +]) +], +131,0,0,[ +]). +box('black','',50,250,150,400,2,2,1,132,0,0,0,0,0,'2',0,[ +]). +rcbox('black','',100,350,140,390,2,2,1,0,16,133,0,0,0,0,'2',0,[ +]). +text('black',120,358,1,1,1,18,15,134,12,3,2,0,0,0,2,18,15,0,0,"",0,0,0,0,370,'',[ +minilines(18,15,0,0,1,0,0,[ +mini_line(18,12,3,0,0,0,[ +str_block(0,18,12,3,0,-1,0,0,0,[ +str_seg('black','Courier',0,80640,18,12,3,0,-1,0,0,0,0,0, + "DA")]) +]) +])]). +text('black',60,258,1,0,1,54,15,136,12,3,2,0,0,0,2,54,15,0,0,"",0,0,0,0,270,'',[ +minilines(54,15,0,0,0,0,0,[ +mini_line(54,12,3,0,0,0,[ +str_block(0,54,12,3,0,-2,0,0,0,[ +str_seg('black','Courier',0,80640,54,12,3,0,-2,0,0,0,0,0, + "Client")]) +]) +])]). +box('black','',350,250,850,400,2,2,1,138,0,0,0,0,0,'2',0,[ +]). +text('black',360,258,1,0,1,117,15,139,12,3,2,0,0,0,2,117,15,0,0,"",0,0,0,0,270,'',[ +minilines(117,15,0,0,0,0,0,[ +mini_line(117,12,3,0,0,0,[ +str_block(0,117,12,3,0,-1,0,0,0,[ +str_seg('black','Courier',0,80640,117,12,3,0,-1,0,0,0,0,0, + "Backup Server")]) +]) +])]). +group([ +oval('blue','',430,600,530,640,1,1,1,142,0,0,0,0,0,'1',0,[ +]), +box('blue','',430,570,530,620,1,1,1,143,0,0,0,0,0,'1',0,[ +]), +oval('cyan','',430,550,530,590,1,1,1,144,0,0,0,0,0,'1',0,[ +]) +], +141,0,0,[ +]). +rcbox('black','',500,350,600,390,2,2,1,0,16,148,0,0,0,0,'2',0,[ +]). +text('black',510,358,1,0,1,18,15,149,12,3,2,0,0,0,2,18,15,0,0,"",0,0,0,0,370,'',[ +minilines(18,15,0,0,0,0,0,[ +mini_line(18,12,3,0,0,0,[ +str_block(0,18,12,3,0,-1,0,0,0,[ +str_seg('black','Courier',0,80640,18,12,3,0,-1,0,0,0,0,0, + "MA")]) +]) +])]). +poly('red','',2,[ + 400,360,140,360],1,1,1,153,0,2,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('green','',2,[ + 140,380,400,380],1,1,1,156,0,2,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('green','',4,[ + 460,390,460,420,460,420,460,550],3,1,1,158,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('green','',4,[ + 520,390,520,420,490,420,490,550],3,1,1,159,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('green','',6,[ + 430,450,430,440,530,440,530,380,550,380,550,450],1,1,1,162,0,0,0,0,0,0,0,'1',0,0, + "00","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('green','',4,[ + 570,450,570,380,680,380,680,450],1,1,1,164,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +group([ +rcbox('black','',400,350,490,390,2,2,1,0,16,145,0,0,0,0,'2',0,[ +]), +text('black',420,358,1,0,1,18,15,146,12,3,2,0,0,0,2,18,15,0,0,"",0,0,0,0,370,'',[ +minilines(18,15,0,0,0,0,0,[ +mini_line(18,12,3,0,0,0,[ +str_block(0,18,12,3,0,-1,0,0,0,[ +str_seg('black','Courier',0,80640,18,12,3,0,-1,0,0,0,0,0, + "CA")]) +]) +])]) +], +171,0,0,[ +]). +poly('green','',4,[ + 440,390,440,420,410,420,410,450],1,1,1,189,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +group([ +rcbox('black','',360,300,450,340,0,2,1,0,16,190,0,0,0,0,'2',0,[ +]), +text('black',380,308,1,0,1,45,15,191,12,3,0,0,0,0,2,45,15,0,0,"",0,0,0,0,320,'',[ +minilines(45,15,0,0,0,0,0,[ +mini_line(45,12,3,0,0,0,[ +str_block(0,45,12,3,0,-1,0,0,0,[ +str_seg('black','Courier',0,80640,45,12,3,0,-1,0,0,0,0,0, + "Samba")]) +]) +])]) +], +196,0,0,[ +]). +poly('green','',2,[ + 380,450,380,340],1,1,1,197,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('green','',2,[ + 360,320,150,320],1,1,1,199,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('green','',2,[ + 120,450,120,390],1,1,1,200,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +poly('green','',2,[ + 90,400,90,450],1,1,1,201,0,0,0,0,0,0,0,'1',0,0, + "0","",[ + 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[ +]). +text('cyan',360,498,1,0,1,72,15,206,12,3,0,0,0,0,2,72,15,0,0,"",0,0,0,0,510,'',[ +minilines(72,15,0,0,0,0,0,[ +mini_line(72,12,3,0,0,0,[ +str_block(0,72,12,3,0,-1,0,0,0,[ +str_seg('cyan','Courier',0,80640,72,12,3,0,-1,0,0,0,0,0, + "FS Cache")]) +]) +])]). +text('cyan',500,498,1,0,1,99,15,208,12,3,0,0,0,0,2,99,15,0,0,"",0,0,0,0,510,'',[ +minilines(99,15,0,0,0,0,0,[ +mini_line(99,12,3,0,0,0,[ +str_block(0,99,12,3,0,-1,0,0,0,[ +str_seg('cyan','Courier',0,80640,99,12,3,0,-1,0,0,0,0,0, + "Media Queue")]) +]) +])]). +text('cyan',450,598,1,0,1,63,15,210,12,3,0,0,0,0,2,63,15,0,0,"",0,0,0,0,610,'',[ +minilines(63,15,0,0,0,0,0,[ +mini_line(63,12,3,0,0,0,[ +str_block(0,63,12,3,0,-1,0,0,0,[ +str_seg('cyan','Courier',0,80640,63,12,3,0,-1,0,0,0,0,0, + "Catalog")]) +]) +])]). diff --git a/doc/arch.png b/doc/arch.png new file mode 100644 index 0000000000000000000000000000000000000000..418deca024df5345ab33f19c2badec3d5d627c77 GIT binary patch literal 4843 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 literal 0 HcmV?d00001 diff --git a/doc/konzept.html b/doc/konzept.html new file mode 100644 index 0000000..5e4110d --- /dev/null +++ b/doc/konzept.html @@ -0,0 +1,357 @@ + + + + + + + + SIMBA: Konzept + + + +

SIMBA - Simple Integrated Multiplatform Backup and Archive

+
+

Anforderungen

+

+ Die Anforderungen ergeben sich im Wesentlichen aus den + Erfahrungen am WSR in den letzten Jahren: +

+
    +
  • + Zwischen Backup und Archiv wird nicht unterschieden. Das mag + daraus begründet sein, dass unser Archiv bislang einfach aus + archivierten Backup-Bändern besteht, aber generell ist die + Unterscheidung weder einfach noch besonders sinnvoll: Es ist + egal, ob eine File-Version, die früher einmal existiert hat, + nun nicht mehr existiert, weil sie absichtlich durch eine + neuere ersetzt wurde, absichtlich gelöscht wurde, oder durch + einen (Hardware-, Software- oder Benutzer-)Fehler verloren + gegangen ist. In jedem Fall will man sie wiederherstellen + können. +
  • +
  • + Bei weitem der häufigste Fall, für den ein + Backup/Archiv-System benötigt wird, ist das Wiederherstellen + von Fileversionen von vor wenigen Tagen. Das muss schnell und + einfach funktionieren und sollte vom Benutzer selbst + durchgeführt werden können. +
  • +
  • + Seltener, aber auch immer wieder, werden alte Filebestände + benötigt, häufig mehrere Jahre alt, und Metadaten (Filenamen, + Zeitpunkt, zu dem die Files existiert haben) sind nicht immer + vollständig bekannt. Das muss weniger schnell gehen, kann + Eingreifen des Admins erfordern, wichtig sind aber gute + Suchmöglichkeiten. +
  • +
  • + Idealerweise sollte jede Fileversion, die jemals existiert + hat, archiviert werden. Dieses Ideal ist wahrscheinlich nicht + erreichbar, aber zumindest Fileversionen, die über 24-48 + Stunden existiert haben, sollten wieder auffindbar sein. +
  • +
  • + Das System soll einfach sein. Ich habe eine eine tiefsitzende + Abneigung gegen Systeme, die ich nicht verstehe, insbesondere + dann, wenn ich ihnen wichtige Daten anvertraue, und dafür + verantwortlich bin, diese Daten auch wieder rauszubekommen. +
  • +
  • + Das System muss mit Datenmengen im Terabyte-Bereich zurecht + kommen. +
  • +
  • + Das System muss die Performance aktueller Hardware ausnützen + können. +
  • +
  • + Es sollte vermieden werden, unveränderte Daten immer wieder zu + archivieren. +
  • +
  • + "Ein Band ist kein Band." Bänder sind nicht extrem zuverlässig, + insbesondere, wenn sie lange aufbewahrt werden. Daten sollen + daher redundant archiviert werden können. +
  • +
  • + Integrationsmöglichkeit für Datenbanken und andere + Datenquellen, die nicht einfach durch Kopieren einzelner Files + gesichert werden können. +
  • +
+

+ Nicht benötigt werden folgende Features: +

+
    +
  • + Standortübergreifende Backups über langsame Leitungen. +
  • +
  • + Verschlüsselte Backups. +
  • +
+
+
+

Architektur

+
+ Deployment und Datenfluss +
+

+ Das System besteht aus mehreren "Agents", die jeweils bestimmte + Aufgaben haben. Die Abbildung zeigt einen Client (d.h., ein + System, von dem Backups erstellt werden sollen) und einen + Backup-Server, der die Backups verwaltet. +

+
+

Collection Agent

+

+ Die Zentrale Komponente bildet der "Collection Agent", der in + regelmäßigen Abständen (typischerweise täglich), Kontakt zu + den Clients aufnimmt, den aktuellen Filebestand festellt, neue + bzw. geänderte Files vom Client anfordert und im FS Cache + sowie im Catalog speichert. +

+

+ Der FS Cache hat die von + rsync-snapshot + bekannte Struktur: +

+
    +
  • + Ein Directory für jeden Zeitpunkt, an dem ein Backup begonnen + wurde. +
  • +
  • + Darunter ein Directory für jeden Client +
  • +
  • + Darunter die gesamte Directorystruktur des Clients. Files + haben die selben Metadaten (insbesondere Owner und + Permissions) wie das File am Client), Files, die sich seit dem + letzten Backup nicht geändert haben, sind Hardlinks auf das + bestehende File. +
  • +
+

+ Da jeder Subtree des FS Cache eine vollständige Kopie des + entsprechenden Subtrees am Client ist, kann der FS Cache + einfach über Samba oder ein anderes Netzwerk-Filesystem + read-only export werden. Restores erfolgen einfach durch + Kopieren der Files auf den Client. +

+

+ Der Catalog enthält die Metadaten aller Files in einer + relationalen Datenbank. Das dient einerseits der schnelleren + Suche, andererseits dazu, Informationen über bereits auf Band + ausgelagerte Dateien zu halten, die nicht mehr im FS Cache + vorhanden sind. +

+
+
+

Disk Agent

+

+ Der Disk Agent muss auf jedem Client installiert werden. Er + dient dazu, Informationen über das lokale Filesystem des + Clients an den Collection Agent zu übertragen. Im wesentlichen + sind das: +

+
    +
  • ein rekursives Listing eines Directories samt Metadaten
  • +
  • Metadaten und Inhalt eines bestimmten Files
  • +
+

+ Der Disk-Agent kann konfiguriert werden, dass er bestimmte + Directories, von denen kein Backup gewünscht ist (z.B. /proc + und /sys auf Linux-Systemen, aber auch z.B. Directories mit + Datenbankfiles) ausspart. +

+

+ Im aktuellen Prototyp wird der DA über SSH gestartet, die + Authentifikation erfolgt über Public-Keys. Sollte sich das als + zu langsam erweisen, kann Agent auch über eine "nackte" + TCP-Verbindung kommunizieren, die dafür notwendige + Authentifikation ist aber im aktuellen Prototyp noch nicht + implementiert. +

+

+ Directorylistings und Filedaten werden über unterschiedliche + Verbindungen übertragen, was effektives Streaming erleichtert. +

+

+ Der Disk-Agent übersetzt systemspezifische Daten in ein + "allgemeines" Format. Z.B. werden Filenamen vom lokalen + Encoding nach UTF-8 übersetzt, und ACLs werden im + POSIX-Textformat dargestellt. +

+

+ Es wäre möglich, statt eines Disk-Agents, der auf ein + Filesystem zugreift, einen zu implementieren, der beliebige + andere Daten (Datenbanken, etc.) exportiert. + Z.B. könnte ein Disk-Agent für Online-Backups einer + Oracle-Datenbank folgendes Interface implementieren: +

+
    +
  • + Ein Directory pro Tablespace mit einem Subdirectory pro + Datafile und je einem Start/Ende-Markerfile. +
  • +
  • + Durch Zugriff auf das Start/Ende-Markerfile wird der + jeweilige Tablespace in den Backup-Modus bzw. wieder aktiv + gesetzt. +
  • +
  • + Jedes Datafile wird durch ein Directory von Files + repräsentiert, die Teile des Datafiles abbilden. Für jeden + Teil wird ein eigenes Last-Modified-Datum verwaltet. +
  • +
  • + Archive-Logs werden als je ein File dargestellt. +
  • +
  • + Der Collector-Agent sieht nur eine einfache + Directory-Struktur, die er einfach rekursiv durchgeht, + wodurch er den Disk-Agent dazu veranlasst die jeweil + richtigen Tablespaces in den Backup-Modus zu schalten. + Nur Teile von Datenfiles, die sich geändert haben, müssen + über das Netz übertragen und auf Band geschrieben werden. +
  • +
+

+ In diesem Fall + ist das einfache Restore über ein Netzwerkfilesystem natürlich + nicht möglich. +

+
+
+

Media Agent

+

+ Der Media Agent dient dazu, Files auf Bänder (oder andere + Wechselmedien) auszulagern. +

+

+ Er liest Daten über den aktuellen Stand aus dem Catalog, + bestimmt anhand seines Regelwerks, welche Files auf welches + Band geschrieben werden müssen, und führt das durch. +

+

+ Aus Performance-Gründen werden Files nicht direkt aus dem + FS Cache auf Band kopiert. Speziell bei vielen kleinen Files + wäre so nicht sicherzustellen, dass die zum Streamen + erforderliche Transferrate erreicht wird. Statt dessen werden + in der Media Queue Files sinnvoller Größe (1GB dürfte + bauchgefühlmäßig für LTO-3 angemessen sein) im + Standard-PAX-Format erzeugt. Diese Files werden dann 1:1 auf + Band kopiert. Wahrscheinlich ist es sinnvoll, für die Media + Queue eine eigene Disk (bzw. ein RAID-1-Paar) zu reservieren. +

+

+ Der Media Agent besteht aus zumindest zwei Prozessen mit + unterschiedlichen Aufgaben. Wahrscheinlich ist es sinnvoll, + ihn in zwei Programme zu splitten ("Archiving Agent" schreibt + in die Media Queue, "Media Agent" kopiert von dort auf + Wechselmedium). +

+
+
+
+

Auslagerungsregeln

+

+ Prinzipiell können die Auslagerungsregeln beliebig komplex + werden, wobei folgende Daten zur Verfügung stehen: +

+
    +
  • Die Metadaten aller Fileversionen.
  • +
  • Die Zuordnung von Fileversionen zu Files
  • +
  • Ob eine Fileversion sich auf einem Band befindet, und wenn + ja, auf welchem
  • +
  • Eine Zuordnung von Bändern zu Pools
  • +
  • Ob das Band im Laufwerk, im Bandroboter, on-site oder off-site ist.
  • +
+

+ Folgende Regeln könnten unsere aktuellen Bedürfnisse abdecken: +

+
+

Archiv

+

+ Das Archiv dient dazu, alle Files, für die das sinnvoll ist + (in erster Näherung alle außer Oracle-Datenbanken, + tmp-Directories, etc.), "ewig" aufzubewahren. Das kann wie + folgt erreicht werden: +

+

+ Erstelle eine Liste aller Files im aktuellen FS Cache. +

+

+ Exkludiere ev. Files, die nicht archiviert werden sollen + (Anm.: Die meisten solchen Files sind vermutlich gar nicht im + FS Cache, da sie bereits vom DA ausgeschlossen werden können). +

+

+ Exkludiere ev. Files, die nur während eines CA-Runs existiert + haben (wahrscheinlich temporäre Files). +

+

+ Bestimme alle Fileversionen, die noch nicht auf Band gesichert + wurden. +

+

+ Wenn sich alle existierenden Fileversionen am gleichen Band + befinden, aber nicht auf dem Band, das gerade geschrieben + werden soll, selektiere auch die aktuelle Version. +

+
+
+

Offsite-Backup für Disaster-Recovery

+

+ Ein volles Backup sollte sich off-site befinden, um im Fall + eines Komplettausfalls ein Ersatzrechenzentrum aufbauen zu + können. Austausch erfolgt (derzeit) wöchentlich. +

+

+ Erstelle eine Liste aller Files im aktuellen FS Cache. +

+

+ Exkludiere ev. Files, die für ein Offsite-Backup nicht + benötigt werden. + (Anm.: Das ist gefährlich - das Offsite-Backup wird nicht + regelmäßig getestet, und wenn im Ernstfall wichtige Files + fehlen, hat man ein Problem). +

+

+ Bestimme die aktuelle Fileversion, aber nur wenn diese + noch nicht auf ein Band in diesem Pool gesichert wurde, oder + wenn sie sich auf einem Band befindet, das recycelt werden + soll. +

+

+ Man kann entweder immer das älteste Band, das sich off-site + befindet, zum Recyclen markieren, oder einen intelligenteren + Algorithmus verwenden - z.B. das Band, auf dem sich die + wenigsten noch-aktuellen Fileversionen befinden. +

+
+
+

Datenbank-Backups

+

+ Die sinnvolle Lebensdauer von Datenbank-Backups ist begrenzt + (spätestens nach einem Versionsupgrade sind sie nicht mehr + brauchbar), Datenbank-Backups (in ihrer aktuellen Form) werden + daher hauptsächlich für Desaster-Recovery und Migrationstests + gemacht, eine Archivierung ist nicht sinnvoll. + (Anm.: Dieses Szenario geht von unseren aktuellen Cold-Backups + aus) +

+

+ Erstelle eine Liste der aktuellen Fileversionen der + entsprechenden Datenbank. +

+

+ Jeder Pool enthält eine fixe Anzahl von Bändern, das jeweils + älteste wird recycelt. +

+
+
+ +