记一次线上故障排查
背景描述:平台采用spring-cloud 的微服务框架。用eureka 作为服务注册中心,用zuul 作为网关,在加上两个服务调用者和服务提供者。同时使用nginx 作为反向代理服务器,mycat用做分表分库,redis用做缓存。问题描述:在今天早上7点多的时候,反应全部请求不了,功能完全不能使用。初步诊断:问题定性是非常严重,使用ps 查看java,mycat,redi...
背景描述:
平台采用spring-cloud 的微服务框架。用eureka 作为服务注册中心,用zuul 作为网关,在加上两个服务调用者和服务提供者。
同时使用nginx 作为反向代理服务器,mycat用做分表分库,redis用做缓存。
问题描述:
在今天早上7点多的时候,反应全部请求不了,功能完全不能使用。
初步诊断:
问题定性是非常严重,使用ps 查看java,mycat,redis,nginx 等的进程都是正常。top 等名称查看也都是正常。但是当时用
查看日志:
发现整个平台都没有打印日志了,也就是说从6.9号到6.14号发现这个问题,都没有打印日志了。
那没有打印日志的原因有:磁盘空间已满,没有地方写;再就是程序都挂了。但是在昨天的时候,整个系统都是能正常运行的,所以可能的原因就是前者。(后续证明就是这个磁盘空间不足导致了全部事故)后续需要想一个策略,在服务器磁盘空间达到多少的时候,需要清理空间。
接下来删除了部分之前的日志文件,有了很多剩余的空间,这个时候,我发现开始写日志了。
发现:
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: merchant short-circuited and no fallback available.
这句表示服务 merchant 服务没有起来,重启此服务,就不再报这个错。
还是会提示:
Caused by: java.lang.RuntimeException: Hystrix circuit short-circuited and is OPEN
表示:hystrix 回路短路被打开了。我个人认为,这是因为磁盘已满,系统运行非常慢,几乎停止,但是进程仍然还在,但是无法及时响应请求,导致累积了很多线程请求。最终导致了短路。
我们可以查看下源码:AbstractCommand.Class
private Observable<R> handleShortCircuitViaFallback() {
// record that we are returning a short-circuited fallback
eventNotifier.markEvent(HystrixEventType.SHORT_CIRCUITED, commandKey);
// short-circuit and go directly to fallback (or throw an exception if no fallback implemented)
Exception shortCircuitException = new RuntimeException("Hystrix circuit short-circuited and is OPEN");
executionResult = executionResult.setExecutionException(shortCircuitException);
try {
return getFallbackOrThrowException(this, HystrixEventType.SHORT_CIRCUITED, FailureType.SHORTCIRCUIT,
"short-circuited", shortCircuitException);
} catch (Exception e) {
return Observable.error(e);
}
}
注意到这个方法会抛出:hystrix circuit short-circuited and is open
short-circuit and go directly to fallback (or throw an exception if no fallback implemented)
在抛出异常,但是又没有故障恢复的 方法实现的时候,就会抛出异常。
我的代码中确实没有fallback 处理的方法,这个后续也是需要加上的。
总结:
1.定时清理磁盘空间
2.hystrix增加fallback机制
更多推荐
所有评论(0)