Flytta data till vFXT-klustret – Parallell datainmatning
När du har skapat ett nytt vFXT-kluster kan din första uppgift vara att flytta data till en ny lagringsvolym i Azure. Men om din vanliga metod för att flytta data som utfärdar ett enkelt kopieringskommando från en klient, kommer du troligen att se en långsam kopieringsprestanda. Enkeltrådig kopiering är inte ett bra alternativ för att kopiera data till Avere vFXT-klustrets backend-lagring.
Eftersom klustret Avere vFXT for Azure skalbart cacheminne för flera klienter är det snabbaste och mest effektiva sättet att kopiera data till det att vara med flera klienter. Den här tekniken parallelliserar inmatning av filer och objekt.

Kommandona eller som ofta används för att använda för att överföra data från ett lagringssystem till ett annat är entrådiga processer som endast kopierar cp copy en fil i taget. Det innebär att filservern bara matar in en fil i taget – vilket är slöseri med klustrets resurser.
Den här artikeln beskriver strategier för att skapa ett filkopieringssystem med flera klienter och flera trådar för att flytta data Avere vFXT klustret. Den förklarar filöverföringsbegrepp och beslutspunkter som kan användas för effektiv datakopiering med flera klienter och enkla kopieringskommandon.
Här förklaras även några verktyg som kan vara till hjälp. -verktyget msrsync kan användas för att delvis automatisera processen med att dela upp en datauppsättning i buckets och använda rsync kommandon. Skriptet parallelcp är ett annat verktyg som läser källkatalogen och utfärdar kopieringskommandon automatiskt. Verktyget kan också rsync användas i två faser för att ge en snabbare kopia som fortfarande ger datakonsekvens.
Klicka på länken för att gå till ett avsnitt:
- Exempel på manuell kopiering – En grundlig förklaring med hjälp av kopieringskommandon
- Rsync-exempel med två faser
- Delvis automatiserat (msrsync) exempel
- Exempel på parallellkopiering
Mall för data ingestor VM
Det Resource Manager en mall på GitHub att automatiskt skapa en virtuell dator med de parallella datainmatningsverktyg som anges i den här artikeln.

Den virtuella datorn data ingestor ingår i en självstudie där den nyligen skapade virtuella datorn monterar Avere vFXT-klustret och laddar ned startskriptet från klustret. Mer information finns i Bootstrap a data ingestor VM (Bootstrap en data ingestor VM).
Strategisk planering
När du utformar en strategi för att kopiera data parallellt bör du förstå kompromisserna vad gäller filstorlek, antal filer och katalogdjup.
- När filerna är små är det intressanta måttet filer per sekund.
- När filerna är stora (10MiBi eller större) är det intressanta måttet byte per sekund.
Varje kopieringsprocess har en dataflödeshastighet och en filöverföringshastighet som kan mätas genom tidsinställning av kopieringskommandots längd och faktorisering av filstorlek och antal filer. Att förklara hur du mäter frekvensen ligger utanför omfånget för det här dokumentet, men det är viktigt att förstå om du kommer att hantera små eller stora filer.
Exempel på manuell kopiering
Du kan manuellt skapa en flertrådig kopia på en klient genom att köra fler än ett kopieringskommando samtidigt i bakgrunden mot fördefinierade uppsättningar av filer eller sökvägar.
Kommandot Linux/UNIX cp innehåller argumentet för att bevara -p ägarskap och mtime-metadata. Det är valfritt att lägga till det här argumentet i kommandona nedan. (Om argumentet läggs till ökar antalet filsystems-anrop som skickas från klienten till målfilsystemet för ändring av metadata.)
I det här enkla exemplet kopieras två filer parallellt:
cp /mnt/source/file1 /mnt/destination1/ & cp /mnt/source/file2 /mnt/destination1/ &
När du har utfärdat det här jobs kommandot visar kommandot att två trådar körs.
Förutsägbar struktur för filnamn
Om filnamnen är förutsägbara kan du använda uttryck för att skapa parallella kopieringstrådar.
Om katalogen till exempel innehåller 1 000 filer som är numrerade sekventiellt från till kan du använda följande uttryck för att skapa tio parallella trådar som var och en kopierar 0001 1000 100 filer:
cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination1/ & \
cp /mnt/source/file2* /mnt/destination1/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination1/ & \
cp /mnt/source/file5* /mnt/destination1/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination1/ & \
cp /mnt/source/file8* /mnt/destination1/ & \
cp /mnt/source/file9* /mnt/destination1/
Okänd filnamnsstruktur
Om din namngivningsstruktur inte är förutsägbar kan du gruppera filer efter katalognamn.
Det här exemplet samlar in hela kataloger för att skicka till cp kommandon som körs som bakgrundsaktiviteter:
/root
|-/dir1
| |-/dir1a
| |-/dir1b
| |-/dir1c
|-/dir1c1
|-/dir1d
När filerna har samlats in kan du köra parallella kopieringskommandon för att rekursivt kopiera underkatalogerna och allt deras innehåll:
cp /mnt/source/* /mnt/destination/
mkdir -p /mnt/destination/dir1 && cp /mnt/source/dir1/* mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ & # this command copies dir1c1 via recursion
cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &
När monteringspunkter ska läggas till
När du har tillräckligt med parallella trådar som går mot en enda målfilsystemmonteringspunkt finns det en punkt där fler trådar inte ger mer dataflöde. (Dataflödet mäts i filer/sekund eller byte/sekund, beroende på din typ av data.) Eller ännu värre, övertrådning kan ibland orsaka en dataflödesförsämring.
När detta inträffar kan du lägga till monteringspunkter på klientsidan till andra vFXT-kluster-IP-adresser med samma sökväg för fjärrfilsystemmontering:
10.1.0.100:/nfs on /mnt/sourcetype nfs (rw,vers=3,proto=tcp,addr=10.1.0.100)
10.1.1.101:/nfs on /mnt/destination1type nfs (rw,vers=3,proto=tcp,addr=10.1.1.101)
10.1.1.102:/nfs on /mnt/destination2type nfs (rw,vers=3,proto=tcp,addr=10.1.1.102)
10.1.1.103:/nfs on /mnt/destination3type nfs (rw,vers=3,proto=tcp,addr=10.1.1.103)
Genom att lägga till monteringspunkter på klientsidan kan du förfördela ytterligare kopieringskommandon till de ytterligare /mnt/destination[1-3] monteringspunkterna, vilket ger ytterligare parallellitet.
Om filerna till exempel är mycket stora kan du definiera att kopieringskommandona ska använda distinkta målsökvägar, och skicka ut fler kommandon parallellt från klienten som utför kopieringen.
cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination2/ & \
cp /mnt/source/file2* /mnt/destination3/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination2/ & \
cp /mnt/source/file5* /mnt/destination3/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination2/ & \
cp /mnt/source/file8* /mnt/destination3/ & \
I exemplet ovan är alla tre målmonteringspunkter mål för klientfilkopieringsprocesserna.
När du ska lägga till klienter
När du har nått klientens funktioner ger tillägg av fler kopieringstrådar eller ytterligare monteringspunkter inga ytterligare fil-/sek- eller byte/sek-ökningar. I så fall kan du distribuera en annan klient med samma uppsättning monteringspunkter som kör sina egna uppsättningar med filkopieringsprocesser.
Exempel:
Client1: cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
Client1: cp -R /mnt/source/dir2/dir2a /mnt/destination/dir2/ &
Client1: cp -R /mnt/source/dir3/dir3a /mnt/destination/dir3/ &
Client2: cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
Client2: cp -R /mnt/source/dir2/dir2b /mnt/destination/dir2/ &
Client2: cp -R /mnt/source/dir3/dir3b /mnt/destination/dir3/ &
Client3: cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ &
Client3: cp -R /mnt/source/dir2/dir2c /mnt/destination/dir2/ &
Client3: cp -R /mnt/source/dir3/dir3c /mnt/destination/dir3/ &
Client4: cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &
Client4: cp -R /mnt/source/dir2/dir2d /mnt/destination/dir2/ &
Client4: cp -R /mnt/source/dir3/dir3d /mnt/destination/dir3/ &
Skapa filmanifest
När du förstår metoderna ovan (flera kopieringstrådar per mål, flera mål per klient, flera klienter per nätverkstillgängligt källfilsystem) bör du överväga den här rekommendationen: Skapa filmanifest och använd dem sedan med kopieringskommandon över flera klienter.
Det här scenariot använder UNIX find för att skapa manifest med filer eller kataloger:
user@build:/mnt/source > find . -mindepth 4 -maxdepth 4 -type d
./atj5b55c53be6-01/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-01/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-01/support/trace/rolling
./atj5b55c53be6-03/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-03/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-03/support/trace/rolling
./atj5b55c53be6-02/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-02/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-02/support/trace/rolling
Omdirigera resultatet till en fil: find . -mindepth 4 -maxdepth 4 -type d > /tmp/foo
Sedan kan du iterera genom manifestet med hjälp av BASH-kommandon för att räkna filer och fastställa storleken på underkatalogerna:
ben@xlcycl1:/sps/internal/atj5b5ab44b7f > for i in $(cat /tmp/foo); do echo " `find ${i} |wc -l` `du -sh ${i}`"; done
244 3.5M ./atj5b5ab44b7f-02/support/gsi/2018-07-18T00:07:03EDT
9 172K ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-18T05:01:00UTC
124 5.8M ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-19T01:01:01UTC
152 15M ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T01:01:00UTC
131 13M ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789 6.2M ./atj5b5ab44b7f-02/support/gsi/2018-07-20T21:59:41UTC
134 12M ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T22:22:55UTC_vfxt_catchup
7 16K ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:12:19UTC
8 83K ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:17:17UTC
575 7.7M ./atj5b5ab44b7f-02/support/cores/armada_main.2000.1531980253.gsi
33 4.4G ./atj5b5ab44b7f-02/support/trace/rolling
281 6.6M ./atj5b5ab44b7f-01/support/gsi/2018-07-18T00:07:03EDT
15 182K ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-18T05:01:00UTC
244 17M ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-19T01:01:01UTC
299 31M ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T01:01:00UTC
256 29M ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T21:59:41UTC_partial
889 7.7M ./atj5b5ab44b7f-01/support/gsi/2018-07-20T21:59:41UTC
262 29M ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T22:22:55UTC_vfxt_catchup
11 248K ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:12:19UTC
11 88K ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:17:17UTC
645 11M ./atj5b5ab44b7f-01/support/cores/armada_main.2019.1531980253.gsi
33 4.0G ./atj5b5ab44b7f-01/support/trace/rolling
244 2.1M ./atj5b5ab44b7f-03/support/gsi/2018-07-18T00:07:03EDT
9 158K ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-18T05:01:00UTC
124 5.3M ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-19T01:01:01UTC
152 15M ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T01:01:00UTC
131 12M ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789 8.4M ./atj5b5ab44b7f-03/support/gsi/2018-07-20T21:59:41UTC
134 14M ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T22:25:58UTC_vfxt_catchup
7 159K ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:12:19UTC
7 157K ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:17:17UTC
576 12M ./atj5b5ab44b7f-03/support/cores/armada_main.2013.1531980253.gsi
33 2.8G ./atj5b5ab44b7f-03/support/trace/rolling
Slutligen måste du skapa de faktiska filkopieringskommandona till klienterna.
Om du har fyra klienter använder du det här kommandot:
for i in 1 2 3 4 ; do sed -n ${i}~4p /tmp/foo > /tmp/client${i}; done
Om du har fem klienter använder du något som liknar detta:
for i in 1 2 3 4 5; do sed -n ${i}~5p /tmp/foo > /tmp/client${i}; done
Och för sex... Extrapolera efter behov.
for i in 1 2 3 4 5 6; do sed -n ${i}~6p /tmp/foo > /tmp/client${i}; done
Du får N resulterande filer, en för var och en av dina N klienter som har sökvägsnamnen till nivå fyra kataloger som hämtas som en del av utdata från find kommandot.
Använd varje fil för att skapa kopieringskommandot:
for i in 1 2 3 4 5 6; do for j in $(cat /tmp/client${i}); do echo "cp -p -R /mnt/source/${j} /mnt/destination/${j}" >> /tmp/client${i}_copy_commands ; done; done
Ovanstående ger dig N filer, var och en med ett kopieringskommando per rad, som kan köras som ett BASH-skript på klienten.
Målet är att köra flera trådar av dessa skript samtidigt per klient parallellt på flera klienter.
Använda en rsync-process med två faser
Standardverktyget fungerar inte bra för att fylla i molnlagring via Avere vFXT for Azure systemet eftersom det genererar ett stort antal åtgärder för att skapa och byta namn på filer för att garantera rsync dataintegriteten. Du kan dock på ett säkert sätt använda alternativet med för att hoppa över den mer noggranna kopieringsproceduren om du följer den med en andra --inplace rsync körning som kontrollerar filintegriteten.
En rsync standardkopieringsåtgärd skapar en temporär fil och fyller den med data. Om dataöverföringen slutförs ändras namnet på den tillfälliga filen till det ursprungliga filnamnet. Den här metoden garanterar konsekvens även om filerna används under kopieringen. Men den här metoden genererar fler skrivåtgärder, vilket gör filförflyttningen långsammare genom cacheminnet.
Alternativet skriver --inplace den nya filen direkt på den slutliga platsen. Filerna är inte garanterat konsekventa under överföringen, men det är inte viktigt om du använder ett lagringssystem för senare användning.
Den andra rsync åtgärden fungerar som en konsekvenskontroll för den första åtgärden. Eftersom filerna redan har kopierats är den andra fasen en snabbsökning för att säkerställa att filerna på målet matchar filerna på källan. Om några filer inte matchar kopieras de igen.
Du kan utfärda båda faserna tillsammans i ett kommando:
rsync -azh --inplace <source> <destination> && rsync -azh <source> <destination>
Den här metoden är en enkel och tidseffektiv metod för datauppsättningar upp till det antal filer som den interna kataloghanteraren kan hantera. (Det här är vanligtvis 200 miljoner filer för ett kluster med 3 noder, 500 miljoner filer för ett kluster med sex noder och så vidare.)
Använda msrsync-verktyget
Verktyget msrsync kan också användas för att flytta data till en serverkärna för Avere-klustret. Det här verktyget är utformat för att optimera bandbreddsanvändningen genom att köra flera parallella rsync processer. Den är tillgänglig från GitHub på https://github.com/jbd/msrsync .
msrsync delar upp källkatalogen i separata "buckets" och kör sedan enskilda rsync processer på varje bucket.
Preliminär testning med en virtuell dator med fyra kärnor visade bästa möjliga effektivitet vid användning av 64 processer. Använd alternativet msrsync för att ange antalet processer till -p 64.
Du kan också använda --inplace argumentet med msrsync kommandon. Om du använder det här alternativet kan du köra ett andra kommando (som med rsync, som beskrivs ovan) för att säkerställa dataintegriteten.
msrsync kan bara skriva till och från lokala volymer. Källan och målet måste vara tillgängliga som lokala monteringar i klustrets virtuella nätverk.
Följ dessa msrsync instruktioner om du vill använda för att fylla en Azure-molnvolym med ett Avere-kluster:
Installera
msrsyncoch dess krav (rsync och Python 2.6 eller senare)Fastställ det totala antalet filer och kataloger som ska kopieras.
Du kan till exempel använda Avere-verktyget
prime.pymed argumentprime.py --directory /path/to/some/directory(tillgängligt genom att ladda ned https://github.com/Azure/Avere/blob/master/src/clientapps/dataingestor/prime.py URL:en ).Om du inte
prime.pyanvänder kan du beräkna antalet objekt med GNU-verktyget på följandefindsätt:find <path> -type f |wc -l # (counts files) find <path> -type d |wc -l # (counts directories) find <path> |wc -l # (counts both)Dividera antalet objekt med 64 för att fastställa antalet objekt per process. Använd det här talet
-fmed alternativet för att ange storleken på bucketarna när du kör kommandot.Utfärda kommandot
msrsyncför att kopiera filer:msrsync -P --stats -p 64 -f <ITEMS_DIV_64> --rsync "-ahv" <SOURCE_PATH> <DESTINATION_PATH>Om du
--inplaceanvänder lägger du till en andra körning utan alternativet för att kontrollera att data kopieras korrekt:msrsync -P --stats -p 64 -f <ITEMS_DIV_64> --rsync "-ahv --inplace" <SOURCE_PATH> <DESTINATION_PATH> && msrsync -P --stats -p 64 -f <ITEMS_DIV_64> --rsync "-ahv" <SOURCE_PATH> <DESTINATION_PATH>Det här kommandot är till exempel utformat för att flytta 11 000 filer i 64 processer från /test/source-repository till /mnt/vfxt/repository:
msrsync -P --stats -p 64 -f 170 --rsync "-ahv --inplace" /test/source-repository/ /mnt/vfxt/repository && msrsync -P --stats -p 64 -f 170 --rsync "-ahv --inplace" /test/source-repository/ /mnt/vfxt/repository
Använda parallellkopieringsskriptet
Skriptet parallelcp kan också vara användbart för att flytta data till ditt vFXT-klusters backend-lagring.
Skriptet nedan lägger till den körbara filen parallelcp . (Det här skriptet är utformat för Ubuntu. Om du använder en annan distribution måste du parallel installera separat.)
sudo touch /usr/bin/parallelcp && sudo chmod 755 /usr/bin/parallelcp && sudo sh -c "/bin/cat >/usr/bin/parallelcp" <<EOM
#!/bin/bash
display_usage() {
echo -e "\nUsage: \$0 SOURCE_DIR DEST_DIR\n"
}
if [ \$# -le 1 ] ; then
display_usage
exit 1
fi
if [[ ( \$# == "--help") || \$# == "-h" ]] ; then
display_usage
exit 0
fi
SOURCE_DIR="\$1"
DEST_DIR="\$2"
if [ ! -d "\$SOURCE_DIR" ] ; then
echo "Source directory \$SOURCE_DIR does not exist, or is not a directory"
display_usage
exit 2
fi
if [ ! -d "\$DEST_DIR" ] && ! mkdir -p \$DEST_DIR ; then
echo "Destination directory \$DEST_DIR does not exist, or is not a directory"
display_usage
exit 2
fi
if [ ! -w "\$DEST_DIR" ] ; then
echo "Destination directory \$DEST_DIR is not writeable, or is not a directory"
display_usage
exit 3
fi
if ! which parallel > /dev/null ; then
sudo apt-get update && sudo apt install -y parallel
fi
DIRJOBS=225
JOBS=225
find \$SOURCE_DIR -mindepth 1 -type d -print0 | sed -z "s/\$SOURCE_DIR\///" | parallel --will-cite -j\$DIRJOBS -0 "mkdir -p \$DEST_DIR/{}"
find \$SOURCE_DIR -mindepth 1 ! -type d -print0 | sed -z "s/\$SOURCE_DIR\///" | parallel --will-cite -j\$JOBS -0 "cp -P \$SOURCE_DIR/{} \$DEST_DIR/{}"
EOM
Exempel på parallellkopiering
I det här exemplet används det parallella kopieringsskriptet för glibc att kompilera med hjälp av källfiler från Avere-klustret.
Källfilerna lagras på Avere-klustermonteringspunkten och objektfilerna lagras på den lokala hårddisken.
Det här skriptet använder parallella kopieringsskript ovan. Alternativet används -j med och för att få parallelcp make parallellisering.
sudo apt-get update
sudo apt install -y gcc bison gcc binutils make parallel
cd
wget https://mirrors.kernel.org/gnu/libc/glibc-2.27.tar.bz2
tar jxf glibc-2.27.tar.bz2
ln -s /nfs/node1 avere
time parallelcp glibc-2.27 avere/glibc-2.27
cd
mkdir obj
mkdir usr
cd obj
/home/azureuser/avere/glibc-2.27/configure --prefix=/home/azureuser/usr
time make -j