最近线上出现了一次故障,现象是一组使用lua+nginx的服务80端口无法访问。
lua主要做的事是从redis里获取数据后进行逻辑判断再返回给客户端
Redis连接使用的是:lua-redis-parser
由于现在多台机器同时出问题,怀疑是中心化的存储导致的,也就是说Redis导致的。所以我的怀疑是:
1.由于lua连接redis取数据的过程出现问题(慢、连接失败、丢包等等),导致lua被block
2.lua的block导致nginx进程被block(是否会?)
3.nginx进程被block导致80端口无法访问(是否会?)
于是我做了下面的实验:
用tcpcopy从线上引流到一台测试机
测试机连接测试的redis
测试redis使用redis 的debug sleep命令模拟redis操作阻塞
这时候能看到,一旦redis开始阻塞,nginx 的 access log马上停掉,手动curl请求nginx一直block住等待。
不知道我的猜测是否正确,又有什么解决方法,请各位指点一下。