大数据平台测试-一次生产P2故障记录
项目介绍:某鉴权项目。公司为了数据安全,去年评审通过了一个基于中间件kafka的鉴权项目,大概的意思,消费topic的应用需要对接鉴权项目,订阅应用,启动端口9093消费(默认是9092端口),当时大家(开发)都觉得风险太大了,不适合接入公司核心kafka集群。万一出错影响太大。但是领导,技术委员会通过了,大家也没啥办法,谁叫大家都是执行者。。。
先看出现生产事故的java代码:
@Override
public class process(WatchEvent event){
Event.KeeperState state = event.getState();
if(Event.KeeperState.SyncConnected = state)
log.info("当前 Zookeeper 已连接")
} else if(Event.KeeperState.DisConnected == state || Event.KeeperState.Expired == state)
log.info(" XX项目服务端 和Zookeeper 断开连接,开始重连")
try{
client = new Zookeepe(servers, MAX_VALUE, null)// 这一行代码导致的故障
// 其他逻辑
} catch(...){
// 手动抛异常
} catch(...){
// 手动抛异常
} else{
//...
}
事故原因:XX鉴权模块存在bug,在ZK客户端和服务端失联时,处理逻辑中又创建了新的ZK连接,且未关闭旧的失效连接,短时间连接数量大量上升,引起Zookeeper集群压力过高,导致Zookeeper集群故障和kafka集群发生故障
分析:1、 开发时,开发不熟悉Zookeeper机制,process方法中已创建了连接,自己重新new 相当于不断地创建连接。而且还有一个大bug,连接没有关闭。。。
2、代码逻辑属于异常分支,开发和测试时都未测试,因为大家都觉得这一段代码都走不到,刚好运维把机器重启了,就走到这段逻辑了。。。
3、没有进行code review,技术负责人没有进行代码把关
4、代码属于一个紧急开关模块,该模块我们也以为是永远用不到的。。(数据库崩溃、服务崩溃。。。)
影响:影响公司核心业务,几万单,需要转人工处理,P2故障
后果:项目关停。。团队一年多的努力就这样白费了
总结:作为技术负责人,重要业务代码需进行详细的code review。作为测试,可以通过代码覆盖率工具看这段代码是否覆盖,未覆盖到的代码发到群里评审。另外,基于中间件的项目,风险是真的高。。。接入核心业务要慎重,谁能保证系统没有bug呢?但是有bug会对业务造成重大影响的项目还是要技术委员会做好把关