rsync续传大目录一例

场景

要将大约60T的文件从一台服务器上搬到另外一台上。两边分区还不一样大,一边是一个整的60T大分区,另一边是15T一个的小分区。

 

解决思路

类比茶壶倒水,一个分区一个分区的填,填满一个再填第二个。

步骤

先将要同步的目录名全路径按时间排序写到一个文件里。每次从文件里取一行来做同步,成功则写入日志1中,失败则写入日志2中并记下时间戳。

每次同步前先检查日志1,如果存在则跳过。

 

代码实现

#!/bin/bash

prefix=/root/rsync/xvdf1/sync_1_300
mkdir -p $prefix

input_file=$prefix/fdlist.txt

success_log=$prefix/sync_status1.log
failure_log=$prefix/sync_status2.log
process_log=$prefix/sync_status3.log
details_log=$prefix/sync_status4.log

du_log=$prefix/tmp_du.log

touch $success_log $failure_log $process_log $du_log $details_log

DEST=/xyz/xvdf1/192.168.10.112/ifs/home/xyftp/xyftpdir06/

count=1
toltal=`wc -l $input_file|awk '{print $1}'`
while read src_fd
do

    while read line_st
    do
        if [[ $line_st == $src_fd ]]
        then
            rate=`echo "scale=4;($count/$toltal)*100"|bc`
            echo -e "[$count/$toltal]\t$rate\t$src_fd\tSkip"
            count=`echo $count+1|bc`
            continue 2
        fi
    done <$success_log

    rate=`echo "scale=4;($count/$toltal)*100"|bc`
    echo -e "[$count/$toltal]\t$rate%\t$src_fd" >$process_log
    du_str=`du -sh $src_fd`

    echo -e "$count\t$du_str ... ..."
    rsync -avz --delete $src_fd root@192.168.240.69:$DEST > $details_log

    ret=$?

    if [[ $ret -eq 0 ]]
    then
        echo -e "[$count/$toltal]\t$rate\t$src_fd\tSuccess"
        echo -e "$count\t$du_str">>$du_log
        echo "$src_fd">>$success_log
        count=`echo $count+1|bc`
    else
        time_stap=`date "+%Y-%M-%d %H:%m:%S"`
        echo -e "[$count/$toltal]\t$rate\t$src_fd\tFailure"
        echo -e "[$count/$toltal]\t$rate\t$src_fd\tFailure\t$time_stap" >>$failure_log
        du_str=""
        count=`echo $count+1|bc`
        break
    fi
done <$input_file

echo "Summary:"
echo "====================================="
echo "Success list:"
echo "-------------------------------------"
cat $success_log
echo "Failure list:"
echo "-------------------------------------"
cat $failure_log
echo "Last one:"
echo "-------------------------------------"
cat $process_log  

备注

  • 因为目录太大,可以拆片执行。比如 cat ../folder_list.txt | sed -n '1,300p' > fdlist.txt 每300行作为一个输入文件,这样可以并行执行。
  • rsync走ssh-ftp传输时要输入密码的,可以提前做ssh-public-key配好就不会被阻断了。
  • 因bash兼容性问题,调试前将rsync改为 -dry-run 模式,可能不同的linux发行版执行时会出错。

 

posted on 2017-05-02 12:57  Digital_life  阅读(386)  评论(0编辑  收藏  举报

导航