流量暴漲擒兇記
某天,月黑風(fēng)高,寒風(fēng)凌厲。迷糊中,一陣急促的電話響起,來電告知,數(shù)個(gè)機(jī)房的帶寬暴漲,需要立即處理,否則IDC服務(wù)商要拔網(wǎng)線了。一看時(shí)間,大概是凌晨2點(diǎn)了,真悲催啊!
先登錄監(jiān)控系統(tǒng)查看流量。平時(shí)流量最大的一個(gè)服務(wù)器的帶寬跑滿1G了(因?yàn)楫?dāng)時(shí)急著處理故障,沒留下截圖),而正常情況下,它的帶寬峰值穩(wěn)定在600M-700M/s的樣子,如下圖所示:

查看其它服務(wù)器,帶寬圖基本拉成一條直線,把100M跑滿了(這些機(jī)器性能差,帶寬為100M)。

盡管多個(gè)機(jī)房多個(gè)服務(wù)器帶寬都超平常很多,基本可以確定是出問題了。但心里還是不放心,擔(dān)心是cacti監(jiān)控不準(zhǔn)或者出了故障。因此又單獨(dú)登錄數(shù)個(gè)流量大的服務(wù)器,使用iptraf這樣的工具實(shí)時(shí)查看,結(jié)果真的與cacti給出的結(jié)果一致。
這是一個(gè)下載業(yè)務(wù),總帶寬峰值大概在3Gb/s的樣子。其結(jié)構(gòu)分為三層:源站、中轉(zhuǎn)層、邊緣層。其業(yè)務(wù)流程如下圖所示:

1、用戶通過web接口編輯和上傳文件到源站服務(wù)器;
2、源站用rsync同步文件到中轉(zhuǎn)服務(wù)器;
3、邊緣服務(wù)器配置成緩存,然后根據(jù)需要從中轉(zhuǎn)服務(wù)器抓取所需的對(duì)象存儲(chǔ)起來。
為了提高可用性和負(fù)載均衡,邊緣服務(wù)器從2個(gè)中轉(zhuǎn)服務(wù)器抓取文件。
一般來說,引起流量暴漲的原因無外乎有:遭受攻擊、網(wǎng)站市場(chǎng)推廣、系統(tǒng)或程序異常、木馬程序。通過詢問相關(guān)市場(chǎng)人員,答復(fù)說近期沒有任何市場(chǎng)推廣;再問程序員,有沒有修改程序或新增插件,答復(fù)都是否定的。再讓管理人員查看后臺(tái)統(tǒng)計(jì)數(shù)據(jù),但統(tǒng)計(jì)數(shù)據(jù)并沒有跟流量同步暴增。由此判斷,出問題的原因只剩下系統(tǒng)異常和黑客攻擊兩種情況。被植入木馬的幾率很?。撼绦蚴峭ㄟ^vpn上傳的,并且只有靜態(tài)內(nèi)容。
情況緊急,不可能每個(gè)服務(wù)器都登錄一片。因此先從流量最大的查起,再查流量次大的。檢查的項(xiàng)目包括:
(1)系統(tǒng)日志:看是否有內(nèi)核報(bào)錯(cuò);
(2)Web日志,統(tǒng)計(jì)ip來源是否過于集中;
(3)查看tcp狀態(tài),了解請(qǐng)求情況;
(4)用工具iptraf查看連接數(shù)最多的ip。
通過上述措施,得知連接數(shù)最多的ip不是來自用戶,而是來自服務(wù)器之間的相互請(qǐng)求。通過查出來的ip,登錄改服務(wù)器,看是否發(fā)生了什么?通過檢查進(jìn)程、系統(tǒng)日志、網(wǎng)絡(luò)狀況都未找到原因。隨手執(zhí)行了一下crontab –l 看有沒有什么自動(dòng)任務(wù),結(jié)果發(fā)現(xiàn)有一個(gè)腳本,而且是每10鐘執(zhí)行一次。我印象中沒寫個(gè)這樣一個(gè)腳本的。打開一看,內(nèi)容如下:
#!/bin/bash
Path=`grep proxy_cache_path /usr/local/nginx/conf/vhosts/apk_cache.sery.com.conf |awk '{print $2}'|sed 1d`
for i in `ls $Path`; do
grep -a -r apk $Path/$i/* | strings |grep "KEY:" >/tmp/cache_list$i.txt
grep -v apk$ /tmp/cache_list$i.txt >> /tmp/del$i.txt
\rm -rf `grep -v apk$ /tmp/cache_list$i.txt|awk -F: '{print $1}'`
#echo $Path/$i
sleep 60
done
\rm -rf /tmp/cache_list*
這個(gè)腳本要結(jié)合具體場(chǎng)景才能弄明白,因?yàn)槟承┰?,這里不再分析它;總之,這個(gè)腳本的作用,就是在緩存目錄查詢一些文件是否存在,如果存在,就刪除它。
上述操作的結(jié)果,就是緩存文件剛存在,不久就被干掉。當(dāng)用戶需要下載這個(gè)文件時(shí),邊緣服務(wù)器卻沒有緩存,因此只好回源(向中轉(zhuǎn)服務(wù)器抓取)。正常情況下,會(huì)緩存很長(zhǎng)一段時(shí)間,但因?yàn)檫@個(gè)腳本,過一會(huì)又把它干掉了。這就導(dǎo)致不斷的大量的回源,流量就暴漲了。未避免風(fēng)險(xiǎn),沒直接刪除這個(gè)腳本,而在crontab計(jì)劃任務(wù)里把它注釋掉。逐一在邊緣服務(wù)器排查,注釋掉這個(gè)任務(wù)。
觀察流量圖,帶寬耗費(fèi)逐步下降,10-20分鐘后,趨于正常了。打一通電話后,繼續(xù)睡覺。