Ievads
Duplicati ir atvērtā pirmkoda programma, kas ļauj veidot rezerves kopijas un kam nav servera puses komponentes, tādējādi programma var atbalstīt dažādus uz attālinātu glabāšanu balstītus pakalpojumu sniedzējus. Tas gan nozīmē, ka programma saskaras ar lielu latentumu, savienojuma zudumiem un tā var pievienot un dzēst failus, bet nav iespējams modificēt jau esošos failus. Duplicati tiek galā ar šim problēmām, izmantojot uzglabāšanas formātus, kas apvieno mazus failus un sadala lielus failus, atbalsta šifrēšanu, kompresiju un deduplikāciju1, rezerves kopiju versijas un inkrementālās2 rezerves kopijas. Šajā rakstā tiks paskaidrots, kā tiek veidotas rezerves kopijas un glabātas attālinātā uzglabāšanas vietā un attēlots, kā process darbojas.
Avota dati
Piemērā process tiek veikts nelielai mapei ar failiem. Mapes saturs ir sekojošs:
C:\data
|----> mydoc.txt, 4kb
|----> myvideo.mp4, 210kb
|----> extra
|-----> olddoc.txt, 2kb
|-----> samevideo.mp4, 210kb
Rezerves kopiju veidošanas process
Tā kā programma darbojas tikai ar absolūtiem ceļiem, mapju un failu saraksts tiek attēlots šādi:
C:\data\
C:\data\mydoc.txt
C:\data\myvideo.mp4
C:\data\extra\
C:\data\extra\olddoc.txt
C:\data\extra\samevideo.mp4
Lai glabātu informāciju par rezerves kopiju saturu, tiek izmantoti standarta failu formāti, kā arī JSON datu formāts un Zip kompresēšana.
Lai glabātu failu sarakstu, programma izveido failu ar nosaukumu duplicati-20161014090000.dlist.zip
, kur ciparu virkne atpoguļo tekošo laiku un datumu UTC laika zonā. Zip arhīvā ir JSON fails ar nosaukumu filelist.json
. Sākumā fails satur tukšu sarakstu, kas JSON formātā tiek aprakstīts kā []
.
Lai glabātu datus no faila, programma izveido failu ar nosaukumu duplicati-7af781d3401eb90cd371.dblock.zip
, kur cipari un burti ir izvēlēti nejauši un tiem nav nekāda sakara ar datiem un pašreizējo laiku. Sākotnējais arhīva fails ir tukšs.
Mapes apstrāde
Kad programma saņem pirmo ierakstu – C:\data\
– tā pamana, ka ieraksts ir mape un tādējādi tai nav datu. Ieraksts tiek ievietots failā ar nosaukumu filelist.json
, kas minēts šī raksta iepriekšējā sadaļā.
Šobrīdī fails izskatās šādi:
[
{
"type": "folder",
"path": "C:\\data\\"
}
]
Reālā situācijā failā tiek glabāti arī metadati – atļaujas, modifikācijas laiki u.t.t., bet šajā gadījumā tie netiks iekļauti.
Mazu failu apstrāde
Nākamais ieraksts ir C:\data\mydoc.txt
, kas ir fails, tātad tas satur informāciju. Programma nolasīs failu pa blokiem, kas pēc noklusējuma ir 100KB katrs. Ja fails, piemēram, ir 4KB, tas ietilpst vienā blokā. Pēc bloka nolasīšanas, programma aprēķina SHA-256 heša vērtību un sašifrē ar Base64 šifrēšanu, lai iegūtu virkni: qaFXpxVTuYCuibb9P41VSeVn4pIaK8o3jUpJKqI4VF4=
. Pēc tam tiek aprēķināta SHA-256 vērtība visam failam un sašifrēta ar Base64. Tā kā blokam un failam ir viens un tas pats saturs, rezultātā vērtība ir tā pati: qaFXpxVTuYCuibb9P41VSeVn4pIaK8o3jUpJKqI4VF4=
.
Jāpiezīmē, ka papildus informācija hešam netiek pievienota. Tas nav nepieciešams, jo heša vērtība nav redzama pēc tam, kad arhīvi ir sašifrēti, tādējādi nedodot nekādus pavedienus, ko rezerves kopijas satur.
Pēc tam dati tiek pievienoti dblock
failam, kas pieminēts iepriekš, izmantojot virkni kā faila nosaukumu. Tas nozīmē, ka dblock
arhīva faila saturs tekošajā brīdī ir:
qaFXpxVTuYCuibb9P41VSeVn4pIaK8o3jUpJKqI4VF4= (4KB)
Fails tiek pievienots filelist.json
failam, kas tagad izskatās šādi:
[
{
"type": "Folder",
"path": "C:\\data\\"
},
{
"type": "File",
"path": "C:\\data\\mydoc.txt",
"size": 4096,
"hash": "qaFXpxVTuYCuibb9P41VSeVn4pIaK8o3jUpJKqI4VF4="
}
]
Lielu failu apstrāde
Ierakstam C:\data\myvideo.mp4
tiek izmantots tas pats paņēmiens, kas aprakstīts priekš failam C:\data\mydoc.txt
, bet šajā gadījumā fails ir lielāks nekā “bloka izmērs” (100KB). Tas nozīmē, ka programma aprēķina trīs SHA-256 bloku hešus, kur pirmie divi ir 100KB lieli, bet trešais bloks – 10KB.
Katrs no šiem blokiem tiek pievienots dblock
failam, kas tagad satur:
qaFXpxVTuYCuibb9P41VSeVn4pIaK8o3jUpJKqI4VF4= (4KB)
0td8NEaS7SMrQc5Gs0Sdxjb/1MXEEuwkyxRpguDiWsY= (100KB)
PN2oO6eQudCRSdx3zgk6SJvlI5BquP6djt5hG4ZfRCQ= (100KB)
uS/2KMSmm2IWlZ77JiHH1p/yp7Cvhr8CKmRHJNMRqwA= (10KB)
Papildus tiek aprēķināts faila hešs, bet šajā gadījumā tas ir atšķirīgs: 4sGwVN/QuWHD+yVI10qgYa4e2F5M4zXLKBQaf1rtTCs=
.
Mēs varam izvēlēties, vai glabāt šīs vērtības filelist.json
failā, piemēram:
{
"type": "File",
"path": "C:\\data\\myvideo.mp4",
"size": 215040,
"hash": "4sGwVN/QuWHD+yVI10qgYa4e2F5M4zXLKBQaf1rtTCs=",
"blocks": [
"0td8NEaS7SMrQc5Gs0Sdxjb/1MXEEuwkyxRpguDiWsY=",
"PN2oO6eQudCRSdx3zgk6SJvlI5BquP6djt5hG4ZfRCQ=",
"uS/2KMSmm2IWlZ77JiHH1p/yp7Cvhr8CKmRHJNMRqwA="
]
}
Katriem 100KB failu datiem papildus tiek glabāti 47 simboli. Piemēram, 1GB fails failu sarakstam papildus pievienotu 482KB datu, kas padarītu failu sarakstu nenoliedzami lielāku.
Tā vietā programma pievieno “netiešo bloku”, kas izveido jaunu datu bloku, saturot tika hešu sarakstu. Tā kā SHA-256 hešs ir 32 baitus liels, un, ja tas nav šifrēts ar Base64, mēs varam glabāt 3200 bloku hešus vienā blokā. Tātad filelist.json
fails palielinās savu izmēru tikai par 47 baitiem uz aptuveni 300MB datu.
Priekš C:\data\myvideo.mp4
tiek izveidoti trīs bloki, tātad jauns bloks ar trīs bloku hešiem aizņem tikai 96 baitus. Turklāt šis bloks nekādā veidā netiek apstrādāts citādāk nekā pārējie bloki, kā arī SHA-256 hešs ir aprēķināts, piešķirot Base64 šifrētu “bloka heša” vērtību: Uo1f4rVjNRX10HkxQxXauCrRv0wJOvStqt9gaUT0uPA=
.
Jaunais bloks tiek pievienots dblock failam, kas satur:
qaFXpxVTuYCuibb9P41VSeVn4pIaK8o3jUpJKqI4VF4= (4KB)
0td8NEaS7SMrQc5Gs0Sdxjb/1MXEEuwkyxRpguDiWsY= (100KB)
PN2oO6eQudCRSdx3zgk6SJvlI5BquP6djt5hG4ZfRCQ= (100KB)
uS/2KMSmm2IWlZ77JiHH1p/yp7Cvhr8CKmRHJNMRqwA= (10KB)
Uo1f4rVjNRX10HkxQxXauCrRv0wJOvStqt9gaUT0uPA= (96B)
Jauns faila ieraksts tiek saglabāts failu sarakstā, kas izskatās šādi:
[
{
"type": "Folder",
"path": "C:\\data\\"
},
{
"type": "File",
"path": "C:\\data\\mydoc.txt",
"size": 4096,
"hash": "qaFXpxVTuYCuibb9P41VSeVn4pIaK8o3jUpJKqI4VF4="
},
{
"type": "File",
"path": "C:\\data\\myvideo.mp4",
"size": 215040,
"hash": "4sGwVN/QuWHD+yVI10qgYa4e2F5M4zXLKBQaf1rtTCs=",
"blocklists": [ "Uo1f4rVjNRX10HkxQxXauCrRv0wJOvStqt9gaUT0uPA=" ]
}
]
Līdzīgu datu apstrāde
Šobrīd ir palikuši trīs ieraksti, kas tiek saglabāti tāpat, kā izskaidrots iepriekšējās sadaļās.
Fails C:\data\extra\olddoc.txt
is vecāka versija dokumentam ar nosaukumu C:\\data\\mydoc.txt
, kam jau iepriekš tika izveidota rezerves kopija. Bet tā kā programma aprēķina bloka hešu jaunam failam: R/XSNsb4ln/SkeJwFDd4Fv4OnW2QNIxMR4HItgg9qCE=
, kas nesakrīt ar iepriekš apstrādāto failu C:\data\mydoc.txt
, tādēļ to uzskata kā atšķirīgu failu.
Daži backup risinājumi identificēs to, ka vairāki fragmenti sakrīt un šajā scenārijā veidos mazākus rezerves kopiju izmērus.
Tomēr šī programma koncentrējas un vienkāršību un ātrdarbību, apejot potenciālo vietas ietaupīšanu.
Programmā neiekļāva šo daļu, balstoties uz vairākiem novērojumiem:
- Faili tiek kompresēti un ja nu gadījumā divi līdzīgi faili tiek iekļauti vienā blokā, vieta tāpat tiks ietaupīta uz kompresēšanas rēķina;
- Nelielas pārbīdes bieži vien tiek atrastas teksta failos, jo lielāki faili:
- nav pārrakstāmi (datubāzes, video, bildes, u.t.t.);
- ir pārrakstāmi pilnībā (bildes, video);
- ir pārrakstāmi ar kompresijas palīdzību (docx, bildes);
- teksta faili pārsvarā ir salīdzinoši mazi (salīdzinot ar, piemēram, bildēm);
- teksta faili viegli tiek sakompresēti.
Tas nozīmē, ka papildus ieraksts for C:\data\extra\olddoc.tx
parādīsies filelist.json
failā:
[
{
"type": "Folder",
"path": "C:\\data\\"
},
{
"type": "File",
"path": "C:\\data\\mydoc.txt",
"size": 4096,
"hash": "qaFXpxVTuYCuibb9P41VSeVn4pIaK8o3jUpJKqI4VF4="
},
{
"type": "File",
"path": "C:\\data\\myvideo.mp4",
"size": 215040,
"hash": "4sGwVN/QuWHD+yVI10qgYa4e2F5M4zXLKBQaf1rtTCs=",
"blocklists": [ "Uo1f4rVjNRX10HkxQxXauCrRv0wJOvStqt9gaUT0uPA=" ]
},
{
"type": "Folder",
"path": "C:\\data\\extra"
},
{
"type": "File",
"path": "C:\\data\\extra\\olddoc.txt",
"size": 2048,
"hash": "R/XSNsb4ln/SkeJwFDd4Fv4OnW2QNIxMR4HItgg9qCE="
}
]
Kā arī jauns bloks tiks pievienots dblock
failam:
qaFXpxVTuYCuibb9P41VSeVn4pIaK8o3jUpJKqI4VF4= (4kb)
0td8NEaS7SMrQc5Gs0Sdxjb/1MXEEuwkyxRpguDiWsY= (100kb)
PN2oO6eQudCRSdx3zgk6SJvlI5BquP6djt5hG4ZfRCQ= (100kb)
uS/2KMSmm2IWlZ77JiHH1p/yp7Cvhr8CKmRHJNMRqwA= (10kb)
Uo1f4rVjNRX10HkxQxXauCrRv0wJOvStqt9gaUT0uPA= (96b)
R/XSNsb4ln/SkeJwFDd4Fv4OnW2QNIxMR4HItgg9qCE= (2kb)
Visbeidzot, fails C:\data\extra\samevideo.mp4
tiek apstrādāts. Programma katru bloku apstrādās atsevišķi, bet sapratīs, ka tam jau ir izveidota rezerves kopija un neatspoguļos to dblock
failā. Pēc tam, kad visi trīs bloki ir aprēķināti, tiks izveidots jauns bloks, kas glabās šos trīs hešus, bet atklās, ka šāds bloks arī jau ir glabāts.
Šis paņēmiens tiek devēts arī par deduplikāciju, kas nodrošina, ka katra daļa tiek glabāta tikai vienu reizi. Ar šo paņēmienu, failu kopijas ir atklātas neatkarīgi no to nosaukuma vai atrašanās vietas.
Gala saturs filelist.json
failam:
[
{
"type": "Folder",
"path": "C:\\data\\"
},
{
"type": "File",
"path": "C:\\data\\mydoc.txt",
"size": 4096,
"hash": "qaFXpxVTuYCuibb9P41VSeVn4pIaK8o3jUpJKqI4VF4="
},
{
"type": "File",
"path": "C:\\data\\myvideo.mp4",
"size": 215040,
"hash": "4sGwVN/QuWHD+yVI10qgYa4e2F5M4zXLKBQaf1rtTCs=",
"blocklists": [ "Uo1f4rVjNRX10HkxQxXauCrRv0wJOvStqt9gaUT0uPA=" ]
},
{
"type": "Folder",
"path": "C:\\data\\extra"
},
{
"type": "File",
"path": "C:\\data\\extra\\olddoc.txt",
"size": 2048,
"hash": "R/XSNsb4ln/SkeJwFDd4Fv4OnW2QNIxMR4HItgg9qCE="
},
{
"type": "File",
"path": "C:\\data\\extra\\samevideo.mp4",
"size": 215040,
"hash": "4sGwVN/QuWHD+yVI10qgYa4e2F5M4zXLKBQaf1rtTCs=",
"blocklists": [ "Uo1f4rVjNRX10HkxQxXauCrRv0wJOvStqt9gaUT0uPA=" ]
},
]
Un pēdējais bloks dblock
failam:
qaFXpxVTuYCuibb9P41VSeVn4pIaK8o3jUpJKqI4VF4= (4KB)
0td8NEaS7SMrQc5Gs0Sdxjb/1MXEEuwkyxRpguDiWsY= (100KB)
PN2oO6eQudCRSdx3zgk6SJvlI5BquP6djt5hG4ZfRCQ= (100KB)
uS/2KMSmm2IWlZ77JiHH1p/yp7Cvhr8CKmRHJNMRqwA= (10KB)
Uo1f4rVjNRX10HkxQxXauCrRv0wJOvStqt9gaUT0uPA= (96B)
R/XSNsb4ln/SkeJwFDd4Fv4OnW2QNIxMR4HItgg9qCE= (2KB)
1deduplikācija – jau esošu failu kopiju un liekas informācijas likvidēšana
2inkrementāls – process, kurā pieaug skaits, izmērs un daudzums
Avots: https://duplicati.com/