镜像同步实现方式思考_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3109 | 回复: 0   主题: 镜像同步实现方式思考        下一篇 
    本主题由 Administrator 于 2014-9-5 12:08:21 移动
william
注册用户
等级:新兵
经验:66
发帖:0
精华:0
注册:2014-6-16
状态:离线
发送短消息息给william 加好友    发送短消息息给william 发消息
发表于: IP:您无权察看 2014-9-4 9:17:53 | [全部帖] [楼主帖] 楼主

之前积攒了一些经验,觉得有必要放出来供他人参考。

一种方法,最简单的,就是 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



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论