https://blog.51cto.com/oldboy/909696html
1【提出问题】jquery
【实际案例一】nginx
凌晨3:00点某公司(网站业务)的一个IDC机房带宽流量忽然从平时高峰期150M猛增至1000M,以下图:web
该故障的影响:直接致使数百台服务器没法链接,该机房所有业务中断。
shell
【实际案例二】数据库
某年某月某日夜老男1孩接到学生紧急求助,公司网站(web游戏业务)平时几十M带宽,结果忽然跑满100M,持续100M已经好久。过后,该学生的总结开头以下,apache
凌晨一点接到报警短信,网站没法访问。立马拿起笔记本上网查看,发现整个机柜的网络都没法正常访问。第一感受是否是IDC网络出问题了,给机房打电话反馈回来的信息是机房网络正常,可是带宽流量异常(100M带宽的流量峰值已跑瞒)。后端
该故障的影响:直接致使数十台服务器没法链接,该机房所有业务中断,且故障持续时间长。
【实际案例三】数组
某月某日,接到运维的朋友紧急求助,其公司的CDN源站,源站的流量没有变更,CDN那边的流量无端超了好几个G,不知道怎么处理? 老男孩补充,曾遇到过一张图片不到一天,跑了20多T的一张流量。
该故障的影响:因为是购买的CDN,虽然流量多了几个G,可是业务未受影响,可是,这么大的异常流量,持续下去可直接致使公司无端损失数万元。解决这个问题体现运维的价值。缓存
事不过三,暂时先举3个例子吧。这三个案例都是运维工做中实际遇到的故障,事发忽然且须要紧急处理。在实际论坛或群里看到朋友反馈的此类问题,也多达数次,其中差很少各类鸟都有,老鸟、中鸟,小鸟。
大部分朋友解决起来,脑壳里没思路(反射弧直接定位DDOS),解决起来耗时长,形成的了业务长时间中断。老鸟解决起来也是循序渐进,首先会反射为DDOS问题,结果解决时间加长了,若是能提早作好预案,恢复速度可能就会好不少,下面老男孩就来谈下我的的一些见解。
2 【分析问题】
1)IDC带宽被占满的缘由不少,常见的有:
a.真实遭受DDOS攻击(遇到过几回,形成影响的很少见,其中还有黑客勒索的案例)。
b.内部服务器中毒,大量外发流量(这个问题老男孩接警5次以上)
c.网站元素(如图片)被盗连,在门户页面被推广致使大量流量产生(接警3次以上)
d.合做公司来抓数据,如:对合做单位提供了API数据接口(有合做的公司的朋友了解这个)
e.购买了CDN业务,CDN猛抓源站(这个次数也很多)。
f.其余缘由还有一些,不广泛就不提了。
2)CDN带宽异常,源站没异常。
这类问题基本都是缓存在CDN的数据被频繁访问引发的。解决方法见结尾案例。
3) CDN带宽异常,源站也异常。
可能缘由如公司作推广,大量数据访问,热点数据cache里不全。或CDN问题致使数据回源(有关CDN回源率问题及提高回源率经验,之后再和你们分享)。影响就是带宽高,后端静态服务器及图片及存储压力大(解决办法见老男孩的7层门户网站架构案例文章http://oldboy.blog.51cto.com/2561410/736710)
3 【解决问题】
分析了问题的可能缘由,就比如较排查了。
a.真实遭受DDOS攻击
DDOS问题的解决老男孩已经写了原创文章(http://oldboy.blog.51cto.com/2561410/845349),提供了17条解决经验思路,供你们参考,这里就不提了,那么实际上
遭受真实DDOS攻击并产生影响的并非最多见的。
b.内部服务器中毒,大量外发流量。
这个问题的解决比较简单,可能有的朋友说,看看服务器流量,哪一个机器带宽高处理下就行了。其实否则,实际解决比这复杂得多,带宽打满,全部监控都是看不到的。
比较好的思路,是联系机房肯定机房自身无问题后(机房通常无法帮咱们的),请机房断开链接外部IP服务器的网线,如负载均衡器,仅保留××× SERVER,而后断掉内部服务器出网光关的线路,切断外发流量源头。
接下来查看监控流量服务,判断外发流量的服务器,而后进行处理。
其实,这个问题的发生及快速定位和不少公司的运维规范、制度关系很大,老男孩在给一些公司作运维培训分享时发现这个问题很严重(表象很好,内部运维规范、制度欠缺不少),你们都讨论的很深刻,实际用的仍是和聊的有差距。。
好比有的公司开发直接FTP链接随时发布代码,或者由开发人员负责定时屡次上线。而运维人员又不知晓,结果致使问题发生定位时间长,这点建议各公司的老大多思考下。
老男孩的运维思路是,若是把网站机房比喻为一座房子,那首先要堵住后门(内部),其次是监控好前门(作好安全,留个小窗户给外面人看,即80端口服务,同时安排站岗值班的)。
网站的无休止的随时随意发布代码,对网站的稳定影响是相当重要的。对运维人员对故障的定位快慢也很关键。根据老男孩不彻底调查,约50%以上的重要运维故障都是程序代码致使的,这也是老男孩给企业作培训分享时,灌输建议CTO的,多把网站稳定的责任分给开发,而不是运维。若是这个思想不扭转,网站不稳定情况就难以改变。
c.网站元素(如图片)被盗连
这个属于网站的基本优化了,apache,lighttpd,nginx都有防盗链的方案,必需要搞。说到这也提个案例,老男孩的一个学生,到了企业工做,发现人家网站没有防盗链,结果上来没有周知老大,直接作防盗链了,而后美滋滋的当时还给我留言,说给公司搞防盗链了,颇有成就,结果致使公司对外合做的业务,都是小叉子了,幸好发现的及时没出大问题。
d-e.合做公司来抓数据,如:对合做单位提供了API数据接口或购买了CDN业务。
最多见的就是购买CDN服务,如:CDN新建一个节点(可能数十机器),直接来咱们IDC原战来抓数据(有的作好点的夜里来抓)。把原站抓的流量暴涨,严重的致使服务宕机。几家CDN公司,都有过这样的问题。这点但愿CDN公司看到了,能改善,毕竟用户上帝嘛。
固然和电信,联通,GOOGLE,BAIDU,词霸等公司的合做,也会有流量暴高的状况,这里面包括了为合做的站搜索引擎爬虫爬数据的问题。有时虽然带宽流量不高,可是服务器或数据库撑不住了,搜索引擎专门喜欢爬咱们的站内搜索,DISCUZ,CMS等早期的开源程序的搜索都是全站like %%方式去数据库搜索的,几个爬虫过来,直接就挂掉了,固然这不是本文要讨论的,解决方案之后再聊。
f.其余缘由还有一些,不广泛就不提了。
上面的几点比较常见,其余缘由就很少见了,所以,做罢,打这么多字真不轻松啊。
4 【苦练内功】
首先,老男孩强调下,你们要常常培养下本身的内心素质,遇到问题不能发慌。遇到很多朋友,处理紧急故障时,大脑都空白缺血了,手抖的没法敲击键盘了,这样的状态如何解决故障呢?若是老大在后面看着就更是雪上加霜了,甚至有个别学生直接跟老男孩哭鼻子了,宕机几分钟损失上万,负不起责任。
其实上面的你们的表现都是正常的,没什么不对的,曾经老男孩也是这样过来的,也是不断的挑战本身才练出来的。
但愿朋友们能多提早作功课,不要问题来了在思考解决办法,临时的应对必定会是手忙脚乱的,即便是老鸟。若是提早有预案和防范演练,问题发生后就坦然得多,这能够扩展到运维的方方面面,DB,WEB,备份,恢复,流量等。
5 【亡羊补牢】
发生问题后,要充分总结,争取下次发生了,能提高速度,固然最好不发生。其实,运维人员挺悲催的,开发的下班就没事了,咱们还得7*24开手机,来个短信提心吊胆的,甚至看到有个门户DBA发微薄,说making love时均可能被报警短信打断。1、提早优化运维制度、规范。2、提早优化网站结构、单点故障。3、留足备用带宽及服务器资源,把控好风险。4、完善的监控策略及响应机制等。
尽可能不打无准备之战。兵法云,知己知彼,百战不殆。运维又未尝不是这个理?
6 【实战解决案例】
说了这么多了,都是理论,再给个案例吧【摘自老男孩Linux培训-shell培训教案中的例子】,这里要特别感谢白开水兄弟给予的支持。
下面的例子适合于网站流量很高,可是,还没达到全网瘫痪的严重地步时的解决方案,适合咱们本身的IDC机房及CDN业务(若是是CDN,那么,分析处理能够交给CDN,本身下载CDN日志分析也可)。
范例7:分析图片服务日志,把日志(每一个图片访问次数*图片大小的总和)排行,取top10,也就是计算每一个url的总访问大小
说明:范例7的生产环境应用:这个功能能够用于IDC及CDN网站流量带宽很高,而后经过分析服务器日志哪些元素占用流量过大,进而进行优化裁剪该图片(见老男孩发布的《淘宝的双十一超大流量应对文章点评》),压缩js等措施。
本题须要输出三个指标: 【访问次数】 【访问次数*单个文件大小】 【文件名(能够带URL)】
解答:
测试数据
59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/p_w_picpaths/photos/2.jpg HTTP/1.1" 200 11299 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/p_w_picpaths/photos/2.jpg HTTP/1.1" 200 11299 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
59.33.26.105 - - [08/Dec/2010:15:44:02 +0800] "GET /static/flex/vedioLoading.swf HTTP/1.1" 200 3583 "http://oldboy.blog.51cto.com/static/flex/AdobeVideoPlayer.swf?width=590&height=328&url=/`DYNAMIC`/2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
124.115.4.18 - - [08/Dec/2010:15:44:15 +0800] "GET /?= HTTP/1.1" 200 46232 "-" "-"
124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/web_js.js HTTP/1.1" 200 4460 "-" "-"
124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/jquery.lazyload.js HTTP/1.1" 200 1627 "-" "-"
法一:经过两个数组来计算
由于咱们要的最终结果是某个文件的访问次数和消耗的流量,因此考虑创建以文件名为索引的两个数组,一个存储访问次数,一个保存消耗的流量,这样当使用awk按行遍历文件时,对次数数组+1,同时对流量数组进行文件大小的累加,等文件扫描完成,再遍历输出两个数组既能够获得该文件的反问次数和总的流量消耗。
[root@locatest scripts]# awk '{array_num[$7]++;array_size[$7]+=$10}END{for(x in array_num){print array_size[x],array_num[x],x}}' access_2010-12-8.log |sort -rn -k1|head -10 >1.log
法二:
[root@locatest scripts]# awk '{print $7"\t" $10}' access_2010-12-8.log|awk '{S[$1]+=$2;S1[$1]+=1}END{for(i in S) print S[i],S1[i],i}'|sort -rn|head -10 >2.log
[root@locatest scripts]# diff 1.log 2.log
[root@locatest scripts]# cat 1.log
57254 1 /static/js/jquery-jquery-1.3.2.min.js
46232 1 /?=
44286 1 //back/upload/course/2010-10-25-23-48-59-048-18.jpg
33897 3 /static/p_w_picpaths/photos/2.jpg
11809 1 /back/upload/teacher/2010-08-30-13-57-43-06210.jpg
10850 1 /back/upload/teacher/2010-08-06-11-39-59-0469.jpg
6417 1 /static/js/addToCart.js
4460 1 /static/js/web_js.js
3583 2 /static/flex/vedioLoading.swf
2686 1 /static/js/default.js