
Hej, nyligen stötte jag pÄ en intressant uppgift att konfigurera lagring för backup av ett stort antal blockenheter.
Varje vecka gör vi en sÀkerhetskopiering av alla virtuella maskiner i vÄr molntjÀnst, vilket krÀver att vi kan hantera tusentals sÀkerhetskopior och göra det sÄ snabbt och effektivt som möjligt.
TyvÀrr passar inte standardkonfigurationerna RAID5, RAID6 i det hÀr fallet pÄ grund av att ÄterstÀllningsprocessen pÄ sÄ stora diskar som vÄra skulle vara plÄgsamt lÄngsam och sannolikt aldrig slutföras.
LÄt oss övervÀga vilka alternativ som finns:
â En analog av RAID5, RAID6, men med justerbar paritetsnivĂ„. Backup görs inte blockvis utan för varje objekt separat. Det enklaste sĂ€ttet att prova erasure coding Ă€r att distribuera .
â detta Ă€r för nĂ€rvarande en Ă€nnu inte slĂ€ppt funktion i ZFS. Till skillnad frĂ„n RAIDZ har DRAID en distribuerad paritetsblock och anvĂ€nder alla diskar i arrayen vid Ă„terstĂ€llning, vilket gör att den bĂ€ttre klarar av diskfel och Ă„terhĂ€mtar sig snabbare efter ett fel.


TillgÀnglig Àr en server Fujitsu Primergy RX300 S7 med en processor Intel Xeon CPU E5-2650L 0 @ 1.80GHz, nio moduler RAM-minne Samsung DDR3-1333 8Gb PC3L-10600R ECC Registered (M393B1K70DH0-YH9), en diskhylla Supermicro SuperChassis 847E26-RJBOD1, ansluten via Dual LSI SAS2X36 Expander och 45 diskar Seagage ST6000NM0115-1YZ110 per 6TB varje.
Innan vi kan fatta nÄgra beslut mÄste vi först testa allt ordentligt.
För detta förberedde jag mig och genomförde tester av olika konfigurationer. Jag anvÀnde minio som agerade som S3-backend och körde det i olika lÀgen med olika antal mÄl.
Huvudsakligen testades fallet minio i erasure coding vs programvaruraid med samma antal diskar och paritetsdiskar, det vill sÀga: RAID6, RAIDZ2 och DRAID2.
För referens: nÀr du kör minio med bara ett mÄl, fungerar minio i S3-gatewaylÀge för att ge din lokala filsystem som S3-lagring. Om du Ä sin sida startar minio med flera mÄl aktiveras automatiskt lÀget för Erasure Coding, vilket kommer att sprida data över dina mÄl och ge redundans.
Som standard delar MinIO mÄl pÄ grupper med 16 diskar, dÀr varje grupp har tvÄ parity. Det betyder att tvÄ diskar kan gÄ sönder samtidigt utan att data gÄr förlorad.
För att testa prestanda anvÀnde jag 16 diskar pÄ 6 TB vardera och skrev smÄ objekt pÄ 1 MB, vilket noggrant beskrev vÄr framtida belastning, eftersom alla moderna backupverktyg delar data i block pÄ nÄgra megabyte och skriver dem pÄ det sÀttet.
För att genomföra benchmark-testet anvÀndes verktyget s3bench som kördes pÄ en fjÀrrserver och skickade tiotusentals sÄdana objekt till MinIO i hundratals trÄdar. DÀrefter försökte det pÄ samma sÀtt att hÀmta dem tillbaka.
Resultaten av benchmark-testet presenteras i följande tabell:

Som vi ser fungerar MinIO i sitt eget erasure coding-lÀge betydligt sÀmre vid skrivning Àn MinIO som körs ovanpÄ programvaru-RAID6, RAIDZ2 och DRAID2 i samma konfiguration.
Separat blev jag att testa MinIO pĂ„ ext4 vs XFS. Ăverraskande nog visade det sig att för min typ av belastning var XFS betydligt lĂ„ngsammare Ă€n ext4.
I den första delen av testerna visade Mdadm överlÀgsenhet över ZFS, men senare , att prestandan för ZFS kan förbÀttras genom att stÀlla in följande alternativ:
xattr=sa atime=off recordsize=1Moch efter detta blev testerna med ZFS mycket bÀttre.
Det kan ocksÄ noteras att DRAID inte ger nÄgon betydande prestandavinst jÀmfört med RAIDZ, men i teorin borde det vara mycket sÀkrare.
I de tvÄ senaste testerna försökte jag ocksÄ flytta metadata (special) och ZIL (logg) till en spegel av SSD. Men flytt av metadata gav ingen betydande ökning i skrivhastighet, och nÀr jag flyttade ZIL stötte mina pÄ en vÀgg med 100% utnyttjande, sÄ jag anser att detta test misslyckades. Jag utesluter inte att om jag hade snabbare SSD-diskar skulle det kunna ha förbÀttrat mina resultat kraftigt, men tyvÀrr hade jag inte tillgÄng till sÄdana.
Till slut beslutade jag mig för att stanna vid DRAID och trots sin beta-status Àr det den snabbaste och mest effektiva lösningen för lagring i vÄrt fall.
Jag skapade en enkel DRAID2-konfiguration med tre grupper och tvÄ distribuerade reservdelar:
# 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 errorsBra, vi har löst lagringen, nu om vad vi ska anvÀnda för backup. HÀr vill jag direkt berÀtta om tre lösningar som jag lyckades prova, nÀmligen:
â en fork , en specialiserad lösning för sĂ€kerhetskopiering av blockenheter, har nĂ€ra integration med Ceph. Kan hĂ€mta diffar mellan snapshots och skapa inkrementella sĂ€kerhetskopior frĂ„n dem. Stöder ett stort antal lagringsbackendlösningar, bĂ„de lokala och S3. KrĂ€ver en separat databas för att lagra hash-tabellen för deduplicering. Nackdelar: skriven i python, har en nĂ„got oresponsiv cli.
â en fork , en vĂ€lkĂ€nd och beprövad lösning för sĂ€kerhetskopiering som kan sĂ€kerhetskopiera data och utföra bra deduplicering. Kan spara sĂ€kerhetskopior bĂ„de lokalt och pĂ„ en fjĂ€rrserver via scp. Kan sĂ€kerhetskopiera blockenheter om den körs med flaggan --special, nackdelar: nĂ€r en sĂ€kerhetskopiering skapas blockeras hela lagret sĂ„ det rekommenderas att skapa en separat repository för varje virtuell maskin, vilket inte Ă€r ett problem eftersom de skapas mycket enkelt.
â ett aktivt vĂ€xande projekt skrivet i go, ganska snabbt och stödjer ett stort antal lagringsbackends, bĂ„de lokala lagringslösningar och scp, S3 och mycket mer. Det Ă€r vĂ€rt att notera att det finns en speciellt skapad för restic, som möjliggör snabbaste export av lagret för anvĂ€ndning pĂ„ distans. Av allt ovanstĂ„ende gillade jag detta mest. Kan sĂ€kerhetskopiera frĂ„n stdin. Har nĂ€stan inga mĂ€rkbara nackdelar, men det finns nĂ„gra egenskaper:
För det första, jag försökte anvÀnda det i lÀge för gemensam repository för alla virtuella maskiner (som Benji), och det fungerade faktiskt ganska bra, men ÄterstÀllningsoperationerna tog ganska lÄng tid eftersom restic varje gÄng försöker lÀsa metadata för alla sÀkerhetskopior innan ÄterstÀllningen. Detta problem löstes enkelt, precis som med borg, genom att skapa en separat repository för varje virtuell maskin. Denna metod visade sig vara mycket effektiv Àven för hantering av sÀkerhetskopior. Separata repositories kan ha ett eget lösenord för Ätkomst till data, och vi behöver inte oroa oss för att den globala repository kan gÄ sönder. Att skapa nya repositories Àr ocksÄ lika enkelt som med borg backup.
Under alla omstÀndigheter utförs deduplicering endast i förhÄllande till den tidigare versionen av sÀkerhetskopian. Den tidigare sÀkerhetskopian bestÀms av sökvÀgen för den angivna sÀkerhetskopian, sÄ om du sÀkerhetskopierar olika objekt frÄn stdin till ett gemensamt arkiv, glöm inte att ange alternativet
--stdin-filename, eller ange alternativet varje gÄng explicit--parent.
För det andra tar ÄterstÀllning till stdout betydligt mer tid Àn ÄterstÀllning till filsystemet pÄ grund av dess parallellitet. I framtiden planeras att lÀgga till nÀrmare stöd för sÀkerhetskopior för blockenheter.
För det tredje rekommenderas det för nÀrvarande att anvÀnda , eftersom version 0.9.6 har en bugg med lÄngsam ÄterstÀllning av stora filer.
För att testa effektiviteten av sÀkerhetskopian och hastigheten pÄ skrivning / ÄterstÀllning frÄn sÀkerhetskopian skapade jag ett separat repo och försökte sÀkerhetskopiera en liten bild av en virtuell maskin (21 GB). TvÄ sÀkerhetskopior genomfördes utan att originalet Àndrades, med varje av de angivna lösningarna, för att kontrollera hur mycket snabbare/lÄngsammare de deduplicerade data kopieras.

Som vi kan se har Borg Backup den bÀsta effektiviteten vid den initiala sÀkerhetskopieringen, men den förlorar i hastighet bÄde för skrivning och ÄterstÀllning.
Restic visade sig vara snabbare Àn Benji Backup, men tar lÀngre tid att ÄterstÀlla till stdout och kan tyvÀrr inte skriva direkt till blockenheten Àn.
Efter att ha vÀgt för- och nackdelar beslutade jag mig för att stanna vid restic med rest-server som den mest bekvÀma och lovande lösningen för sÀkerhetskopior.
I den hÀr skÀrminspelningen kan du se hur en 10-gigabits kanal fullt utnyttjas nÀr flera sÀkerhetskopieringsoperationer körs samtidigt. Det Àr vÀrt att notera att diskutnyttjandet inte överstiger 30%.
Jag Àr mer Àn nöjd med den uppnÄdda lösningen!
KĂ€lla: habr.com
