大量小文件同步时碰到的问题

January 10th, 2009 by chifeng Leave a reply »

在对大量小文件在两台机器之间同步的时候,碰到的一些问题,并且一直没找到最理想的办法。

0,SCP
不敢用,因为存在循环链接的bug,会直到循环着把分区塞满为止,官方也有人报,但是一直没fix,况且还没法进行增量同步。

1,nfs&cp,tar
通过nfs挂过来,然后cp或tar,如果是一次性拷贝时,比较合适,但是如果量大想提前复制一份过来,之后就没法进行增量同步了。

2,rsync
比较常用这个,但是也有问题。
a)rsync在3.0之前的版本都要先接收文件列表,这个过程很慢,如果再出点啥意外,不好意思,请从头再来。不过在3.0之后的版本,改进了这个情况,只接收增量文件列表了。
b)在对长目录名进行同步的时候,会报IO错误并退出,当我启动同步进程之后,去睡觉了,本来以为第二天就完了,结果同步了几个G的数据后,碰到了超长目录名,真是一个郁闷啊!所作的只能是先把这个超长目录删除了,然后再次启动同步!
c)当使用单进程来同步的话,速度很慢,所以必须启动多进程来拷贝,效率成倍提高。看看我的进程数,网卡、IO都快吃满了,很爽!
root@:/var/log/rsync# ps -ef |grep rsync  |wc
66     913    8577

不知道各位老大都是如何解决这个问题的?谁有更好的办法,告知一下啊!

Advertisement

12 comments

  1. kissingwolf says:

    完备:
    tar -cf – /src_dir | ssh remote_user@remout_site tar xf – -C /backupdir
    增量:
    完备前生成time_file,增量后
    find /src_dir -newer time_file -a -type f > file_list
    tar -T file_list -cf – /src_dir | ssh remote_user@remout_site tar xf – -C /backupdir

  2. chifeng says:

    我测试了一下老兄给的脚本,虽然可以做增量同步,但是用起来处理不了这样一个情况吧,src这边的某一个文件被删除了,处理不了,类似rsync的–delete参数。还是我测试的不对?

    我基本上是用这样一个脚本来大量的起rsync进程来同步的,然后再去grep结束的脚本但不是正常退出的,去看原因。
    这样虽然把服务器的负载弄的很高,但是可以大大提高同步的速度。

    #!/bin/sh
    while read LINE
    do
    echo $LINE
    /usr/local/bin/rsync3 -laztvr –progress –timeout=600 –delete rsyncserver::scratch_dev/$LINE /data/export/scratch_dev/ > /var/log/rsync/dev_$LINE.log &
    done < $1

  3. kissingwolf says:

    增量备份的时候一般不考虑删除问题,如果你需要备份端与原端保持一致,可以采取生成删除文件列表并在备份端删除的方式。
    具体的做法如下
    1.在完全备份时后产生完全文件列表(full.list)
    2.每次增量备份前生成增量点完全文件列表(A.list)
    3.比较完全文件列表和增量点完全文件列表

  4. kissingwolf says:

    4.得到删除的问题列表(D.list)
    5.mv A.list full.list 以备下次增量备份生成D.list使用
    6.将D.list复制到备份端,将D.list中的文件删除

  5. kissingwolf says:

    另外建议使用ssh方式的rsync!

  6. kissingwolf says:

    while read file_path
    do
    if grep “\” $FULL_LIST >/dev/null ; then
    continue
    else
    echo “$file_path” >> $D_LIST
    fi
    done < $A_LIST
    大致就是这样产生D.list

  7. chifeng says:

    恩,用find+tar的方式已经完全明白了。

    另外,用ssh方式的rsync有什么好处吗??我是内网,对数据的安全性要求不高。

  8. chifeng says:

    再说一句,非常感谢指导!!!:)

  9. kissingwolf says:

    如果是内网就不用ssh方式了,主要是安全性考虑!
    加我gmail做Gtalk,多多交流!

  10. chifeng says:

    已经添加,多多交流!!:)

  11. yehaozi says:

    b)在对长目录名进行同步的时候,会报IO错误并退出

    这个我在LINUX上面测试到了最长的目录名了,都没有报错,是否是RSYNC的BUG?

  12. y109 says:

    邮件不多20多G,我用ssh方式的rsync 效果还行,加上飞信通知,把时间设置在7:30,每天定时发短信,还能当闹钟,呵呵!

Leave a Reply