之前积攒了一些经验,觉得有必要放出来供他人参考。
一种方法,最简单的,就是 crontab,一条一条添加同步语句,这种方式其实挺好。
[root@15475398 ~]# crontab
1[ root @ 15475398 ~ ] # crontab
然后添加同步语句,这里以 CentOS 为例:
* */6 * * * /usr/bin/rsync -aqzH --delete --delay-updates --delete-after us-msync.centos.org::CentOS /镜像目录
1* * / 6 * * * / usr / bin / rsync - aqzH -- delete -- delay - updates -- delete - after us - msync .centos .org :: CentOS / 镜像目录
这种方式很简单,而且适合没什么大要求的人用。这句话意思是每隔6小时同步一次(官方上限)。
不过,这种方式会造成一个问题。
当某些 rsync 源存在连接质量问题时,也许您设定的同步间隔已经结束,即开始同步过了4个小时依然没同步完,这时候 rsync 可不会管这些,它会新建一个线程。也就是说如果这样一直下去,rsync 进程会越来越多,您用 top 一查看,还以为是 rsync 多线程同步,实际上这种同步不像迅雷那种多线程下载工具,这里的多线程会增加系统 I/O,镜像访问速度会下降,更何况,有些Tier 1 会 ban 掉您的镜像 IP,这样您就无法同步了,可谓是恶性循环。
因此有几种方法。
第一种。
[root@15475398 ~]# crontab
1[ root @ 15475398 ~ ] # crontab
添加同步脚本,这里以 CentOS 为例:
* */6 * * * /usr/bin/sh /home/mirror/centos.sh
1* * / 6 * * * / usr / bin / sh / home / mirror / centos .sh
centos.sh里面这么写:
#!/bin/sh if [ "$(ps auxw|grep us-msync.centos.org::CentOS|grep -v grep)" ];
then exit 1;
fi
rsync -aqzH --delete --delay-updates --delete-after us-msync.centos.org::CentOS /镜像目录
#!/bin/sh
if [ "$(ps auxw|grep us-msync.centos.org::CentOS|grep -v grep)" ] ; then
exit 1 ;
fi
rsync - aqzH -- delete -- delay - updates -- delete - after us - msync .centos .org :: CentOS
/ 镜像目录
第二种:
#!/bin/bash RES=us-msync.centos.org::CentOS DES=/镜像目录 rsync -aqzH --delete --delay-updates ${RES} ${target}
#!/bin/bash
RES = us - msync . centos . org :: CentOS
DES = / 镜像目录
rsync - aqzH -- delete -- delay - updates $ { RES } $ { target }
当然第一种的脚本中 ps 功能没有用完膳,还可以这么玩,第三种:
if [ $(ps aux|grep us-msync.centos.org::CentOS|wc -l ) -el 1 ]; then /usr/bin/rsync -aqzH --delete --delay-updates --delete-after us-msync.centos.org::CentOS /镜像目录 else echo CentOS mirror is synchronizing... fi
if [ $ ( ps aux | grep us - msync .centos .org :: CentOS | wc - l ) - el 1 ] ;
then
/ usr / bin / rsync - aqzH -- delete -- delay - updates -- delete - after us - msync .centos .org :: CentOS / 镜像目录
else
echo CentOS mirror is synchronizing . . .
fi
还有第四种,脚本:
RES="us-msync.centos.org::CentOS" CMD="/usr/bin/rsync -aqzH --delete --delay-updates --delete-after" PID="/var/run/centos-rsync.pid" DES="/镜像目录" if [ ! -d "$DES" ]; then mkdir -p $DES fi if [ -f "$PID" ]; then RUNPID=`cat $PID` if ps -p $RUNPID; then echo "Synchronizing...Please Wait" exit 1 else echo "Dead Process Found, Cleaning up..." rm -f $PID fi else echo "Sychronization Completed" fi echo $$ > $PID echo -n "Sychronization Started at: " date $CMD $RES $DES echo -n "Sychronization Ended at: " date rm -f $PID
RES = "us-msync.centos.org::CentOS"
CMD = "/usr/bin/rsync -aqzH --delete --delay-updates --delete-after"
PID = "/var/run/centos-rsync.pid"
DES = "/镜像目录"
if [ ! - d "$DES" ] ; then
mkdir - p $DES
fi
if [ - f "$PID" ] ; then
RUNPID = ` cat $PID `
if ps - p $RUNPID ; then
echo "Synchronizing...Please Wait"
exit 1
else
echo "Dead Process Found, Cleaning up..."
rm - f $PID
fi
else
echo "Sychronization Completed"
fi
echo $ $ > $PID
echo - n "Sychronization Started at: "
date
$CMD $RES $DES
echo - n "Sychronization Ended at: "
date
rm - f $PID
最开始介绍的 crontab 方法没有保留日志,可以这么着,当然最后那一段可以用于脚本,这样既可避免I/O频繁读写,还可以生成日志:
* */6 * * * /usr/bin/rsync -aqzH --delete --delay-updates --delete-after us-msync.centos.org::CentOS /镜像目录 >> rsync.centos.`date +%w`.log 2>&1
1
* * / 6 * * * / usr / bin / rsync - aqzH -- delete -- delay - updates -- delete - after us - msync .centos .org :: CentOS / 镜像目录 >> rsync .centos . ` date + % w ` .log 2 > & 1
至于用邮件发送日志我就不说了,最简单的 mail 即可搞定,比如命令之后加上:
| cat rsync.log | mail xxx@xxx.xxx
1
| cat rsync .log | mail xxx @ xxx .xxx
当然上面这条也一般。您可以再邮箱做过滤器,筛选一些报告之类的,这时候可以
mail -s "Synchronization Success" | cat rsync.log | mail xxx@xxx.xxx
1
mail - s "Synchronization Success" | cat rsync .log | mail xxx @ xxx .xxx
仅此记录我那个存活了几个月的镜像,以后有机会还会接着折腾。过几天写一个同步脚本,读取用户输入,自动添加任务并执行,日志反馈查收。
该贴被hui.chen编辑于2014-9-4 9:50:08
该贴由system转至本版2014-9-5 12:08:20