记一次线上故障排查

背景描述:

平台采用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 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机制

你可能感兴趣的:(其他)