作者:马莹乐
爱可生研发团队成员,负责 mysql 中间件的测试。本人是测试技术爱好者,欢迎大家试用 dble 新功能~
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
配置 rwSplitMode=3 ,读 sql 为什么发往了 master 实例
问题来源与背景
问题源自dble社区QQ群(QQ:669663113)的社区用户 @大鹏 的反馈,问:
配置了 dble 的读写分离,无论 rwSplitMode 设置为什么值,查询总是路由到主节点。 判断发主发从的方式:直接登录到3个 mysql 节点,执行 show processlist 查看,主节点有,但从节点没有查询语句
在进一步的交流中得知:
使用的是dble纯读写分离功能 查询语句 都是多表关联的select 语句有简单引用了view
随后的本地复现
本地复现I
在本地测试的纯读写分离场景下,select 是发从实例的,没毛病

但社区用户这边在 rwSplitMode=3 时,这样的读 sql ,很稳定的发了主实例,db.xml 截图如下

rwSplitMode=3心跳 sql 为 show slave status
,且有开启延迟检测delayThreshold="100"
在db.xml的介绍文档 (https://actiontech.github.io/dble-docs-cn/1.config_file/1.04_db.xml.html) 中是这样的:

当前复盘以上信息,此场景下可供怀疑的点为:
从节点是否心跳不正常, show @@heartbeat;
看一看主从复制状态是否正常的,可在 slave 实例上直接下发 show slave status
查看主从复制状态是否正常查看主从复制的延迟时间是否超过阈值,可参考 show slave status
的Seconds_Behind_Master
指标,有关 Q&A :#3104 (https://github.com/actiontech/dble/discussions/3104)
几天后,同一社区用户 @大鹏 又询问了一个新的问题
dble 如果后端连接 MySQL MGR ,db.xml 中的心跳语句应该配置什么?使用 show slave status ,启动的时候有警告信息
当时怀疑是 mysql 版本不低于 8.0.26 时,主从复制状态(Slave_IO_State 和 Slave_SQL_Running_State )状态文案的更新导致的 dble 对复制状态的误判状态(后续证明不是这个原因,详见:本地复现II),
忽略掉了社区用户使用了 mysql 的组复制这一关键信息,
其实根据报错图片的关键字来检索的话,是可以检索到这条报错的 Q&A:启动 dble 之后,日志会一直报" found MySQL master/slave Replication err (https://github.com/actiontech/dble/discussions/3104)
本地复现II
心跳状态是正常的

dble.log 没有相关报错 
读 sql 正常发往 slave 
回归这个问题,尝试 MGR 的情况,可以复现社区用户发现的报错,且读写 sql 均会发往 primary 实例。
show slave status;,启动 dble 。
dble 虽然可以正常启动,且show @@heartbeat;
的输出一直是正常的,但是却可以在日志中找到和以上社区用户提供的一样的报错

dble.log

在纯读写分离场景下,重新测试,读写 sql 均会发往 primary 实例

读写 sql 均会发往 primary 实例

小结
读 sql 没有按照预期的发从实例,可以从以下方面着手排查(已补充 Q&A )
show @@heartbeat外,最好还是看一下 dble.log 是否存在其他问题)
show slave status时,需要考虑2点:
有没有开启配置延迟检测参数,有延迟相关的参数时,当主从复制延迟超过阈值后,读 sql 发主实例是符合预期的
可能是
show slave status;
的结果返回不符合预期(大概率是复制状态异常)
dble是否支持组复制?(以下内容已更新在对应的Q&A中)
show slave status作为心跳语句,原因为这个 sql 在组复制模式下返回值为空,不能用来判断 group-member 复制状态正常与否。若在 MGR 模式下配置了 show slave status 作为心跳语句会出现如下影响:
启动 dble 之后,日志会一直报" found MySQL master/slave Replication err (https://github.com/actiontech/dble/discussions/3104) 当启动了读操作的负载均衡 rwSplitMode (https://actiontech.github.io/dble-docs-cn/1.config_file/1.04_db.xml.html)为1/2/3时,读操作不能均衡到 slave(其中1会有明显的报错,但配置为2,3时,读 sql 会默默发送到 master ,起不到读操作的负载均衡作用)
结语
感谢社区用户 @大鹏 在遇到问题时,能够积极在社区QQ群里反馈问题,让问题走到大家的视野里。
更感谢每周问题复盘的 dble 研发同学,火眼金睛,串联起了同一用户陆续几天的问题片段,科学严谨,提出了猜想,使得问题真正原因得以浮出水面。
社区近期动态

点一下“阅读原文”了解更多资讯





