分布式 | dble 读写分离场景下为什么普通的读 sql 发送到了 master 实例上

2022-05-24 15:17:49 浏览数 (1)

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

配置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的介绍文档中是这样的:

当前复盘以上信息,此场景下可供怀疑的点为:

  1. 从节点是否心跳不正常,show @@heartbeat; 看一看
  2. 主从复制状态是否正常的,可在slave实例上直接下发show slave status查看主从复制状态是否正常
  3. 查看主从复制的延迟时间是否超过阈值,可参考show slave statusSeconds_Behind_Master 指标,有关Q&A: #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

本地复现II

在后续的本地试验过程中发现,dble在使用mysql8.0.26版本的普通主从复制,去做读写分离的mysql后端时,是正常的:

  • 心跳状态是正常的
  • dble.log没有相关报错
  • 读sql正常发往slave

所以,当时的怀疑是错误的,dble支持后端mysql8.0.26的主从复制,读sql可正常发从。

本地复现III

回归这个问题,尝试MGR的情况,可以复现社区用户发现的报错,且读写sql均会发往primary实例。

测试配置:搭建3节点MGR单主模式作为后端dbGroup,配置心跳语句是show slave status;,启动 dble

dble虽然可以正常启动,且show @@heartbeat;的输出一直是正常的,但是却可以在日志中找到和以上社区用户提供的一样的报错

dble.log

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

读写sql均会发往primary实例

小结

读sql没有按照预期的发从实例,可以从以下方面着手排查(已补充Q&A)

  1. 先断定一下在对应版本的dble纯读写分离场景下,sql发主是否符合当前预期,具体可以参考官方文档和Q&A
  2. 确定实属应该发从,但是却发了主的,可以看下心跳状态是否正常,(根据本次问题,我们除了观测show @@heartbeat外,最好还是看一下dble.log是否存在其他问题)
  3. 当使用的心跳sql是show slave status时,需要考虑2点:
    • 有没有开启配置延迟检测参数,有延迟相关的参数时,当主从复制延迟超过阈值后,读sql发主实例是符合预期的
    • 可能是show slave status;的结果返回不符合预期(大概率是复制状态异常)
  4. 如果使用了最新发版的dble,版本3.22.01.0,还需要考虑纯读写分离场景下,是否存在读写分离后端实例的粘滞性的情况dble是否支持组复制?(以下内容已更新在对应的Q&A中)参考Q&A#3184,但鉴于以上,在使用MGR时,需要注意避免使用show slave status作为心跳语句,原因为这个sql在组复制模式下返回值为空,不能用来判断group-member复制状态正常与否。若在MGR模式下配置了show slave status作为心跳语句会出现如下影响:
  5. 启动dble之后,日志会一直报" found MySQL master/slave Replication err
  6. 当启动了读操作的负载均衡rwSplitMode为1/2/3时,读操作不能均衡到slave(其中1会有明显的报错,但配置为2,3时,读sql会默默发送到master,起不到读操作的负载均衡作用)

结语

感谢社区用户 @大鹏 在遇到问题时,能够积极在社区QQ群里反馈问题,让问题走到大家的视野里。

更感谢每周问题复盘的dble研发同学,火眼金睛,串联起了同一用户陆续几天的问题片段,科学严谨,提出了猜想,使得问题真正原因得以浮出水面。

最后,大家在使用中发现有可改善点、或高频使用场景的需求时,欢迎在项目上提issue来反馈!感谢~!

0 人点赞