在对大量小文件在两台机器之间同步的时候,碰到的一些问题,并且一直没找到最理想的办法。
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
不知道各位老大都是如何解决这个问题的?谁有更好的办法,告知一下啊!
完备:
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
我测试了一下老兄给的脚本,虽然可以做增量同步,但是用起来处理不了这样一个情况吧,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
增量备份的时候一般不考虑删除问题,如果你需要备份端与原端保持一致,可以采取生成删除文件列表并在备份端删除的方式。
具体的做法如下
1.在完全备份时后产生完全文件列表(full.list)
2.每次增量备份前生成增量点完全文件列表(A.list)
3.比较完全文件列表和增量点完全文件列表
4.得到删除的问题列表(D.list)
5.mv A.list full.list 以备下次增量备份生成D.list使用
6.将D.list复制到备份端,将D.list中的文件删除
另外建议使用ssh方式的rsync!
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
恩,用find+tar的方式已经完全明白了。
另外,用ssh方式的rsync有什么好处吗??我是内网,对数据的安全性要求不高。
再说一句,非常感谢指导!!!:)
如果是内网就不用ssh方式了,主要是安全性考虑!
加我gmail做Gtalk,多多交流!
已经添加,多多交流!!:)
b)在对长目录名进行同步的时候,会报IO错误并退出
这个我在LINUX上面测试到了最长的目录名了,都没有报错,是否是RSYNC的BUG?
邮件不多20多G,我用ssh方式的rsync 效果还行,加上飞信通知,把时间设置在7:30,每天定时发短信,还能当闹钟,呵呵!