记最近遇到的问题及排查解决思路。
简单说下业务模型,消费者消费nsq队列中的数据,然后存入postgresql数据库。数据执行插入操作,同时触发某个字段计算更新,在更新过程中调用了查询函数。
在查postgresql中数据时发现有大量数据丢失,看服务生产者消费者都正常运行,下面开始一步步排查。
登录nsqdadmin页面管理工具,查看连接消费情况。此时发现有30多万数据积压,首先怀疑是不是消费者数量不够导致的,此时不要着急增加消费者,去看看连接情况。发现连接超时严重,而且最长的连接坚持不到10分钟就挂了再自动重连,这个过程中,消费的数量也很少,可能这才是导致积压的根本原因。
去捞nsqd的日志,发现大量超时ERROR(此处真实IP端口已替换)
ERROR: client(ip:port) - failed to read command - read tcp ip:4150->ip:port: i/o timeout
这也就说明消费者连接都是正常的,只是读取过程中出现了超时,去查下消费者时间记录。
单条数据插入的时长居然将近20秒,那问题肯定出在数据库这里了。
DB语句执行较慢,主要的原因大致可分为:
- 语句本身性能较差导致,通常表现局部请求缓慢,极端情况下也会引发资源瓶颈导致全局性能问题;
- 语句本身性能没问题,但受资