Taobao监控系统之改进——文件传输

在早些的时候,也包括我的书《构建Oracle高可用环境》中的16章,关于监控体系的介绍中,所有的案例都是采用scp从被监控的客户端上拷贝文 件到集中分析的Monitor上,类似这样的动作,如

scp $SOURCE_FILE $MONITOR:$TARGET_FILE

当客户端不多的情况下,这么做也是没有什么问题的,而且书写简单,一直在这么用。但是,当客户端的数量上去以后,在大量并发的情况下,有的时候就会 出现这样的错误:

ssh_exchange_identification: Connection closed by remote host
lost connection

查看crontab的日志,也可以看到有部分crontab调度失败:

Cron Job with pid: 2859224 Successful
Cron Job with pid: 3154900 Failed
Cron Job with pid: 3027512 Successful

这是因为ssh对并发的支持不是太好,当很多客户端同时传送文件的时候,可能会有部分客户端传送失败,经过研究,决定用ftp取代scp来传送文 件,改写为如下:

TARGET_TMP_FILE=$TARGET_FILE`date +%Y%m%d%H%M%S`
ftp -n << !
open $MONITOR
user user pass
binary
put $SOURCE_FILE $TARGET_TMP_FILE
rename $TARGET_TMP_FILE $TARGET_FILE
bye
!

修改以后通过观察,多客户端文件同时并发传输的问题解决,查看crontab的日志,再也没有出现过crontab调度的失败。
注意,这里是先put(上传),然后再rename,这么做的好处也就是解决另外一个并发问题,如ftp被启动多次传递同样一个文件,这个文件可能被多个 进程附加,而不是覆盖。而采用可变的临时文件名称(临时文件名称带时间戳标记),等上传完成之后再改名,就可以避免这种情况的发生。
其实采用临时文件的做法,在unix/linux中也很常见的,如执行crontab -e,就可以看到类似的提示

/tmp/crontab.XXXXXwxMJF” 0L, 0C

其实它也是在/tmp下面建立了自己的临时文件,用来解决并发问题。