簡體   English   中英

如何在我的下面的shell腳本中使用rsync而不是scp來復制文件?

[英]How to use rsync instead of scp in my below shell script to copy the files?

我正在使用scp並行使用GNU並行復制文件與我的下面的shell腳本,它工作正常。

我不知道如何在下面的shell腳本中使用rsync代替scp 我試圖看看rsync與傳輸速度方面的scp相比是否會有更好的性能。

以下是我的問題描述 -

我從復制文件machineBmachineCmachineA ,因為我對我的運行下面的shell腳本machineA

如果文件不在machineB那么它應該在machineC ,因為我會首先嘗試從machineB復制文件,如果它不在machineB那么我將嘗試從machineC復制相同的文件。

我使用GNU Parallel庫並行復制文件,它工作正常。 目前我正在為PRIMARY和SECONDARY並行復制五個文件。

下面是我的shell腳本 - 我有 -

#!/bin/bash

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary
readonly FILERS_LOCATION=(machineB machineC)
export FILERS_LOCATION_1=${FILERS_LOCATION[0]}
export FILERS_LOCATION_2=${FILERS_LOCATION[1]}
PRIMARY_PARTITION=(550 274 2 546 278) # this will have more file numbers
SECONDARY_PARTITION=(1643 1103 1372 1096 1369 1568) # this will have more file numbers

export dir3=/testing/snapshot/20140103

do_Copy() {
  el=$1
  PRIMSEC=$2
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/.
}
export -f do_Copy

parallel --retries 10 -j 5 do_Copy {} $PRIMARY ::: "${PRIMARY_PARTITION[@]}" &
parallel --retries 10 -j 5 do_Copy {} $SECONDARY ::: "${SECONDARY_PARTITION[@]}" &
wait

echo "All files copied."

有沒有辦法用rsync替換我的上面的scp命令,但是我還想同時為PRIMARYSECONDARY並行復制5個文件?

rsync旨在有效地同步文件夾和文件的兩個層次結構

雖然它可以用來傳輸單個文件,但是除非你已經在每一端都有一個版本的文件,它們之間的差別很小,否則它對你的使用非常有幫助。 在層次結構中的各個文件上並行運行多個rsync實例會破壞該工具的用途。

雖然三元組是正確的,你的任務是I / O綁定而不是CPU綁定,因此在典型的情況下並行化任務無助於你使用rsync還是scp ,有一種情況是並行化網絡傳輸可以提供幫助:如果發件人限制請求。 這種情況下,為許多不同的文件夾中的每一個運行rsync實例可能有一些價值,但它會使您的代碼復雜化,並且您必須分析這兩個解決方案以發現您是否真正獲得了任何好處。

簡而言之:只運行一個rsync實例; 你從另一種方法中獲得的性能提升不太可能是值得的。

你還沒有給我們足夠的信息來知道你是否在合理的道路上,但我懷疑你應該看看lsyncd甚至可能是GlusterFS 這些與你正在做的不同,因為它們是連續同步工具而不是定期運行,但我懷疑你可以定期運行lsyncd,如果這是你真正想要的。 我還沒有嘗試過lsyncd 2.x,但我看到他們已經添加了並行同步過程。 如果您的實際場景涉及的不僅僅是您描述的三台機器,那么查看一些對等文件共享協議甚至是有意義的。

在您當前的方法中,除非您的文件非常大,否則大部分延遲可能與設置連接和驗證它們的開銷有關。 對每個文件單獨執行此操作非常昂貴,尤其是基於ssh的協議。 您最好將文件列表分成批次,並將這些批次傳遞給復制機制。 您是否使用rsync可能不太重要,但如果您首先構建一個rsync進程要處理的文件列表,則可以使用--files-from選項將其傳遞給rsync。

您想了解同步速度的限制因素。 據推測它是網絡帶寬,網絡延遲,文件IO或CPU(校驗和或壓縮,但可能只有你有低端硬件)之一。

了解從一個同步運行到另一個同步運行的文件更改模式可能也很重要。 以前的運行中有許多未更改的文件嗎? 現有文件是否會更改? 這些更改是否會保留大量的塊(例如數據庫文件),或者只會附加(例如日志文件)? 您是否可以安全地依賴文件修改時間和大小等元數據來識別更改內容,或者是否需要校驗整個內容?

您的文件內容是否可壓縮? 例如,如果您要復制純文本,您可能希望在scp或rsync中使用壓縮選項,但如果您已經壓縮了圖像或視頻文件,那么再次壓縮只會減慢速度。 如果您的文件中只有部分文件發生更改,則rsync最有用。

您可以像使用scp一樣使用rsync下載單個文件。 請確保不要使用調用守護程序的rsync://hostname::path格式。

它至少可以使兩個遠程主機同時工作。 此外,如果文件位於不同的物理磁盤上或恰好位於緩存中,即使在單個主機上並行化它們也會有所幫助。 這就是為什么我不同意另一個說單個實例必然要走的路。

我想你可以替換

scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/.

通過

rsync david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/new_weekly_2014_"$el"_200003_5.data || rsync david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/new_weekly_2014_"$el"_200003_5.data

(注意,更改不僅僅是命令)

也許你可以獲得額外的速度,因為rsync將使用delta = transfer算法與scp進行盲目復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM