目前RDS-Mysql支持开通读写分离,然后应用使用读写分离的地址提交请求的时候,就能够将符合条件的读请求分发到只读实例上执行,从而分担主实例上读请求的压力。
但是在使用过程中,并不是所有的读都会分发到只读实例实例上执行,比方说处于事务中的读。(详细请参考:https://help.aliyun.com/document_detail/96073.html?spm=a2c4g.11174283.6.628.32b94c22UhkIsT)
在处理问题的过程中,经常会有用户反映,为什么我只读实例上的CPU压力特别低,并且业务中的一些读请求都没有在上面运行,针对这种情况,可能就是因为在应用中有开启事务,然后读请求就被发送到主实例上执行了。
对于这种情况的排查,我建议使用下面的方法进行操作:
- 首先在主实例还有只读实例上开启一下sql审计。
- 配置分离的权重:主实例为0,只读实例为100。
- 然后通过mysql命令行这种方式连接读写分离的地址,提交一个简单的读请求(没有包含在事务里面)。
- 最后在主实例和只读实例的sql审计日志中查看,看到底是在哪里执行的之前的select操作。
如果发现了这样的方式提交读请求还是到主实例上执行的话,那么请联系阿里云进行排查(发生的机率太小);一般如果是因为开启了事务造成的话,在审计日志中也是能够看到的。