分布式 | dble 读写分离场景下为什么普通的读 sql 发送到了 master 实例上
作者:马莹乐
爱可生研发团队成员,负责 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的介绍文档中是这样的:
当前复盘以上信息,此场景下可供怀疑的点为:
- 从节点是否心跳不正常,
show @@heartbeat;
看一看 - 主从复制状态是否正常的,可在slave实例上直接下发
show slave status
查看主从复制状态是否正常 - 查看主从复制的延迟时间是否超过阈值,可参考
show slave status
的Seconds_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)
- 先断定一下在对应版本的dble纯读写分离场景下,sql发主是否符合当前预期,具体可以参考官方文档和Q&A
- 确定实属应该发从,但是却发了主的,可以看下心跳状态是否正常,(根据本次问题,我们除了观测
show @@heartbeat
外,最好还是看一下dble.log是否存在其他问题) - 当使用的心跳sql是
show slave status
时,需要考虑2点:- 有没有开启配置延迟检测参数,有延迟相关的参数时,当主从复制延迟超过阈值后,读sql发主实例是符合预期的
- 可能是
show slave status;
的结果返回不符合预期(大概率是复制状态异常)
- 如果使用了最新发版的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 实例上相关推荐
- 深入理解分布式技术 - 读写分离场景及注意事项解读
文章目录 Target:读多写少场景 主从复制 binlog 日志 binlog 有三种格式 (Statement.Row 及 Mixed) Statement 格式,基于 SQL 语句的复制 Row ...
- SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表
读写分离:为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务器,主要进行读的操作. 目前有多种方式实现读写分 ...
- 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 ...
- windows mysql读写分离_windows下的MySql实现读写分离
MySql读写分离 1.删除系统服务 sc delete 服务名 2.复制安装好的3380文件夹到3381 3.进入3381\logs目录下将所有文件删除 4.进入3381\data目录,将所有的lo ...
- thinkphp mysql读写分离_ThinkPHP5分布式数据库读写分离
项目想要数据库读写分离,需要配置两个方面,一个是数据库配置,另一个是ThinkPHP5配置,前面写过一篇关于MySQL读写分离配置的文章MySQL主从同步及读写分离,这篇介绍ThinkPHP5里怎么运 ...
- MySQL8高级_读写分离和分库分表
MySQL8高级_读写分离和分库分表 第01章 高性能架构模式 互联网业务兴起之后,海量用户加上海量数据的特点,单个数据库服务器已经难以满足业务需要,必须考虑数据库集群的方式来提升性能.高性能数据库集 ...
- 【Redis系列】深入浅出Redis主从复制之读写分离【一篇搞懂Redis复制】
由于人权问题,slave更改为了replica Redis默认采用异步复制的持久化方案(RDB),具备低延迟.高性能的特点.这是大多数Redis的自然复制模式. 主从复制(master-replica ...
- 如何进行MySQL主从复制与读写分离的配置
MySQL主从复制与读写分离 什么是读写分离? 为什么要读写分离呢? 什么时候要读写分离? 主从复制与读写分离 mysq支持的复制类型 主从复制的工作过程 MySQL主从复制延迟 MySQL主从复制实 ...
- MySQL 主从复制与读写分离
文章目录 一.概述 二.mysql复制类型 (一)STATEMENT (二)ROW (三)MIXED 三.主从复制的工过程 四.MySQL 读写分离原理 (一)常见的mysql读写分离 1.程序代码内 ...
- 简单明了!OLTP场景下的数据分布式设计原则
来自:DBAplus社群 作者介绍 温卫斌,就职于中国民生银行信息科技部,目前负责分布式技术平台设计与研发,主要关注分布式数据相关领域. 前言 最近几年做分布式项目,很多工作是关于OLTP(联机交易系 ...
最新文章
- OpenVAS漏洞扫描
- python程序实例源代码-Python 神经网络手写识别实例源码
- PyCharm的隐藏技巧(Tips)-快捷键等积累
- python基础教程【目录】
- Java中获取实体List中某时间属性离当前时间最近的实体类的某一属性
- 以交互方式安装ESXi 6.0
- 如何修改 Linkis 依赖的 Spark、Hive 版本?
- 汇川am600运动指令详解_汇川中型PLC AM400系列产品型号说明及功能介绍
- codeforces 808d
- java实现客服转接_Java微信公众平台开发(9) 关键字回复以及客服接口实现
- mysql的主从(AB)复制
- 人人都是产品经理指南:技术转产品经理,从入门到放弃
- 2020年ROS机器人操作系统用户官方调查
- 福昕pdf编辑器 android,福昕PDF编辑器
- Unity实现鼠标控制摄像机围绕中心点的旋转和缩放
- 《巴菲特法则》书中的精髓:用好巴菲特企业前景投资法则,股票投资稳赚不赔。
- 如何购买一台云服务器
- 更改csv默认分隔符
- 【C语言】斐波那契数列,依次输出1 1 2 3 5 13等前10个数
- php文件中需要声明doctype,!DOCTYPE html 声明真的很重要
热门文章
- 图片的后缀是什么意思
- 2022年全球市场HTCC陶瓷封装总体规模、主要生产商、主要地区、产品和应用细分研究报告
- 远程协助计算机是灰色的,win10远程协助,win10远程协助灰色
- 2019年下半年教师资格幼儿园《综合素质》真题与参考答案
- 兔子数列规律怎么讲_兔子繁殖问题带来的智商碾压:斐波那契数列趣谈
- 电脑cpu怎么看 怎么看cpu好坏 (全文)
- 一个简单帆软报表制作基础步骤
- Host是什么?如何设置host文件?
- html5多重阴影怎么设置,使用CSS3 box-shadow属性实现按钮的多重阴影效果
- php要学ps吗,小蚂蚁学习PS切图(3)——小练习