
MySQL
在docker与
MySQL相关的方面,我近期碰到一个状况,只是到目前还没找到根本原因。我们的后端是基于gin来开发的,默认使用
MySQL数据库,通过gorm来进行操作。在部署的时候,通常采用docker - compose这种方式,声明一个服务,这个服务包含后端的若干服务、nginx、
MySQL、redis等,每个服务都对应一个容器,它们之间通过桥接(bridge)网络相互连接。最近在某个项目里,客户提出要求,要把db和redis部署在单独的机器上,不过仍然是使用docker - compose来完成部署。后端服务访问db是借助内网ip加上映射端口的方式进行的。我们原本觉得这和我们平常使用的方式没太大差别,无非就是多了一层局域网的环节。然而上线之后,客户以及驻场的同事给我们反馈了一个非常奇怪的现象。在网页上访问服务的时候,每隔一段时间,就会有某个请求变得极其缓慢。并不是某个特定的请求会这样,而是几乎所有请求都有出现这种情况的可能性。而且当这样一个慢请求出现的时候,在它前后发出的请求似乎并没有受到影响。最让人意想不到的是,哪怕是在一个单表里面,使用主键id来查询一条记录,都有可能出现响应很慢的情况。当这种慢查询出现的时候,响应时间能长达10秒,通过查看日志能够清楚地发现,这10秒几乎都是db的处理时间。我们曾经一度认为是客户的网络存在问题,可是客户表示自己的网络是千兆带宽,并且我们经过测试也发现客户的网络质量确实很不错。通过路由追踪能够看到,中间没有其他的节点,都是直接连接的。我们回到
MySQL容器里面,又发现了一个新的奇怪现象,那就是当我们把
MySQL的慢查询日志记录功能打开,并且将阈值设置为1秒的时候,结果当后端服务每隔一会儿就产生一条10秒的日志时,
MySQL自身却一条慢日志都没有捕捉到,不管我们怎么仔细查看,就是一条都没有。之后我们把
MySQL容器和服务重新恢复部署到同一台主机的同一个服务里面,这时候响应就变得正常了,再也没有出现慢响应的情况。接着我们又把db的端口映射出来,后端服务通过本机ip加上映射端口的方式去访问db,结果慢查询又定时出现了。我们在客户提供的db机器上直接部署了一个实体的
MySQL服务,然后所有的请求就都变得正常了。