Konzept
This commit is contained in:
parent
ed4c9e8bed
commit
a6f50cd59f
|
@ -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")])
|
||||||
|
])
|
||||||
|
])]).
|
Binary file not shown.
After Width: | Height: | Size: 4.7 KiB |
|
@ -0,0 +1,357 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
|
||||||
|
<title>SIMBA: Konzept</title>
|
||||||
|
<link rel="stylesheet" href="doc.css" type="text/css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1> SIMBA - Simple Integrated Multiplatform Backup and Archive </h1>
|
||||||
|
<div class="section">
|
||||||
|
<h2> Anforderungen </h2>
|
||||||
|
<p>
|
||||||
|
Die Anforderungen ergeben sich im Wesentlichen aus den
|
||||||
|
Erfahrungen am WSR in den letzten Jahren:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
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.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
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.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
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.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
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.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
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.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Das System muss mit Datenmengen im Terabyte-Bereich zurecht
|
||||||
|
kommen.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Das System muss die Performance aktueller Hardware ausnützen
|
||||||
|
können.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Es sollte vermieden werden, unveränderte Daten immer wieder zu
|
||||||
|
archivieren.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
"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.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Integrationsmöglichkeit für Datenbanken und andere
|
||||||
|
Datenquellen, die nicht einfach durch Kopieren einzelner Files
|
||||||
|
gesichert werden können.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Nicht benötigt werden folgende Features:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Standortübergreifende Backups über langsame Leitungen.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Verschlüsselte Backups.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<h2> Architektur </h2>
|
||||||
|
<div>
|
||||||
|
<img src="arch.png" alt="Deployment und Datenfluss" />
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<div class="section">
|
||||||
|
<h3> Collection Agent </h3>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Der FS Cache hat die von
|
||||||
|
<a href="http://www.hjp.at/programs/rsync-snapshot/index.en.html">rsync-snapshot</a>
|
||||||
|
bekannte Struktur:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Ein Directory für jeden Zeitpunkt, an dem ein Backup begonnen
|
||||||
|
wurde.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Darunter ein Directory für jeden Client
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
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.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<h3> Disk Agent </h3>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li> ein rekursives Listing eines Directories samt Metadaten </li>
|
||||||
|
<li> Metadaten und Inhalt eines bestimmten Files </li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Directorylistings und Filedaten werden über unterschiedliche
|
||||||
|
Verbindungen übertragen, was effektives Streaming erleichtert.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Ein Directory pro Tablespace mit einem Subdirectory pro
|
||||||
|
Datafile und je einem Start/Ende-Markerfile.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Durch Zugriff auf das Start/Ende-Markerfile wird der
|
||||||
|
jeweilige Tablespace in den Backup-Modus bzw. wieder aktiv
|
||||||
|
gesetzt.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
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.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Archive-Logs werden als je ein File dargestellt.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
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.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
In diesem Fall
|
||||||
|
ist das einfache Restore über ein Netzwerkfilesystem natürlich
|
||||||
|
nicht möglich.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<h3> Media Agent </h3>
|
||||||
|
<p>
|
||||||
|
Der Media Agent dient dazu, Files auf Bänder (oder andere
|
||||||
|
Wechselmedien) auszulagern.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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).
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<h2> Auslagerungsregeln </h2>
|
||||||
|
<p>
|
||||||
|
Prinzipiell können die Auslagerungsregeln beliebig komplex
|
||||||
|
werden, wobei folgende Daten zur Verfügung stehen:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li> Die Metadaten aller Fileversionen. </li>
|
||||||
|
<li> Die Zuordnung von Fileversionen zu Files </li>
|
||||||
|
<li> Ob eine Fileversion sich auf einem Band befindet, und wenn
|
||||||
|
ja, auf welchem </li>
|
||||||
|
<li> Eine Zuordnung von Bändern zu Pools </li>
|
||||||
|
<li> Ob das Band im Laufwerk, im Bandroboter, on-site oder off-site ist.</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Folgende Regeln könnten unsere aktuellen Bedürfnisse abdecken:
|
||||||
|
</p>
|
||||||
|
<div class="section">
|
||||||
|
<h2> Archiv </h2>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Erstelle eine Liste aller Files im aktuellen FS Cache.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Exkludiere ev. Files, die nur während eines CA-Runs existiert
|
||||||
|
haben (wahrscheinlich temporäre Files).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Bestimme alle Fileversionen, die noch nicht auf Band gesichert
|
||||||
|
wurden.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Wenn sich alle existierenden Fileversionen am gleichen Band
|
||||||
|
befinden, aber nicht auf dem Band, das gerade geschrieben
|
||||||
|
werden soll, selektiere auch die aktuelle Version.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<h2> Offsite-Backup für Disaster-Recovery </h2>
|
||||||
|
<p>
|
||||||
|
Ein volles Backup sollte sich off-site befinden, um im Fall
|
||||||
|
eines Komplettausfalls ein Ersatzrechenzentrum aufbauen zu
|
||||||
|
können. Austausch erfolgt (derzeit) wöchentlich.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Erstelle eine Liste aller Files im aktuellen FS Cache.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<h2> Datenbank-Backups </h2>
|
||||||
|
<p>
|
||||||
|
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)
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Erstelle eine Liste der aktuellen Fileversionen der
|
||||||
|
entsprechenden Datenbank.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Jeder Pool enthält eine fixe Anzahl von Bändern, das jeweils
|
||||||
|
älteste wird recycelt.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue