rsync多进程并发执行上传下载数据

1. 前言

工作中经常会遇到数据拷贝或者数据同步事情。一般情况会使用 rsync 来做数据拷贝或者数据同步等。

2.问题

rsync 不能做并发同步,特别是需要拷贝上T数据时,rsync 一个进程拷贝有很大的瓶颈,不能把存储设备IO性能发挥的最好或者说把存储设备IO跑满。

有什么方法让 rsync 实现多进程同步,并且自动识别目录下有多少个文件或者目录,不会出现重复性同步。

3.解决方法

1.原始命令

rsync -aPvu /mysql_backup rsync://1.2.3.4/mysql_backup/

2.多线程模式

#!/bin/sh
#
src='/mysql_backup' #源路径,结尾不带斜线
dst='rsync://1.2.3.4/mysql_backup/' #目标路径,结尾不带斜线
opt="-aPvu"                                                 #同步选项
num=16                                                      #并发进程数
depth='5 4 3 2 1'                                           #归递目录深度
task=/tmp/$(echo $src$ | md5sum | head -c 16)
[ -f $task-next ] && cp $task-next $task-skip
[ -f $task-skip ] || touch $task-skip
# 创建目标目录结构
rsync $opt --include "*/" --exclude "*" $src/ $dst
# 从深到浅同步目录
for l in $depth; do
    # 启动rsync进程
    for i in $(find $dst -maxdepth $l -mindepth $l -type d); do
        i=$(echo $i | sed "s#$dst/##")
        if $(grep -q "$i$" $task-skip); then
            echo "skip $i"
            continue
        fi
        while true; do
            now_num=$(ps axw | grep rsync | grep $dst | grep -v '\-\-daemon' | wc -l)
            if [ $now_num -lt $num ]; then
                echo "rsync $opt $src/$i/ $dst/$i" >>$task-log
                rsync $opt $src/$i/ $dst/$i &
                echo $i >>$task-next
                sleep 1
                break
            else
                sleep 5
            fi
        done
    done
done
# 最终单进程验证
while true; do
    sleep 5
    now_num=$(ps axw | grep rsync | grep $dst | grep -v '\-\-daemon' | wc -l)
    if [ $now_num -lt 1 ]; then
        echo "rsync $opt $src/ $dst" >>$task-log
        rsync $opt $src/ $dst
        break
    fi
done