一般问题出现,首先最重要的是定位问题的影响范围。以制定不同的解决方案。
流程
- 首先:估计错误影响范围
当问题出现,第一反应是估计影响范围。如当有用户反馈页面白屏,打不开时。需第一时间确认影响范围。具体操作流程如下:
- 页面pv数据,接口调用数据或者其他可以判断影响范围的数据有没有出现断崖式的下跌
- 根据是否断崖下跌制定不同的方案
pass: 当出现断崖下跌,整个服务不可用时,启动紧急方案,如切换到临时页面(404或其他页面)。否则,查找问题,紧急排错
- 然后:查看服务器各种指标
当问题是局部发生的时候。则需进行排查。首先查看服务器各个集群的状态:
-
linux服务器的运行情况(机房断电,断网),负载(cpu,内存,硬盘等),网络(网络是否阻塞或断网)
-
各支撑集群的状态,MySQL集群机器的状态(是否有实例断开、当机,负载过高,主从延迟的情况),redis集群(redis各个机器的运行情况,是否有redis崩溃等),或者其他支撑服务的运行状态(memcache,elasticsearch,mongo等)
- 其次:排查日志
日志的排查不能是漫无目的的,需要根据问题的情况及对业务的了解,先后的去排查可能相关的日志。
-
PHP错误日志
-
apache日志
-
nginx日志
-
mysql的慢查询日志
- 最后
问题一般在如上的流程中都能定位出来。如果定位不出来:
==让自己冷静下来,停下来一分钟,想一想问题,千万不要慌乱,并在没有思路的情况下操作,避免二次事故==
试试以下方案:
1、根据异常的状态进行合理的推断和定位问题(一般靠经验和对业务的熟悉程度),
具体的操作一般也是依据如上的流程
2、联系最近的系统操作进行判断(如机器切换,版本升级,代码发布,网络切换),来定位问题
pass: 一般的线上问题排查,如果是简单的问题,直接可以定位到的,则不需要如上的流程。
- 解决问题
当影响范围或这错误已经找到或者没找到的情况下。需要在最短的时间内恢复系统(不一定是100%恢复,但要保持基本可用),如:
-
整站崩溃,要紧急切换到备用的404页面
-
局部功能导致的系统异常,可直接下掉该功能,保持基本功能异常
如等级系统异常导致的整站异常,则可下掉等级系统,所有用户等级全部默认1级,以保持系统基本功能可用
问题解决的时间决定了当前的处理方案的不同。需根据业务进行讨论。如时间长,则需要怎么解决用户访问,用户应该看什么,需要根据自己的业务进行讨论。 时间短,在这么短的时间内用户应该看什么,也是一样的道理
- 延伸
从上面的处理过程会得到一个提醒:
==线上系统的备用方案非常重要,系统需要有演戏,有紧急情况下的备用方案==
工具推荐
上面的排查过程,需要在一系列工具的配合下才能准确,快速的定位问题,以下列一下可能需要用的工具。
==linux命令是最好用的工具==
pass: 以下工具是以服务是以多台机器(服务集群)的情况下推荐使用的,如果是单机或者2,3太机器,则直接使用linux的命令行工具即可。
- 访问情况分析
业务的访问情况分析,如pv,可以用百度统计等第三方统计平台(对于上述的情况,这种第三方统计平台是足够使用的)。
接口的访问情况,可能看起来比较麻烦。一般接口的访问情况,可以根据入口服务器(如nginx或apache)的访问日志来做一个简单的估计和查看。但是如果是分布式的机器的情况下,就比较麻烦。建议搭建ELK日志平台,通过对日志的聚合统计就可以做到接口访问情况的分析。
- 运维工具
zabbix:是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。可以监控到各种服务器信息。
当然目前运维届有各种监控工具,如单独监控mysql集群的工具,redis的集群监控工具等都是可以用的。各个公司需要根据自己的情况,选用不同的工具。毕竟如果只需要监控mysql,那用zabbix就太重了。
目的是一致的:快速,简便的看到服务的运行信息,并具有报警功能
- 日志工具
业界目前比较流行的有ELK Stack。用于一站式的日志采集,存储,查看和分析。可以集中,方便的观察到各台服务器的日志情况,又不需要每个人都开通线上机器的权限,也方便日志的查询和搜索
扩展
在一般情况下(业务系统较简单,机器不多)。linux的命令是最方便快捷的方法。配合shell的sed或awt语法,可以做很多事情。
下面列一下一些常用的命令或工具:
一、web工具
1、xdebug、xhprof;
2、PHP慢日志;
3、查看php-fpm、httpd进程数,必要时使用strace、lsof。
二、Mysql工具
1、mysqlsla:配合mysql的全日志,在测试环境中,可以准确地分析每个流程执行sql语句,排查索引、业务逻辑等问题;
2、mk-query-digest+tcpdump:实时监测数据库端口(比如3306),截取正在sql语句。
三、linux自带的命令
1、top:这个基本可以看出资源使用情况,可第一步先判定问题是“CPU密集型”或者“IO密集型”;
2、iostat:分析磁盘IO
3、vmstat:可分析内存的使用情况
四、各类日志帮助分析问题
1、web日志:很多问题可以在错误日志中找到提示,非常有用
2、mysql日志:mysql的错误日志、慢日志
3、php慢日志:也有一定的帮助,我碰到较多的是连接DB的时候慢了,慢日志不用时必须关闭
``
网友评论