如何使用rsync遷移大文件?
場景:將本地Mac端數據傳輸至Linux服務端
本人將12G本地單文件(12G大小h5文件數據集)向Linux服務器進行大文件上傳時傳輸失敗。最初使用 scp 命令或 rsync 直接對大文件進行傳輸,會出現網絡斷開或服務器端管道破裂情況,而且一次性無法傳輸的話也會耗費很多時間。
步驟
為了解決此問題,可分為以下步驟進行操作:
# 打包壓縮大文件
zip -r archive.zip ./bigfile
# 可選:將壓縮包拆分成1G文件
# -b后輸入子節 若要拆分為1G文件塊 1G=1073741820 byte
split -b 1073741820 archive.zip archive_split
# 此時文件會分為很多帶有字母后綴的archive_split{a, b..}之類的文件 對其進行rsync傳輸
# 在服務器端對傳輸來的文件塊進行合并
cat archive_split* > new_archive.zip
rsync傳輸
# 傳輸文件
# -P,----partial 斷點續傳(保留那些因故沒有完全傳輸的文件,以便加快隨后的再次傳輸)
# -e 以ssh方式進行數據傳輸, ssh -p2222 指定連接2222端口
# --progress 顯示傳輸進度
# --bwlimit 限速, 字節/秒
# -r,--recursive 對子目錄以遞歸模式處理
# -c, --checksum 打開校驗開關,強制對文件傳輸進行校驗。
# --delete 刪除那些DST中SRC沒有的文件。
# -z, --compress 對備份的文件在傳輸時進行壓縮處理。
# --exclude=PATTERN 指定排除不需要傳輸的文件模式。
# --include=PATTERN 指定不排除而需要傳輸的文件模式。
# -v, --verbose 詳細模式輸出。
# -q, --quiet 精簡輸出模式。
# -a, --archive 歸檔模式,表示以遞歸方式傳輸文件,并保持所有文件屬性,等于-rlptgoD
# 在本地執行,將本地Mac端數據同步至遠程Linux服務端
rsync -P -e "ssh -p2222" --progress --compress ./archive_split* root@ip:/xxx/xxx/
解釋一下上面執行命令的參數:
-P支持斷點續傳,網絡傳輸中網絡斷開是肯可能發生的--progress顯示進度,方便肉眼觀察--compress對備份文件在傳輸時進行壓縮處理
那么以上場景適用于在本地Mac端將數據分塊傳輸給服務器Linux端,之所以要給本地Mac端數據進行分開,是因為在實際場景中,我的本機上傳帶寬本來很高,但是服務端的下載帶寬較低,反而成了瓶頸。
場景:將Linux服務端數據傳輸至本地Mac端
2022-12-27日更新:除此之外,我也遇到了新的場景,就是將服務器端的數據拷貝到我本地,因此我依舊對上述服務器端部分的數據進行了分塊處理,只不過rsync這里稍有不同:
# 在本地執行以下命令,通過ssh登陸遠程,將遠程Linux服務端數據同步至本地Mac端文件下
rsync -av -e 'ssh -p [port_num]' gc@ip:/filepath/xxx/archive_splitaa ./
rsync -av -e 'ssh -p [port_num]' gc@ip:/filepath/xxx/archive_splitab ./
rsync -av -e 'ssh -p [port_num]' gc@ip:/filepath/xxx/archive_splitac ./
....
注意,上面的指令在服務端路徑指定文件時,如果直接改為使用通配符 * 匹配,那就會報錯,找不到對應文件,命令也不會執行成功,所以需要一個文件一個文件的指定,熟悉Shell腳本的同學也可以編寫腳本去執行,省的每一次傳輸完一個塊兒,又要去手動執行rsync繼續傳輸另一個塊。
由于從服務器端下載數據時,發現我這邊下載帶寬達到了平均8M/s,所以其實帶寬并沒有成為傳輸的瓶頸,傳的還蠻快的,最后發現也不需要分那么多塊去傳輸,split -b可以分的塊大一些。

浙公網安備 33010602011771號