求生欲很强的数据库
最近一个月来一直在做某局的项目,涉及到了微信支付相关的业务。业务本身也是一套完整的从下单到支付到退款的全流程,我司和三方联调开发,个中滋味不表。 其中从最开始就遇到一个反复出现(偶发性)的问题,有时候数据库无法快速且正常返回查询结果。我先后从多个方面进行尝试调试,寻求解决办法。 我先还原一下场景。 服务器:2台a和b。 负载均衡:访问任意到打到a或者b。 数据库:前期没有使用持续化存储,用的热数据缓存。此次使用mongo,最开始版本3.0.x,后升级到我司其他线上项目运行版本3.2.6。a和b公用同一台database service,且mongo安装在b上。 现象:数据库有时候能返回查询结果,有时候好像卡死在那里,从接口调用到最终数据库服务本身皆无错误日志。我查询的那个集合只有50多条记录,并且我增加了索引在我的查询字段上,按照道理来说应该是毫秒级别的耗时。 首先我先从项目数据库调用入手,写了最小化的脚本,单独去读取某一条订单记录,能快速且正常返回。至此说明项目是用的mongo driver是能正常调用到mongo的。后我开启mongoose debug模式,开启方式为在我操作类里添加如下语句: mongoose.set('debug', true); 开启后,每当调用到数据库操作会输出类似mysql的sql语句,更方便调试跟踪问题。然而我看到的现象是,有时候能正常执行查询的时候就有该debug日志吞吐,而有时候没有任何输出,也无数据返回。 期间,我反复尝试安装并部署不同版本的mongo和对应版本的mongoose,甚至调整了项目框架版本,先排除了各模块之间兼容性问题。 后我怀疑到是否是负载均衡到了a(mongo是安装在b上),而a不能访问到b上的mongo呢? 我查询相关资料,修改了mongo的配置文件,将bind_ip从127.0.0.1改为0.0.0.0,且把maxConns改为2000。试探性地临时关闭了iptables服务,然而没有解决该问题。 在这个过程里面我有意识到,每当重启服务之后短暂的十几秒里面,可以正常进行查询,最多能成功2次,到第三次的时候就会前端调用超时报错。 后为了能顺利进行后续开发(因为很多接口是用到数据库存储本地数据的),我暂时关闭了a上的项目服务,先排...