Estou executando meu script de shell em machineA
, que copia os arquivos de machineB
e machineC
para machineA
.
Se o arquivo não estiver em machineB
, ele deverá estar em machineC
, com certeza. Então vou tentar copiar de machineB
primeiro, se não estiver lá em machineB
então eu irei para machineC
para copiar os mesmos arquivos.
Em machineB
e machineC
, haverá uma pasta como esta YYYYMMDD
dentro desta pasta -
/data/pe_t1_snapshot
Então, qualquer data é a data mais recente neste formato YYYYMMDD
dentro da pasta acima - eu escolherei essa pasta como o caminho completo de onde eu preciso para começar a copiar os arquivos -
suponha que se esta for a pasta de data mais recente 20140317
inside /data/pe_t1_snapshot
, então este será o caminho completo para mim -
/data/pe_t1_snapshot/20140317
de onde preciso começar a copiar os arquivos em machineB
e machineC
. Eu preciso copiar em torno de 400
arquivos em machineA
de machineB
e machineC
e cada tamanho de arquivo é 1.5 GB
.
Atualmente eu tenho meu shell script abaixo, que funciona bem, pois estou usando scp
over rsync
, mas de alguma forma é necessário 5 hours
copiar os arquivos 400
em machineA, que é muito longo para mim, eu acho. : (
Abaixo está o meu script de shell -
#!/bin/bash
readonly PRIMARY=/export/home/david/dist/primary
readonly SECONDARY=/export/home/david/dist/secondary
readonly FILERS_LOCATION=(machineB machineC)
readonly MEMORY_MAPPED_LOCATION=/data/pe_t1_snapshot
PRIMARY_PARTITION=(0 3 5 7 9)
SECONDARY_PARTITION=(1 2 4 6 8)
dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
echo $dir1
echo $dir2
if [ "$dir1" = "$dir2" ]
then
# delete all the files first
rm -rf $PRIMARY/*
# below for-loop copies one file at a time in PRIMARY folder
for el in "${PRIMARY_PARTITION[@]}"
do
scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
done
# delete all the files first
rm -rf $SECONDARY/*
# below for-loop copies one file at a time in SECONDARY folder
for sl in "${SECONDARY_PARTITION[@]}"
do
scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.
done
fi
Estou copiando PRIMARY_PARTITION
arquivos na pasta PRIMARY
e SECONDARY_PARTITION
arquivos na pasta SECONDARY
em machineA
.
Agora, minha pergunta é: como eu usaria rsync
aqui em vez de scp(ing)
dos arquivos? Como eu li, rsync
é muito mais rápido que scp(ing)
dos arquivos. Eu gostaria de ter a mesma lógica que eu tenho no meu script de shell em rsync
. Eu nunca trabalhei com rsync
antes de ter algum problema.
Alguém pode fornecer um exemplo?
Dado o meu caso de uso, o rsync
será mais rápido se comparado ao scp? E se não, quais outras opções eu posso tentar acelerar a transferência de arquivos?
ATUALIZAÇÃO: -
Para esclarecer a questão do terdon -
Na questão eu estou mostrando apenas 10 arquivos apenas por exemplo -
PRIMARY_PARTITION=(0 3 5 7 9)
SECONDARY_PARTITION=(1 2 4 6 8)
Em geral, em PRIMARY_PARTITION
array, terei cerca de 150 números de arquivos e, em SECONDARY_PARTITION
, terei outros 200 números de arquivos.
Agora, o que preciso fazer é o número de arquivo que possuo em PRIMARY_PARTITION
, preciso descobrir esses arquivos no diretório machineB
, se os arquivos já estiverem lá e copiá-los para PRIMARY
pasta em machineA
, mas se o arquivo não estiver em machineB
, ele deve estar em machineC
, então copie os arquivos de machineC
e coloque-os na pasta PRIMARY
em machineA
. / p>
Da mesma forma, eu preciso fazer a mesma coisa para SECONDARY_PARTITION
, eu irei descobrir esses arquivos no diretório machineB
, se estiver lá, copie-o no diretório machineA
secundário, mas se ele não estiver em machineB
, então deve estar lá em machineC
, então copie-o de machineC
e coloque-o no diretório machineA
secundário.
Portanto, todos os números de arquivo que temos estão em - PRIMARY_PARTITION
e SECONDARY_PARTITION
.
Em geral, terei PRIMARY_PARTITION
e SECONDARY_PARTITION
como este -
PRIMARY_PARTITION=(0 548 272 4 544 276 8 556 280 12 552 284 16 256 564 20 260 560 24 264 572 28 268 568 516 304 32 512 308 36 524 312 40 520 316 44 288 532 48 292 528 52 296 540 56 300 536 60 68 608 340 64 336 76 348 72 344 84 324 80 320 92 332 88 328 576 372 100 580 368 96 584 380 108 588 376 104 356 592 116 352 596 112 364 600 124 360 604 120 136 408 140 412 128 400 132 404 152 392 156 396 144 384 148 388 440 168 444 172 432 160 436 164 424 184 428 188 416 176 420 180 204 476 200 472 196 468 192 464 220 460 216 456 212 452 208 448 508 236 504 232 500 228 496 224 492 252 488 248 484 244 480 240)
SECONDARY_PARTITION=(1101 1374 1641 1371 1647 1098 1635 1365 1095 1638 1089 1362 1659 1359 1119 1113 1662 1353 1350 1650 1110 1347 1653 1107 1134 1407 1611 1401 1131 1614 1602 1125 1398 1122 1605 1395 1389 1149 1626 1629 1146 1386 1617 1143 1383 1377 1623 1137 1305 1581 1578 1311 1299 1575 1302 1569 1599 1290 1593 1293 1590 1281 1587 1287 1551 1338 1341 1545 1071 1329 1542 1335 1539 1083 1566 1323 1086 1563 1326 1557 1074 1314 1317 1077 1554 1221 1494 1491 1218 1503 1230 1227 1497 1479 1239 1233 1473 1245 1485 1482 1242 1254 1527 1251 1521 1263 1533 1530 1257 1509 1269 1266 1506 1278 1518 1275 1515 1155 1425 1431 1158 1434 1161 1167 1437 1410 1170 1173 1413 1419 1179 1422 1182 1671 1458 1185 1665 1191 1461 1677 1194 1467 1470 1197 1674 1203 1443 1206 1446 1449 1209 1215 1455)
Outra atualização: -
Depois de remover 2>/dev/null
, executei o script novamente, mas recebi o erro abaixo -
ssh: Could not resolve hostname machineB : Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(605) [Receiver=3.0.9]
ssh: Could not resolve hostname machineC : Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(605) [Receiver=3.0.9]
ssh: Could not resolve hostname machineB : Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(605) [Receiver=3.0.9]
ssh: Could not resolve hostname machineC : Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(605) [Receiver=3.0.9]
Alguma idéia do que está acontecendo? Eu substituí machineB
e machineC
por nomes reais antes de executar o shell script e meu sistema é -
root@machineA:/home/david# uname -a
Linux machineA 3.2.0-24-generic #37-Ubuntu SMP Wed Apr 25 08:43:22 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
Abaixo está o meu script de shell que estou executando -
#!/usr/bin/env bash
readonly PRIMARY=/export/home/david/dist/primary
readonly SECONDARY=/export/home/david/dist/secondary
readonly FILERS_LOCATION=(machineB machineC)
readonly MEMORY_MAPPED_LOCATION=/data/pe_t1_snapshot
PRIMARY_PARTITION=(0 3 5 7 9)
SECONDARY_PARTITION=(1 2 4 6 8)
dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
echo $dir1
echo $dir2
## Build your list of filenames before the loop.
for n in "${PRIMARY_PARTITION[@]}"
do
primary_files="$primary_files :$dir1"/t1_weekly_1680_"$n"_200003_5.data
done
## Repeat for $SECONDARY_PARTITION
for n in "${SECONDARY_PARTITION[@]}"
do
secondary_files="$secondary_files :$dir2"/t1_weekly_1680_"$n"_200003_5.data
done
echo $primary_files
echo $secondary_files
if [ "$dir1" = "$dir2" ]
then
find "$PRIMARY" -mindepth 1 -delete
find "$SECONDARY" -mindepth 1 -delete
rsync -avz david@${FILERS_LOCATION[0]}"${primary_files}" $PRIMARY/
rsync -avz david@${FILERS_LOCATION[1]}"${primary_files}" $PRIMARY/
## Do the same for $secondary_partition files
rsync -avz david@${FILERS_LOCATION[0]}"${secondary_files}" $SECONDARY/
rsync -avz david@${FILERS_LOCATION[1]}"${secondary_files}" $SECONDARY/
fi
Estou suspeitando que a sintaxe rsync
não esteja correta. Porque se eu executo um único comando como este, então funcionou bem -
rsync -avz david@machineB":/data/pe_t1_snapshot/20140317/t1_weekly_1680_0_200003_5.data" /export/home/david/dist/primary
Outra pequena atualização: -
Se eu estou correndo assim -
root@machineA:/export/home/david# rsync -avz david@machineB':/data/pe_t1_snapshot/20140317/t1_weekly_1680_0_200003_5.data :/data/pe_t1_snapshot/20140317/t1_weekly_1680_1_200003_5.data' /data01/primary
receiving incremental file list
rsync: change_dir "/home/david/:/data/pe_t1_snapshot/20140317" failed: No such file or directory (2)
t1_weekly_1680_0_200003_5.data
sent 30 bytes received 504982813 bytes 6196108.50 bytes/sec
total size is 1761988281 speedup is 3.49
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1536) [generator=3.0.9]
O comando acima deve copiar os arquivos para o diretório /data01/primary
, mas copia apenas um arquivo e não copia o segundo arquivo.
Mas isso funciona bem e o arquivo é copiado -
root@machineA:/export/home/david# rsync -avz david@machineB':/data/pe_t1_snapshot/20140317/t1_weekly_1680_0_200003_5.data' /data01/primary
receiving incremental file list
t1_weekly_1680_0_200003_5.data
sent 30 bytes received 504982698 bytes 6351984.00 bytes/sec
total size is 1761988281 speedup is 3.49