Hur GitLab hjÀlper till att göra sÀkerhetskopior av stora NextCloud-lagringar

Hej, Habr!

Idag vill jag berÀtta om vÄr erfarenhet av att automatisera sÀkerhetskopiering av stora datalager i Nextcloud i olika konfigurationer. Jag arbetar som CTO pÄ "Molniya AK", dÀr vi sysslar med konfigurationshantering av IT-system, dÀr Nextcloud anvÀnds för datalagring. Detta inkluderar distribuerade strukturer med redundans.

Problemen som uppstÄr frÄn installationsspecifika egenskaper Àr att det finns mycket data. Versionshantering som Nextcloud erbjuder, sÀkerhetskopiering, subjektiva orsaker och annat skapar mÄnga dubbletter.

Bakgrund

Vid administration av Nextcloud uppstÄr snabbt problemet med att organisera en effektiv backup som absolut mÄste krypteras, eftersom data Àr vÀrdefulla.

Vi erbjuder alternativ för backup-lagring antingen hos oss eller hos kunden pÄ separata maskiner frÄn Nextcloud, vilket krÀver ett flexibelt automatiserat tillvÀgagÄngssÀtt för administration.

Det finns mÄnga kunder, alla med olika konfigurationer, och alla pÄ sina egna plattformar och med sina egna egenskaper. HÀr passar den standardmetodik dÀr hela plattformen tillhör dig och backuper görs via cron dÄligt.

Vi börjar med att titta pÄ förutsÀttningarna. Vi behöver:

  • Skalbarhet avseende en nod eller flera. För stora installationer anvĂ€nder vi minio som lagringslösning.
  • Att registrera problem med sĂ€kerhetskopieringen.
  • Backup mĂ„ste lagras hos kunder och/eller hos oss.
  • Att snabbt och enkelt kunna lösa problem.
  • Kunder och installationer skiljer sig kraftigt Ă„t — det gĂ„r inte att Ă„stadkomma enhetlighet.
  • ÅterstĂ€llningshastigheten mĂ„ste vara minimal i tvĂ„ scenarier: full Ă„terstĂ€llning (katastrof), en mapp — raderad av misstag.
  • Funktionen för deduplering Ă€r obligatorisk.

Hur GitLab hjÀlper till att göra sÀkerhetskopior av stora NextCloud-lagringar

För att lösa problemet med backup-hantering kopplade vi in GitLab. Mer info i avsnittet nedan.

Naturligtvis Àr vi inte de första som löser ett sÄdant problem, men vi tycker att vÄr praktiska, erfarna erfarenhet kan vara intressant och vi Àr redo att dela med oss av den.

Eftersom vĂ„rt företag har en open source-policy, letade vi efter en lösning med öppen kĂ€llkod. Å sin sida delar vi vĂ„ra utvecklingar och publicerar dem. Till exempel finns vĂ„r plugin för Nextcloud, som vi installerar hos kunder, som stĂ€rkt dataskydd i hĂ€ndelse av oavsiktlig eller avsiktlig radering.

Backup-verktyg

Vi började söka efter lösningar genom att vÀlja ett verktyg för att skapa sÀkerhetskopior.

Vanlig tar + gzip fungerar dÄligt - data dupliceras. Inkremental innehÄller ofta vÀldigt fÄ förÀndringar i praktiken och största delen av datan inom en fil upprepas.
Det finns ytterligare ett problem - redundans i det distribuerade datalagringssystemet. Vi anvÀnder minio och dess data Àr i princip redundanta. Antingen behövde sÀkerhetskopiering göras genom minio sjÀlvt - vilket belastar det och anvÀnder alla mellanliggande lager mellan filsystemet, och inte minst finns det en risk att glömma bort vissa bucketer och metainformation. Alternativt anvÀnda deduplicering.

Det finns dedupliceringsverktyg i öppen kÀllkod (detta Àmne har diskuterats pÄ Habré artiklar och vÄra finalister blev) och vi valde Borg och Restic. Om vÄr jÀmförelse av de tvÄ applikationerna nedan, men först ska vi berÀtta hur vi organiserade hela schemat.

Hantera skapandet av sÀkerhetskopior

Borg och Restic Àr bra, men ingen av produkterna har en centraliserad hanteringsmekanism. För hantering och kontroll valde vi ett verktyg som redan Àr implementerat hos oss, utan vilket vi inte kan tÀnka oss vÄrt arbete, inklusive automatisering - det kÀnda CI/CD - GitLab.

Idén Àr följande: PÄ varje nod som lagrar data för Nextcloud installeras gitlab-runner. Runnern kör ett skript enligt schema som övervakar sÀkerhetskopieringsprocessen, och det initierar Borg eller Restic.

Vad fick vi? Feedback frÄn utförandet, bekvÀm övervakning av förÀndringar och detaljer vid fel.

HÀr Àr hÀr pÄ GitHub vi har lagt upp exempel pÄ skript för olika uppgifter, och vi kopplade det i slutÀndan till sÀkerhetskopieringen av inte bara Nextcloud utan ocksÄ mÄnga andra tjÀnster. DÀr finns ocksÄ schemalÀggaren, om man inte vill stÀlla in det manuellt (och vi vill inte) och .gitlab-ci.yml

Det finns fortfarande ingen möjlighet att Àndra timeout för CI/CD i GitLab API, och den Àr ganska kort. Den mÄste ökas, lÄt oss sÀga till 1d.

Lyckligtvis kan GitLab köras inte bara vid commit utan ocksÄ enligt schema, vilket Àr precis vad vi behöver.

Nu om inlindande skript.

Vi satte upp följande krav för detta skript:

  • Skriptet ska kunna köras bĂ„de av runnern och manuellt frĂ„n konsolen med samma funktionalitet.
  • Det mĂ„ste finnas felhanterare:
  • returkod.
  • söka efter strĂ€ngar i loggen. Till exempel kan ett fel för oss vara ett meddelande som programmet inte ser som fatalt.
  • Hantera timeout. Utförandetiden bör vara rimlig.
  • Vi behöver en detaljerad logg. Men bara i hĂ€ndelse av ett fel.
  • OcksĂ„ en rad tester utförs innan starten.
  • SmĂ„ bekvĂ€mligheter som vi har funnit anvĂ€ndbara under supportprocessen:
  • Start och slut registreras i systemloggen pĂ„ den lokala maskinen. Detta hjĂ€lper oss att koppla samman systemfel och backupens arbete.
  • Delar av felloggen, nĂ€r de finns, visas i stdout, hela loggen skrivs till en separat fil. Det Ă€r praktiskt att snabbt kolla i CI och bedöma felet om det Ă€r trivialt.
  • LĂ€gen för debugging.

Den fullstÀndiga loggen sparas som en artifact i GitLab, om det inte finns nÄgra fel, tas loggen bort. Skriptet skrivs i bash.

Vi ser gĂ€rna eventuella förslag och kommentarer om öppen kĂ€llkod — vĂ€lkommen.

Hur det fungerar

PÄ den noder som ska sÀkerhetskopieras startas en runner med bash-exekverare. I schemalÀggaren startas ett job CI/CD i ett speciellt repo. Runnern kör ett skript, en universell wrapper för sÄdana uppgifter, i vilket validering av backuprepo, monteringspunkter och allt vi vill kontrolleras, följt av backup och rensning av gammal data. Den fÀrdiga backupen skickas till S3.

Vi arbetar enligt detta schema — en extern leverantör av AWS eller en rysk motsvarighet (detta Ă€r snabbare och data lĂ€mnar inte Ryssland). Alternativt installerar vi en separat minio-kluster hos kunden för dessa Ă€ndamĂ„l. Vi brukar göra sĂ„ av sĂ€kerhetsskĂ€l nĂ€r kunden verkligen inte vill att data ska lĂ€mna deras kontur.

Vi har valt att inte anvÀnda funktionen för att skicka backup via ssh. Det ger ingen extra sÀkerhet, och nÀtverksmöjligheterna hos S3-leverantören Àr mycket högre Àn med en enda ssh-maskin.

För att skydda mot hackers pĂ„ den lokala maskinen — eftersom de kan radera data pĂ„ S3, bör versionering definitivt aktiveras.
Bakup-programmet krypterar alltid backupen.

Borg har ett lÀge utan kryptering none, men vi rekommenderar starkt att inte aktivera det. I detta lÀge kommer det inte bara att saknas kryptering, utan Àven kontrollsumman för det som skrivs kommer inte att berÀknas, vilket innebÀr att integriteten endast kan kontrolleras indirekt genom index.

En separat schemalÀggare utför kontroll av backupens integritet för index och innehÄll. Kontrollen sker lÄngsamt och tar tid, sÄ vi kör den separat en gÄng i mÄnaden. Den kan pÄgÄ i flera dagar.

README pÄ ryska

Huvudfunktioner

  • converge förberedelse
  • testkolla kontroll av beredskap
  • huvudkommando grundlĂ€ggande kommando
  • tvĂ„ngsbakgrund en funktion som körs i slutet eller vid fel. AnvĂ€nds för att avmontera partitionen.

TjÀnstefunktioner

  • — borttagning av instansen. vi registrerar fel eller raderar loggfilen.
  • checklog vi parsar loggen för att hitta strĂ€ngen med felet.
  • ret exit-hanterare.
  • checktimeout timeoutkontroll.

Environment

  • VERBOSE=1 vi skriver ut fel direkt pĂ„ skĂ€rmen (stdout).
  • SAVELOGSONSUCCES=1 vi sparar loggen vid framgĂ„ng.
  • INIT_REPO_IF_NOT_EXIST=1 Vi skapar ett repository om det inte fanns. Som standard avstĂ€ngt.
  • TIMEOUT maximal tid för grundlĂ€ggande operation. Du kan ange 'm', 'h' eller 'd' i slutet.

LagringslÀge för Àldre kopior. Som standard:

  • KEEP_DAILY=7
  • KEEP_WEEKLY=4
  • KEEP_MONTHLY=6

Variabler inom skriptet

  • ERROR_STRING — strĂ€ng för att kontrollera loggen för fel.
  • EXTRACT_ERROR_STRING — uttryck för att visa strĂ€ng om det finns ett fel.
  • KILL_TIMEOUT_SIGNAL — signal för att döda om timeout.
  • TAIL — hur mĂ„nga strĂ€ngar med fel som visas pĂ„ skĂ€rmen.
  • COLORMSG — fĂ€rg pĂ„ meddelandet (standard gul).

Det skript som kallas wordpress har som funktion att ocksÄ ta sÀkerhetskopior av mysql-databasen. Det kan alltsÄ anvÀndas för engÄngsinstallationer av Nexcloud, dÀr databasen ocksÄ kan backas upp. BekvÀmligheten ligger inte bara i att allt Àr pÄ ett stÀlle, utan att innehÄllet i databasen Àr nÀra relaterat till innehÄllet i filerna, eftersom tidsskillnaden Àr minimal.

Restic vs Borg

JÀmförelser mellan Borg och Restic finns bland annat hÀr pÄ Habré, och vÄrt mÄl var inte bara att skapa ytterligare en, utan vÄr egen. Vi ville förstÄ hur det skulle se ut pÄ vÄra data, med vÄr specifikation. Vi tar med dem.

VÄra urvalskriterier, förutom de tidigare nÀmnda (deduplicering, snabb ÄterstÀllning osv.):

  • MotstĂ„ndskraft mot ofullstĂ€ndig drift. Kontroll för kill -9.
  • Storlek pĂ„ disken.
  • Krav pĂ„ resurser (CPU, minne).
  • Storlek pĂ„ de lagrade blobbarna.
  • Arbete med S3.
  • Integritetskontroll.

För testning tog vi en klient med verkliga data och en total storlek pÄ 1,6TB.
Villkor.

Borg kan inte direkt arbeta med S3, och vi monterade det som en fuse-disk genom goofys. Restic skickade data till S3 sjÀlv.

Goofys fungerar mycket snabbt och bra, och det finns diskcachemodul, vilket ytterligare accelererar arbetet. Den Àr i beta-stadiet, och vi mÄste erkÀnna att vi förlorade data under tester (andra). Men fördelen Àr att sjÀlva backupproceduren inte krÀver mycket lÀsning, utan mest skrivning, sÄ vi anvÀnder cachen endast under integritetskontrollen.

För att minska nĂ€tverksinflytandet anvĂ€nde vi en lokal leverantör — Yandex Cloud.

Resultat frÄn testningen av jÀmförelsen.

  • Kill -9 med efterföljande omstart gick bĂ„da igenom framgĂ„ngsrikt.
  • Storlek pĂ„ disken. Borg kan komprimera, sĂ„ resultaten Ă€r förvĂ€ntade.

Backuper
Dimensions

Borg
562Gb

Restic
628Gb

  • Enligt CPU
    Borg sjÀlv förbrukar lite med standardkomprimering, men man mÄste bedöma det tillsammans med goofys-processen. Tillsammans Àr de jÀmförbara och anvÀnder cirka 1,2 kÀrnor pÄ samma testvirtuella maskin.
  • Minne. Restic cirka 0,5Gb, Borg cirka 200Mb. Men detta Ă€r ganska obetydligt jĂ€mfört med systemets filcache. SĂ„ det Ă€r önskvĂ€rt att allokera mer minne.
  • Skillnaden i storlek pĂ„ blobbar var slĂ„ende.

Backuper
Dimensions

Borg
cirka 500Mb

Restic
cirka 5Mb

  • Arbetet med S3 frĂ„n Restic Ă€r utmĂ€rkt. Borgs arbete genom goofys verkar ok, men det har noterats att det Ă€r bĂ€ttre att utföra umount efter backupen för att helt rensa cachen. En egenskap hos S3 Ă€r att ofullstĂ€ndiga chunkar aldrig skickas till bucket, vilket innebĂ€r att inte helt uppladdade data leder till stora skador.
  • Integritetskontrollen fungerar bra i bĂ„da fallen, men hastigheten skiljer sig markant.
    Restic – 3,5 timmar.
    Borg, med en filcache pĂ„ 100Gb SSD – 5 timmar. UngefĂ€r samma resultat i hastighet om datan ligger pĂ„ lokal disk.
    Borg lÀser direkt frÄn S3 utan cache 33 timmar. FruktansvÀrt lÄng tid.

I det stora hela kan Borg komprimera och har större blobbar - vilket gör lagringen och GET/PUT-operationer i S3 billigare. Men det fÄr man betala för med en mer komplex och lÄngsammare kontroll. NÀr det gÀller ÄterstÀllningshastigheten mÀrkte vi ingen skillnad. Efterföljande backuper (efter den första) gör restic nÄgra minuter lÀngre, men inte avsevÀrt.

Size community stod inte pÄ sista plats i valet.

Och vi valde borg.

Ett par ord om komprimering

Borg har ett utmÀrkt nytt komprimeringsalgoritm i sin arsenal - zstd. Komprimeringskvaliteten Àr inte sÀmre Àn gzip, men betydligt snabbare. Och jÀmförbar i hastighet med den standardmÀssiga lz4.

Till exempel komprimeras en MySQL-dump ungefÀr tvÄ gÄnger bÀttre Àn lz4 med samma hastighet. Men erfarenheten pÄ verkliga data visar att det Àr mycket liten skillnad i komprimeringseffektivitet för Nextcloud-noden.

Borg har ett ganska bonuslÀge för komprimering - om filen har hög entropi tillÀmpas ingen komprimering alls, vilket ökar hastigheten. Det aktiveras med en parameter vid skapandet
-C auto,zstd
för zstd-algoritmen
SÄ med denna parameter i jÀmförelse med standardkomprimeringen uppnÄdde vi
560 Gb och 562 Gb respektive. Data frÄn exemplet ovan, utan komprimering, ger 628 Gb. Resultatet med en skillnad pÄ 2 Gb överraskade oss nÄgot, men vi kom fram till att vi vÀljer ÀndÄ auto,zstd.

Metod för att verifiera backup

Genom schemalĂ€ggaren startas virtuella maskiner direkt hos leverantören eller hos kunden, vilket kraftigt minskar nĂ€tverksbelastningen. Åtminstone Ă€r det billigare Ă€n att köra det pĂ„ plats hos oss och skicka trafik.

goofys --cache "--free:5%:/mnt/cache" -o allow_other --endpoint https://storage.yandexcloud.net --file-mode=0666 --dir-mode=0777 xxxxxxx.com /mnt/goofys
export BORG_PASSCOMMAND="cat /home/borg/.borg-passphrase"
borg list /mnt/goofys/borg1/
borg check --debug -p --verify-data /mnt/goofys/borg1/

Vi kontrollerar filer med antivirus pÄ samma sÀtt (efterhand). AnvÀndare laddar upp olika saker till Nextcloud och alla har inte antivirus. Att göra en kontroll vid uppladdning tar för mycket tid och stör verksamheten.

Skalbarhet uppnÄs genom att köra runners pÄ olika noder med olika taggar.
I vÄr övervakning samlas statusar för backuper via GitLab API i ett fönster, vilket gör att problem lÀtt kan identifieras och lokaliseras.

Slutsats

Som ett resultat vet vi med sÀkerhet att vi gör vÄra backuper, att vÄra backuper Àr giltiga, och att de problem som uppstÄr med dem tar lite tid och löses av den jourhavande administratören. Backuper tar faktiskt vÀldigt lite plats i jÀmförelse med tar.gz eller Bacula.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster