作者:马莹乐

爱可生研发团队成员,负责 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的介绍文档中是这样的:

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

  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作为心跳语句会出现如下影响:

  • 启动dble之后,日志会一直报" found MySQL master/slave Replication err
  • 当启动了读操作的负载均衡rwSplitMode为1/2/3时,读操作不能均衡到slave(其中1会有明显的报错,但配置为2,3时,读sql会默默发送到master,起不到读操作的负载均衡作用)

结语

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

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

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

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

  1. 深入理解分布式技术 - 读写分离场景及注意事项解读

    文章目录 Target:读多写少场景 主从复制 binlog 日志 binlog 有三种格式 (Statement.Row 及 Mixed) Statement 格式,基于 SQL 语句的复制 Row ...

  2. SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表

      读写分离:为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务器,主要进行读的操作.   目前有多种方式实现读写分 ...

  3. linux mysql安装 读写分离_linux下安装mysql-proxy 配置读写分离

    一.软件列表 ncurses-5.7.tar.gz wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.7.tar.gz mysql-proxy-0.8 ...

  4. windows mysql读写分离_windows下的MySql实现读写分离

    MySql读写分离 1.删除系统服务 sc delete 服务名 2.复制安装好的3380文件夹到3381 3.进入3381\logs目录下将所有文件删除 4.进入3381\data目录,将所有的lo ...

  5. thinkphp mysql读写分离_ThinkPHP5分布式数据库读写分离

    项目想要数据库读写分离,需要配置两个方面,一个是数据库配置,另一个是ThinkPHP5配置,前面写过一篇关于MySQL读写分离配置的文章MySQL主从同步及读写分离,这篇介绍ThinkPHP5里怎么运 ...

  6. MySQL8高级_读写分离和分库分表

    MySQL8高级_读写分离和分库分表 第01章 高性能架构模式 互联网业务兴起之后,海量用户加上海量数据的特点,单个数据库服务器已经难以满足业务需要,必须考虑数据库集群的方式来提升性能.高性能数据库集 ...

  7. 【Redis系列】深入浅出Redis主从复制之读写分离【一篇搞懂Redis复制】

    由于人权问题,slave更改为了replica Redis默认采用异步复制的持久化方案(RDB),具备低延迟.高性能的特点.这是大多数Redis的自然复制模式. 主从复制(master-replica ...

  8. 如何进行MySQL主从复制与读写分离的配置

    MySQL主从复制与读写分离 什么是读写分离? 为什么要读写分离呢? 什么时候要读写分离? 主从复制与读写分离 mysq支持的复制类型 主从复制的工作过程 MySQL主从复制延迟 MySQL主从复制实 ...

  9. MySQL 主从复制与读写分离

    文章目录 一.概述 二.mysql复制类型 (一)STATEMENT (二)ROW (三)MIXED 三.主从复制的工过程 四.MySQL 读写分离原理 (一)常见的mysql读写分离 1.程序代码内 ...

  10. 简单明了!OLTP场景下的数据分布式设计原则

    来自:DBAplus社群 作者介绍 温卫斌,就职于中国民生银行信息科技部,目前负责分布式技术平台设计与研发,主要关注分布式数据相关领域. 前言 最近几年做分布式项目,很多工作是关于OLTP(联机交易系 ...

最新文章

  1. 飞机为什么能飞起来?直到今天,科学家仍然没有答案
  2. 0.爬虫 urlib库讲解 urlopen()与Request()
  3. Spring boot国际化
  4. Jobs added with no trigger must be durable
  5. java并发核心知识体系精讲_JVM核心知识体系
  6. kali2.0安装搜狗输入法
  7. Java 的 List 与 Scala 的 Seq 相互转换
  8. 简析GeoServer服务的内部文件组织以及GeoServer自动化服务发布工具的开发思路
  9. 操作系统(5) 并发控制(1)线程的互斥
  10. 顺丰正式杀入外卖领域;中国移动推出 5G 消息 App;GCC 10.1 发布 | 极客头条
  11. 腾讯回应多闪弹窗事件;京东要求员工梳理亲戚同学关系;雷军董明珠十亿赌局胜负已定 | 极客头条...
  12. 计算机二级office高级应用教程,2015计算机二级Office高级应用上机试题及答案
  13. ps制作html图标素材,PS按钮图标制作
  14. M70仿真系统软件下载和使用
  15. 【WIN11】微软拼音输入法单字频率固定方法
  16. linux下批量修改文件名称
  17. java web inf_JavaWeb - 访问 WEB-INF 资源几种方式
  18. Android无法连接设备调试
  19. c语言atm程序个人总结,C语言程序设计报告(模拟ATM取款机)
  20. 最近,又有人在谈论Android的前景了!

热门文章

  1. TF-IDF入门与实例
  2. mongodb分组统计
  3. 大数据的核心价值是什么,主要表现在哪几方面?
  4. P6615 Kruskal + 构造
  5. 2022年诺贝尔物理学奖背后的故事——贝尔不等式诞生之后
  6. Linux运维学习历程-第一天-基础知识
  7. Mosquitto修改默认端口port
  8. 南京20年房价变迁史:别人在买房,你在干什么?
  9. FCC认证和3C认证区别
  10. bigWigToBedGraph格式转换