Kopiranje datoteka s brzim višenitnim parsyncfp-om
Uvod
parsyncfp je paralelni omotač oko rsync-a koji ubrzava prijenos velikih zbirki datoteka pokretanjem više rsync procesa odjednom. Svaki proces sinkronizira vlastiti dio datoteka, pa se dostupna propusnost i procesor koriste učinkovitije nego s jednim rsync tokom.
Ovaj vodič opisuje kada je parsyncfp koristan, kako ga instalirati i kako pokrenuti osnovni prijenos između dva poslužitelja.
Paralelno kopiranje ubrzava prijenose samo na brzim diskovima i stabilnoj mreži. Na sporim diskovima ili mrežno montiranim datotečnim sustavima (NFS, SMB, FUSE), povećanje broja paralelnih procesa često ne donosi nikakav dobitak u brzini i može umjesto toga dodati dodatno opterećenje izvoru, cilju ili vezi između njih. Počnite s malim brojem procesa, izmjerite rezultat i povećavajte broj samo ako diskovi i mreža mogu pratiti.
Kako parsyncfp radi
parsyncfp koristi alat fpart za dijeljenje stabla izvornih datoteka na dijelove približno jednake veličine, a zatim pokreće više rsync procesa paralelno, jedan po dijelu. Budući da fpart dijeli stablo inkrementalno, parsyncfp može početi prenositi datoteke prije nego što se završi potpuno skeniranje izvornog stabla, što je važno za vrlo velika stabla direktorija.
Alat treba instalirati samo na izvornom poslužitelju. rsync obrađuje prijemnu stranu kao i obično.
Isti autor održava nasljednika pod nazivom parsyncfp2 (pfp2), koji uključuje ispravke pogrešaka i poboljšanja u odnosu na parsyncfp te dodatno podržava slanje s više izvornih hostova odjednom. Za nove implementacije, parsyncfp2 je preporučeni izbor. Ovaj vodič pokriva klasični parsyncfp; sintaksa naredbi pfp2 uglavnom je kompatibilna.
Kada je parsyncfp koristan
parsyncfp donosi najveći dobitak kada:
- izvor sadrži milijune malih datoteka, gdje rsync većinu vremena provodi na operacijama s metapodacima umjesto na stvarnom prijenosu podataka;
- i izvor i cilj podržava brza pohrana (NVMe, SSD ili dobro podešen RAID);
- mreža između izvora i cilja je brza i stabilna (1 Gbps ili više, mali gubitak paketa);
- jedan rsync proces ograničen je procesorom ili propusnošću po toku, a ne diskom ili vezom.
Za male direktorije, spore rotirajuće diskove ili zasićenu mrežu obično je dovoljan obični rsync.
Direktorij ~/.parsyncfp
parsyncfp stvara cache direktorij pod nazivom ~/.parsyncfp na izvornom poslužitelju. Unutar njega pronaći ćete poddirektorij fpcache, koji sadrži fpart zapisnik, PID datoteke pokrenutih rsync procesa i chunk datoteke koje navode koje putanje svaki rsync treba kopirati. Datoteke zapisnika imaju datumsku oznaku i ne prepisuju se između pokretanja, pa se prethodna pokretanja mogu pregledati kasnije.
Ako želite pokrenuti više instanci parsyncfp-a istovremeno, svakoj odredite zasebnu lokaciju predmemorije s opcijom --altcache. parsyncfp pri pokretanju otkriva druge pokrenute instance i upozorava na njih, pa slučajno preklapajuća pokretanja postaju vidljiva rano.
Instaliranje ovisnosti
Sam parsyncfp oslanja se na rsync (transport) i fpart (za dijeljenje izvornog stabla na dijelove). Instalirajte oba na izvornom poslužitelju.
Na Debianu i Ubuntuu:
apt-get install rsync fpart
Na RHEL-u, CentOS Streamu, AlmaLinuxu i Rocky Linuxu, fpart nije u osnovnim repozitorijima. Najprije omogućite EPEL repozitorij, zatim instalirajte oba paketa:
dnf install epel-release dnf install rsync fpart
Neki EPEL paketi ovise o paketima iz repozitorija PowerTools ili CRB, koji je prema zadanim postavkama onemogućen. Omogućite pravi za svoju verziju:
# RHEL/AlmaLinux/Rocky Linux 9 i noviji dnf config-manager --set-enabled crb # RHEL/AlmaLinux/Rocky Linux 8 dnf config-manager --set-enabled powertools
Ako vaša distribucija uopće ne isporučuje fpart (na primjer, RHEL 10 ili njegove ponovne izgradnje u trenutku pisanja), ili radije ne koristite EPEL, izgradite fpart iz izvornog koda. Službeni repozitorij je fpart repozitorij na GitHubu; README navodi mali skup ovisnosti za izgradnju (C prevoditelj, make i standardna zaglavlja C knjižnice).
Instaliranje parsyncfp-a
parsyncfp je jedna Perl skripta hostana na GitHubu. Preuzmite je, učinite je izvršnom i premjestite je u direktorij u vašem PATH-u kako biste je mogli pozvati bez upisivanja pune putanje:
wget https://raw.githubusercontent.com/hjmangalam/parsyncfp/master/parsyncfp chmod +x parsyncfp sudo mv parsyncfp /usr/local/bin/
Provjerite pokreće li se skripta:
parsyncfp --help
Ako se pojavi zaslon pomoći, parsyncfp je spreman za upotrebu.
Postavljanje SSH pristupa cilju
parsyncfp pokreće rsync preko SSH-a, pa se izvorni poslužitelj mora moći prijaviti na cilj bez lozinke. Generirajte par ključeva na izvoru (ako već ne postoji) i kopirajte javni ključ na cilj:
ssh-keygen ssh-copy-id user@target_host
Zamijenite user@target_host korisničkim imenom i IP-om ili nazivom hosta vašeg ciljnog poslužitelja. Nakon ovog koraka, donja naredba trebala bi se spojiti bez traženja lozinke:
ssh user@target_host
Pokretanje prijenosa
Tipična parsyncfp naredba izgleda ovako:
parsyncfp --NP=8 --altcache=/dir/local/tmp --startdir=/dir/local/ www/ [email protected]:/var/dir/
Ova naredba pokreće 8 rsync procesa, koristi /dir/local/tmp kao cache direktorij i kopira sadržaj /dir/local/www u /var/dir/ na ciljnom hostu 192.168.67.1.
Obratite pozornost na završnu kosu crtu u argumentu izvora: www/ kopira sadržaj direktorija www u cilj (kao u gornjem primjeru), dok www (bez kose crte) kopira sam direktorij www, stvarajući /var/dir/www/ na cilju. Ovo je isto ponašanje kao kod običnog rsync-a.
Ključni parametri naredbe
- --NP postavlja broj paralelnih rsync procesa. Razumna polazna točka je 4 do 8; povećavajte broj postupno i samo ako diskovi i mreža još nisu zasićeni. Postavljanje --NP jednako broju procesorskih jezgri samo po sebi rijetko je pravi izbor.
- --altcache određuje alternativni cache direktorij. Koristan je kada pokrećete više instanci parsyncfp-a istovremeno ili kada je zadana lokacija na sporoj pohrani. Izbjegavajte usmjeravanje na lokaciju temeljenu na tmpfs (poput /tmp u mnogim distribucijama), jer popisi dijelova za vrlo velika izvorna stabla mogu narasti, a ne želite da troše RAM.
- --startdir postavlja radni direktorij koji se koristi kao osnova za izvorne putanje koje slijede.
Argumenti nakon --startdir su izvorni direktoriji za kopiranje (jedan ili više, odvojeni razmakom), nakon čega slijedi cilj u stilu rsync-a u obliku user@host:/path/.
Za potpuni popis opcija pokrenite parsyncfp --help ili pogledajte upstream dokumentaciju.
Korisne dodatne opcije
Kada osnovni prijenos radi, vrijedi poznavati nekoliko opcija za produkcijska pokretanja:
- --maxbw=500000 ograničava ukupnu propusnost koju koriste svi rsync procesi, u KB/s. Korisno kada je veza dijeljena s drugim uslugama.
- --maxload=12 pauzira pokretanje novih rsync procesa kada prosječno opterećenje sustava prijeđe zadanu vrijednost. Korisno na opterećenim izvornim poslužiteljima, ali pročitajte upozorenje u nastavku prije korištenja.
- --chunksize=5G kontrolira koliko je velik svaki fpart dio. Veći dijelovi smanjuju režijske troškove po dijelu kod prijenosa s mnogo malih datoteka; manji dijelovi poboljšavaju paralelizam kod prijenosa s nekoliko vrlo velikih datoteka.
- --rsyncopts="-a -s -x" omogućuje prosljeđivanje dodatnih zastavica izravno temeljnim rsync procesima. Koristite ga za omogućavanje kompresije (-z), postavljanje prilagođene veličine bloka ili primjenu drugih rsync podešavanja. Ne prosljeđujte --delete kroz --rsyncopts; pogledajte odjeljak "Ograničenja" u nastavku zašto to nije sigurno.
- --verbose=2 povećava razinu detalja zapisivanja, što olakšava rješavanje problema kod prvih pokretanja.
Upstream autor je dokumentirao poznati problem s --maxload: kada parsyncfp prolazi kroz ponavljajuće cikluse obustave i nastavka, neke izvorne datoteke možda neće biti prenesene na cilj. Ako koristite --maxload, postavite prag dovoljno visoko da se obustave nikada ne pokrenu, ili provjerite rezultat zasebnom provjerom dosljednosti nakon završetka prijenosa.
Ograničenja
Čak i na prikladnom hardveru, parsyncfp ima kompromise koje vrijedi poznavati prije povećanja broja procesa:
- parsyncfp ne podržava sigurno opciju --delete rsync-a. Svaki paralelni rsync proces vidi samo vlastiti dio izvora, pa ako se --delete proslijedi, svaki proces pokušat će izbrisati datoteke na cilju koje nisu u njegovom dijelu, odnosno datoteke koje legitimno pripadaju drugim dijelovima. To može izbrisati velike dijelove cilja. Koristite obični rsync (ili zasebni prolaz čišćenja) kada vam treba semantika --delete.
- parsyncfp ne čuva globalni redoslijed datoteka među paralelnim rsync procesima, pa redoslijed kojim se datoteke pojavljuju na cilju nije predvidljiv. To je važno samo za radne tijekove koji ovise o vremenskim oznakama datoteka ili redoslijedu izlistavanja direktorija tijekom samog kopiranja.
- Na HDD poljima, mnogi paralelni rsync procesi pretvaraju ono što bi bio sekvencijalni obrazac čitanja u gotovo nasumičan, što može biti sporije od jednog rsync-a. SSD i NVMe pogoni puno su manje pogođeni.
- Na datotečnim sustavima s vrlo velikim brojem malih datoteka, režijski troškovi metapodataka po datoteci mogu dominirati vremenom prijenosa. Paralelizam pomaže do određene točke, zatim doseže plato.
- Svaki rsync proces otvara vlastitu SSH vezu prema cilju, pa visoke vrijednosti --NP umnožavaju režijske troškove uspostavljanja veze. Na WAN vezama s gubitkom paketa ili velikim kašnjenjem to može pogoršati zagušenje umjesto da ga poboljša. U tom slučaju manje procesa s podešenim rsync-om (kompresija, veća veličina bloka) često radi bolje od mnogo paralelnih.
Vidi također
Ako se parsyncfp pokaže težim nego što vam treba, paket fpart također uključuje fpsync, jednostavniji paralelni rsync omotač istog autora. Koristi istu ideju dijeljenja na dijelove, ali s manje opcija i često je dovoljan za jednokratne prijenose.