【拖雷】Taobao監控系統之改進——檔案傳輸

idba發表於2008-04-23

在早些的時候,也包括我的書《構建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下面建立了自己的臨時檔案,用來解決併發問題。

<!--

--EOF--

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1384/viewspace-247879/,如需轉載,請註明出處,否則將追究法律責任。

相關文章