Kopiranje datotek s hitrim večnitnim procesom parsyncfp
Uvod
parsyncfp je vzporedni ovoj okoli rsync, ki pospeši prenos velikih zbirk datotek tako, da hkrati zažene več procesov rsync. Vsak proces sinhronizira svoj del datotek, zato sta razpoložljiva pasovna širina in CPE uporabljena učinkoviteje kot pri enem samem toku rsync.
Ta priročnik opisuje, kdaj je parsyncfp uporaben, kako ga namestiti in kako izvesti osnovni prenos med dvema strežnikoma.
Vzporedno kopiranje pospeši prenose samo pri hitrih diskih in stabilnem omrežju. Pri počasnih diskih ali omrežno priklopljenih datotečnih sistemih (NFS, SMB, FUSE) povečanje števila vzporednih procesov pogosto ne prinese večje hitrosti in lahko namesto tega dodatno obremeni izvorni strežnik, ciljni strežnik ali povezavo med njima. Začnite z majhnim številom procesov, izmerite rezultat in povečajte njihovo število le, če diski in omrežje to zmorejo.
Kako deluje parsyncfp
parsyncfp uporablja orodje fpart za razdelitev izvornega drevesa datotek na dele približno enake velikosti, nato pa vzporedno zažene več procesov rsync, po enega za vsak del. Ker fpart drevo deli postopoma, lahko parsyncfp začne prenašati datoteke, še preden je celotno izvorno drevo pregledano, kar je pomembno pri zelo velikih drevesih imenikov.
Orodje mora biti nameščeno samo na izvornem strežniku. rsync na ciljni strani deluje kot običajno.
Isti avtor razvija tudi naslednika z imenom parsyncfp2 (pfp2), ki vključuje popravke napak in izboljšave v primerjavi s parsyncfp ter dodatno podpira hkratno pošiljanje z več izvornih gostiteljev. Za nove namestitve je priporočena izbira parsyncfp2. Ta priročnik obravnava klasični parsyncfp; sintaksa ukazov pfp2 je v veliki meri združljiva.
Kdaj je parsyncfp uporaben
parsyncfp prinese največjo korist, kadar:
- izvor vsebuje milijone majhnih datotek, kjer rsync večino časa porabi za operacije z metapodatki namesto za dejanski prenos podatkov;
- sta tako izvor kot cilj na hitrem pomnilniku (NVMe, SSD ali dobro nastavljen RAID);
- je omrežje med izvornim in ciljnim strežnikom hitro in stabilno (1 Gbps ali več, nizka izguba paketov);
- je en sam proces rsync omejen zaradi CPE ali prepustnosti posameznega toka, ne pa zaradi diska ali omrežne povezave.
Za majhne imenike, počasne mehanske diske ali zasičeno omrežje je običajni rsync praviloma povsem dovolj.
Imenik ~/.parsyncfp
parsyncfp na izvornem strežniku ustvari predpomnilniški imenik z imenom ~/.parsyncfp. V njem se nahaja podimenik fpcache, ki vsebuje dnevnik fpart, datoteke PID trenutno zagnanih procesov rsync ter datoteke z deli, v katerih so navedene poti, ki jih mora posamezni rsync kopirati. Dnevniške datoteke imajo časovni žig in se med posameznimi zagoni ne prepisujejo, zato je mogoče pozneje pregledati prejšnje prenose.
Če želite hkrati zagnati več primerkov parsyncfp, vsakemu določite ločeno lokacijo predpomnilnika z možnostjo --altcache. parsyncfp ob zagonu zazna druge aktivne primerke in nanje opozori, zato so nenamerni prekrivajoči se zagoni hitro vidni.
Nameščanje odvisnosti
parsyncfp uporablja rsync (za prenos) in fpart (za razdelitev izvornega drevesa na dele). Oba paketa namestite na izvorni strežnik.
V Debianu in Ubuntuju:
apt-get install rsync fpart
V sistemih RHEL, CentOS Stream, AlmaLinux in Rocky Linux paket fpart ni na voljo v osnovnih repozitorijih. Najprej omogočite repozitorij EPEL, nato namestite oba paketa:
dnf install epel-release dnf install rsync fpart
Nekateri paketi EPEL so odvisni od paketov iz repozitorija PowerTools ali CRB, ki je privzeto onemogočen. Omogočite ustreznega glede na svojo različico:
# RHEL/AlmaLinux/Rocky Linux 9 and newer dnf config-manager --set-enabled crb # RHEL/AlmaLinux/Rocky Linux 8 dnf config-manager --set-enabled powertools
Če vaša distribucija sploh ne ponuja paketa fpart (na primer RHEL 10 ali njegove izpeljanke v času pisanja tega priročnika) ali ne želite uporabljati EPEL, lahko fpart prevedete iz izvorne kode. Uradni repozitorij je fpart GitHub repository; datoteka README vsebuje kratek seznam potrebnih odvisnosti za prevajanje (prevajalnik C, make in standardne glave knjižnice C).
Nameščanje parsyncfp
parsyncfp je ena sama skripta Perl, ki gostuje na GitHubu. Prenesite jo, naredite izvršljivo in jo premaknite v imenik, ki je v vaši spremenljivki PATH, da jo lahko zaženete brez vnosa celotne poti:
wget https://raw.githubusercontent.com/hjmangalam/parsyncfp/master/parsy ncfp chmod +x parsyncfp sudo mv parsyncfp /usr/local/bin/
Preverite, ali se skripta pravilno zažene:
parsyncfp --help
Če se prikaže zaslon s pomočjo, je parsyncfp pripravljen za uporabo.
Nastavitev dostopa SSH do ciljnega strežnika
parsyncfp uporablja rsync prek SSH, zato se mora izvorni strežnik na ciljni strežnik prijaviti brez gesla. Na izvornem strežniku ustvarite par ključev (če še ne obstaja) in javni ključ kopirajte na ciljni strežnik:
ssh-keygen ssh-copy-id user@target_host
Zamenjajte user@target_host z uporabniškim imenom ter naslovom IP ali imenom gostitelja ciljnega strežnika. Po tem koraku bi se moral spodnji ukaz povezati brez zahteve po geslu:
ssh user@target_host
Izvajanje prenosa
Običajen ukaz parsyncfp je videti takole:
parsyncfp --NP=8 --altcache=/dir/local/tmp --startdir=/dir/local/ www/ [email protected]:/var/dir/
Ta ukaz zažene 8 procesov rsync, uporabi /dir/local/tmp kot predpomnilniški imenik in kopira vsebino imenika /dir/local/www v /var/dir/ na ciljnem gostitelju 192.168.67.1.
Bodite pozorni na končno poševnico pri izvornem argumentu: www/ kopira vsebino imenika www v ciljni imenik (kot v zgornjem primeru), medtem ko www brez poševnice kopira sam imenik www in na cilju ustvari /var/dir/www/. To je enako vedenje kot pri običajnem rsync.
Glavni parametri ukaza
- --NP določa število vzporednih procesov rsync. Razumno začetno število je od 4 do 8; število povečujte postopoma in le, če diski ter omrežje še niso zasičeni. Nastavitev --NP na enako število, kot je število jeder CPE, sama po sebi le redko predstavlja optimalno izbiro.
- --altcache določa alternativni predpomnilniški imenik. Uporaben je pri hkratnem zagonu več primerkov parsyncfp ali kadar je privzeta lokacija na počasnem pomnilniku. Izogibajte se lokacijam, podprtim s tmpfs (na primer /tmp v številnih distribucijah), saj lahko seznami delov pri zelo velikih drevesih datotek postanejo zelo veliki in porabijo dragoceni RAM.
- --startdir določa delovni imenik, ki se uporablja kot osnova za izvorne poti, navedene za njim.
- Argumenti za --startdir predstavljajo izvorne imenike za kopiranje (enega ali več, ločenih s presledki), nato pa sledi cilj v slogu rsync v obliki user@host:/path/.
Za celoten seznam možnosti zaženite parsyncfp --help ali si oglejte uradno dokumentacijo projekta.
Uporabne dodatne možnosti
Ko osnovni prenos deluje, je za produkcijsko uporabo koristno poznati še nekaj možnosti:
- --maxbw=500000 omeji skupno pasovno širino, ki jo uporabljajo vsi procesi rsync, v KB/s. Uporabno, kadar povezavo uporabljajo tudi druge storitve.
- --maxload=12 začasno ustavi zaganjanje novih procesov rsync, ko povprečna obremenitev sistema preseže določeno vrednost. Uporabno na obremenjenih izvornih strežnikih, vendar pred uporabo preberite spodnje opozorilo.
- --chunksize=5G določa velikost posameznega dela, ki ga ustvari fpart. Večji deli zmanjšajo režijske stroške pri prenosu velikega števila majhnih datotek, manjši deli pa izboljšajo vzporednost pri prenosu nekaj zelo velikih datotek.
- --rsyncopts="-a -s -x" omogoča posredovanje dodatnih možnosti neposredno osnovnim procesom rsync. Uporabite ga za omogočanje stiskanja (-z), nastavitev lastne velikosti blokov ali druge prilagoditve rsync. Možnosti --delete ne posredujte prek --rsyncopts; razlog je pojasnjen v spodnjem razdelku Omejitve.
- --verbose=2 poveča podrobnost zapisovanja dnevnikov, kar olajša odpravljanje težav pri prvih zagonih.
Avtor projekta je dokumentiral znano težavo z možnostjo --maxload: kadar parsyncfp večkrat prehaja med stanjem začasne zaustavitve in nadaljevanja, se lahko zgodi, da nekatere izvorne datoteke ne bodo prenesene na ciljni strežnik. Če uporabljate --maxload, nastavite prag dovolj visoko, da do zaustavitev nikoli ne pride, ali pa po končanem prenosu rezultat preverite z ločenim preverjanjem skladnosti podatkov.
Omejitve
Tudi na ustrezni strojni opremi ima parsyncfp nekaj omejitev, ki jih je dobro poznati, preden povečate število procesov:
- parsyncfp ne podpira varne uporabe možnosti rsync --delete. Vsak vzporedni proces rsync vidi samo svoj del izvornih datotek, zato bo ob uporabi --delete vsak proces poskušal izbrisati datoteke na cilju, ki niso v njegovem delu, čeprav lahko zakonito pripadajo drugim delom. To lahko izbriše velik del podatkov na ciljnem strežniku. Kadar potrebujete semantiko --delete, uporabite običajni rsync ali ločen postopek čiščenja.
- parsyncfp ne ohranja globalnega vrstnega reda datotek med vzporednimi procesi rsync, zato vrstni red pojavljanja datotek na cilju ni predvidljiv. To je pomembno samo pri postopkih, ki so med samim kopiranjem odvisni od časovnih žigov datotek ali vrstnega reda prikaza vsebine imenikov.
- Pri poljih diskov HDD več vzporednih procesov rsync spremeni zaporedni vzorec branja v skoraj naključnega, kar je lahko počasneje kot en sam rsync. Diski SSD in NVMe so zaradi tega precej manj prizadeti.
- Na datotečnih sistemih z zelo velikim številom majhnih datotek lahko režijski stroški obdelave metapodatkov posamezne datoteke prevladajo nad časom prenosa. Vzporednost pomaga do določene mere, nato pa se izboljšanje hitrosti ustavi.
- Vsak proces rsync odpre svojo povezavo SSH do ciljnega strežnika, zato visoke vrednosti --NP povečajo režijske stroške vzpostavljanja povezav. Pri povezavah WAN z izgubo paketov ali veliko zakasnitvijo lahko to povzroči večjo zasičenost namesto boljše zmogljivosti. V takšnih primerih manj procesov z dobro nastavljenim rsync (stiskanje, večja velikost blokov) pogosto deluje bolje kot veliko vzporednih procesov.
Glej tudi
Če se izkaže, da je parsyncfp zmogljivejši, kot ga potrebujete, paket fpart vključuje tudi fpsync, enostavnejši vzporedni ovoj za rsync istega avtorja. Uporablja enako metodo razdeljevanja na dele, vendar ponuja manj možnosti in je pogosto povsem dovolj za enkratne prenose.