Stoc de backup pentru mii de mașini virtuale cu instrumente gratuite

Stoc de backup pentru mii de mașini virtuale cu instrumente gratuite

Bună, recent am avut o sarcină interesantă de a configura un stocare pentru backup-ul unui număr mare de dispozitive bloc.

În fiecare săptămână efectuăm backup pentru toate mașinile virtuale din cloudul nostru, astfel încât trebuie să știm să gestionăm mii de copii de rezervă și să facem acest lucru cât mai rapid și eficient posibil.

Din păcate, configurațiile standard RAID5, RAID6 în acest caz nu ne vor ajuta din cauza faptului că procesul de restaurare pe astfel de discuri mari ca ale noastre va fi extrem de lent și probabil că nu se va termina niciodată.

Să examinăm ce alternative există:

Erasure Coding — Analog cu RAID5, RAID6, dar cu un nivel de paritate configurabil. În acest timp, rezervarea se face nu pe blocuri, ci pentru fiecare obiect în parte. Cel mai simplu mod de a încerca erasure coding este să desfășori minio.

DRAID — aceasta este în prezent o caracteristică care nu a fost încă lansată de ZFS. Spre deosebire de RAIDZ, DRAID are un bloc de paritate distribuit și la restaurare implică toate discurile din array, ceea ce îl face să reziste mai bine la defecțiuni și să se restaureze mai repede după o eroare.

Stoc de backup pentru mii de mașini virtuale cu instrumente gratuite

Stoc de backup pentru mii de mașini virtuale cu instrumente gratuite

Avem la dispoziție un server Fujitsu Primergy RX300 S7 cu procesorul Intel Xeon CPU E5-2650L 0 @ 1.80GHz, nouă module de memorie RAM Samsung DDR3-1333 8Gb PC3L-10600R ECC Registered (M393B1K70DH0-YH9), o unitate de disc Supermicro SuperChassis 847E26-RJBOD1, conectată prin Dual LSI SAS2X36 Expander și 45 de discuri Seagate ST6000NM0115-1YZ110 pe 6TB fiecare.

Înainte de a lua o decizie, trebuie mai întâi să testăm corespunzător totul.

Pentru aceasta m-am pregătit și am efectuat teste asupra diferitelor configurații. Am folosit minio, care a funcționat ca backend S3, și l-am rulat în diferite moduri cu diferite număr de targeturi.

În principal, s-a testat cazul minio în erasure coding față de software raid cu același număr de discuri și discuri de paritate, adică: RAID6, RAIDZ2 și DRAID2.

Pentru referință: atunci când rulezi minio cu un singur target, minio funcționează în modul S3-gateway, oferind sistemul tău local de fișiere ca un stocare S3. În schimb, dacă rulezi minio specificând mai multe targeturi, se va activa automat modul Erasure Coding, care va dispersa datele între targeturile tale oferind rezistență la defecte.

În mod implicit, minio împarte destinațiile în grupuri de câte 16 discuri, unde fiecare grup are câte 2 paritate. Asta înseamnă că pot ieși din funcțiune simultan două discuri fără pierderi de date.

Pentru testarea performanței, am folosit 16 discuri de câte 6TB fiecare și am scris pe ele obiecte mici de 1MB, ceea ce descria cel mai precis încărcătura noastră viitoare, deoarece toate instrumentele moderne de backup își împart datele în blocuri de câțiva megabați și le scriu în acest mod.

Pentru realizarea benchmark-ului, am folosit utilitarul s3bench, rulat pe un server de la distanță, care trimitea în minio zeci de mii de asemenea obiecte în sute de fire. După aceea, am încercat să le solicit înapoi în același mod.

Rezultatele benchmark-ului sunt prezentate în tabelul următor:

Stoc de backup pentru mii de mașini virtuale cu instrumente gratuite

Așa cum vedem, minio în modul său de erasure coding funcționează semnificativ mai slab la scriere decât minio care rulează pe un RAID6 software, RAIDZ2 și DRAID2 în aceeași configurație.

Separat, am fost rugat să testez minio pe ext4 vs XFS. Ciudat, dar pentru tipul meu de încărcătură, XFS s-a dovedit a fi semnificativ mai lent decât ext4.

În prima serie de teste, Mdadm a arătat superioritate față de ZFS, dar mai târziu gmelikov a sugerat, că pot îmbunătăți performanța ZFS setând următoarele opțiuni:

xattr=sa atime=off recordsize=1M

și după aceea, testele cu ZFS au devenit mult mai bune.

De asemenea, se poate observa că DRAID nu oferă un câștig semnificativ în performanță față de RAIDZ, dar teoretic ar trebui să fie mult mai sigur.

În ultimele două teste, am încercat, de asemenea, să mut metadatele (special) și ZIL (log) pe un mirror din SSD-uri. Însă mutarea metadatelor nu a adus un câștig semnificativ în viteza de scriere, iar în cazul mutării ZIL, SSD-urile mele SSDSC2KI128G8 s-au blocat la 100% utilizare, așa că consider că acest test a fost eșuat. Nu exclud că, dacă aș fi avut SSD-uri mai rapide, rezultatele mele s-ar fi îmbunătățit semnificativ, dar, din păcate, nu le-am avut.

În concluzie, am decis să continui folosind DRAID și, în ciuda statutului său beta, este cea mai rapidă și eficientă soluție de stocare în cazul nostru.

Am creat un DRAID2 simplu în configurația cu trei grupuri și două spare distribuite:

# zpool status data
  pool: data
 state: ONLINE
  scan: none requested
config:

    NAME                 STATE     READ WRITE CKSUM
    data                 ONLINE       0     0     0
      draid2:3g:2s-0     ONLINE       0     0     0
        sdy              ONLINE       0     0     0
        sdam             ONLINE       0     0     0
        sdf              ONLINE       0     0     0
        sdau             ONLINE       0     0     0
        sdab             ONLINE       0     0     0
        sdo              ONLINE       0     0     0
        sdw              ONLINE       0     0     0
        sdak             ONLINE       0     0     0
        sdd              ONLINE       0     0     0
        sdas             ONLINE       0     0     0
        sdm              ONLINE       0     0     0
        sdu              ONLINE       0     0     0
        sdai             ONLINE       0     0     0
        sdaq             ONLINE       0     0     0
        sdk              ONLINE       0     0     0
        sds              ONLINE       0     0     0
        sdag             ONLINE       0     0     0
        sdi              ONLINE       0     0     0
        sdq              ONLINE       0     0     0
        sdae             ONLINE       0     0     0
        sdz              ONLINE       0     0     0
        sdan             ONLINE       0     0     0
        sdg              ONLINE       0     0     0
        sdac             ONLINE       0     0     0
        sdx              ONLINE       0     0     0
        sdal             ONLINE       0     0     0
        sde              ONLINE       0     0     0
        sdat             ONLINE       0     0     0
        sdaa             ONLINE       0     0     0
        sdn              ONLINE       0     0     0
        sdv              ONLINE       0     0     0
        sdaj             ONLINE       0     0     0
        sdc              ONLINE       0     0     0
        sdar             ONLINE       0     0     0
        sdl              ONLINE       0     0     0
        sdt              ONLINE       0     0     0
        sdah             ONLINE       0     0     0
        sdap             ONLINE       0     0     0
        sdj              ONLINE       0     0     0
        sdr              ONLINE       0     0     0
        sdaf             ONLINE       0     0     0
        sdao             ONLINE       0     0     0
        sdh              ONLINE       0     0     0
        sdp              ONLINE       0     0     0
        sdad             ONLINE       0     0     0
    spares
      s0-draid2:3g:2s-0  AVAIL   
      s1-draid2:3g:2s-0  AVAIL   

errors: No known data errors

Bine, am clarificat cu stocarea, acum să vorbim despre ce vom folosi pentru backup. Aici vreau să vorbesc despre trei soluții pe care am reușit să le testez, și anume:

Benji Backup — fork Backy2, o soluție specializată pentru backup-ul dispozitivelor bloc, are o integrare strânsă cu Ceph. Poate extrage dif-uri între snapshot-uri și forma un backup incremental din acestea. Suportă un număr mare de backend-uri de stocare, printre care se numără atât stocarea locală, cât și S3. Necesită o bază de date separată pentru a păstra tabelul de hash pentru deduplicare. Printre dezavantaje: este scris în python, are un cli puțin necorespunzător.

Borg Backup — fork Attic, un instrument cunoscut și testat pentru backup, este capabil să facă backup datelor și le deduplicează eficient. Poate salva backupuri atât local, cât și pe un server la distanță prin scp. Poate face backup la dispozitive bloc dacă este rulat cu flag-ul --special, printre dezavantaje: la crearea unui backup, repository-ul este complet blocat, așa că pentru fiecare mașină virtuală se recomandă crearea unui repository separat, ceea ce nu este o problemă, având în vedere că se creează foarte ușor.

Restic — un proiect în dezvoltare activă, scris în go, suficient de rapid și care suportă un număr mare de backend-uri pentru stocare, printre care se numără atât stocarea locală, cât și scp, S3 și multe altele. Merită menționat faptul că există un rest-server creat special pentru restic, care permite exportarea celui mai rapid al storage-ului pentru utilizare la distanță. Dintre toate cele menționate mai sus, acesta mi-a plăcut cel mai mult. Poate face backup din stdin. Nu are dezavantaje notabile, dar există câteva particularități:

  • În primul rând, am încercat să-l folosesc în modul repository comun pentru toate mașinile virtuale (ca Benji) și a funcționat destul de bine, dar operațiile de restaurare au durat destul de mult timp, deoarece de fiecare dată înainte de restaurare, restic încearcă să citească metadatele tuturor backup-urilor. Această problemă a fost rezolvată, la fel ca și cu borg, prin crearea unui repository separat pentru fiecare mașină virtuală. Această abordare s-a dovedit a fi foarte eficientă și pentru gestionarea backup-urilor. Repository-urile separate pot avea o parolă distinctă pentru accesul la date, iar noi nu trebuie să ne temem că repository-ul global s-ar putea strica. Crearea de noi repository-uri se poate face la fel de simplu ca în borg backup.

    În orice caz, deduplicarea se realizează doar în raport cu versiunea anterioară a backup-ului, iar backup-ul anterior este determinat de calea pentru backup-ul specificat, așa că, dacă faceți backup la diferite obiecte din stdin într-un depozit comun, nu uitați să specificați opțiunea --stdin-filename, sau să specificați explicit opțiunea de fiecare dată --parent.

  • În al doilea rând, restaurarea în stdout durează semnificativ mai mult decât restaurarea pe sistemul de fișiere, din cauza paralelismului său. În viitor, se preconizează adăugarea unei suport mai strâns pentru backup-urile de dispozitive bloc.

  • În al treilea rând, în prezent se recomandă utilizarea versiunii din master, deoarece versiunea 0.9.6 are un bug cu restaurarea lentă a fișierelor mari.

Pentru a testa eficiența backup-ului și viteza de scriere/restaurare din backup, am creat un depozit separat și am încercat să fac backup la o imagine mică a unei mașini virtuale (21 GB). Au fost efectuate două backup-uri fără a modifica originalul, folosind fiecare dintre soluțiile enumerate, pentru a verifica cât de repede/lent sunt copiate datele deduplicate.

Stoc de backup pentru mii de mașini virtuale cu instrumente gratuite

Așa cum putem observa, Borg Backup are cel mai bun coeficient de eficiență al backup-ului inițial, dar pierde la viteza atât de scriere, cât și de restaurare.

Restic s-a dovedit a fi mai rapid decât Benji Backup, dar restaurează mai lent în stdout, iar scrierea direct în dispozitivele bloc nu este, din păcate, încă posibilă.

Cântărind toate aspectele, am decis să mă opresc pe restic de rest-server ca fiind soluția cea mai convenabilă și promițătoare pentru backup.

Stoc de backup pentru mii de mașini virtuale cu instrumente gratuite

În acest screencast, puteți vedea cum canalul de 10 gigabiți este complet utilizat în timpul mai multor operații de backup care rulează simultan. Merită menționat că utilizarea discurilor nu depășește 30%.

Sunt mai mult decât mulțumit de soluția obținută!

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster