MySQL 如何解决主从分离带来的过期读问题
读写分离有哪些坑?
读写分离存在的问题,主要是从库不可避免存在同步延迟,导致客户端在从库读取到旧数据。
读写分离架构

读写分离主要目的时分摊主库的压力。
上面的结构是client主动选择后端数据库。
还有一种结构是带Proxy的读写分离架构

客户端直连和带proxy读写分离架构的优缺点
客户端直连结构简单,相比proxy少了一层转发,性能好一点。缺点是clent和后端架构耦合严重,比如主备切换,库迁移都需要调整客户端。
带proxy的架构,相当于是hold住了后端的所有细节。对技术要求高,比如要求proxy高可用
过期读的问题
由于主从延迟的问题,从库的读取到的结果可能是旧的。
有几种方案可以解决:
- 强制走主库方案;
- sleep 方案;
- 判断主备无延迟方案;
- 配合 semi-sync 方案;
- 等主库位点方案;等 GTID 方案。
强制走主库
对请求做分类,将需要马上拿到最新结果的查询放到主库查询,其他请求放到从库执行。
Sleep方案
从库查询前执行前执行一次Sleep(1)。感觉不太靠谱
判断主备无延迟方案
show slave status 查看seconds_behind_master ,判断seconds_bebind_master是否为0,为0就读从库。
对比位点

主库:Master_Log_File,Read_Master_Log_Pos
从库:Relay_Master_Log_File, Exec_Master_Log_Pos
只要主库和从库上面两组值相同,表示接受到的日志已经完全同步完成。
对比GTID集合
Auto_Position=1 ,表示这对主备关系使用了 GTID 协议。
Retrieved_Gtid_Set,是备库收到的所有日志的 GTID 集合;
Executed_Gtid_Set,是备库所有已经执行完成的 GTID 集合。
如果Retrieved_Gtid_Set = Executed_Gtid_Set 表示备库接受到的日志都已经同步完成。
GTID 集合表示的是从库上已经收到的事务日志,对于主库已经执行完成,给客户端确认,但是还没通过binlog发给从库执行,这部分内容如果客户端到从库读取会发现还没同步到从库的
配合semi-sync
半同步确认指的是主库提交binlog后,要等至少一个从库确认收到了确认才会给客户端确认。
开启semi-sync 配置前面的对比位点或对比gtid集合,就能保证从库不会出现过期读。但是只适合一主一从的架构,如果有多个从库,由于半同步是只要一个从库有确认,就给客户端确认,那么其他没有得到确认的从库还是会出现过期读。
到这里,我们小结一下,semi-sync 配合判断主备无延迟的方案,存在两个问题:
- 一主多从的时候,在某些从库执行查询请求会存在过期读的现象;
- 在持续延迟的情况下,可能出现过度等待的问题。
等主库位点方案
select master_pos_wait(file, pos[, timeout]);
上面这条命令是在从库执行,表示在timeout时间内,等主库binlog文件file执行到pos位置返回执行了多少事务,如果是>=0 表示pos已经被执行了,超时则返回-1.
利用上面这个命令,我们有了等主库位点方案
- 执行完事务后,马上执行show master status, 得到主库执行到的File和Position
- 在从库执行select master_pos_wait(file, position, 1);
- 如果上面的语句返回时大于等于0,就在这个从库执行查询语句
- 否则到主库查询。
这个方案有个缺点就是,如果从库等主库位点都超时了,主库要做限流策略
GTID方案
MySQL 5.7.6 版本开始,允许在执行完更新类事务后,把这个事务的 GTID 返回给客户端,这样等 GTID 的方案就可以减少一次查询。
客户端在从库执行
select wait_for_executed_gtid_set(gtid_set, 1);
等待,直到这个库执行的事务中包含传入的 gtid_set,返回 0;超时返回 1。
问题是,怎么能够让 MySQL 在执行事务后,返回包中带上 GTID 呢?你只需要将参数 session_track_gtids 设置为 OWN_GTID,然后通过 API 接口 mysql_session_track_get_first 从返回包解析出 GTID 的值即可。
高级用法: https://dev.mysql.com/doc/refman/5.7/en/c-api-functions.html
MySQL 如何解决主从分离带来的过期读问题的更多相关文章
- Mysql主从分离介绍及实现
参考: http://www.cnblogs.com/panxuejun/p/5887118.html https://www.cnblogs.com/alvin_xp/p/4162249.html ...
- Mysql数据库进阶之(分表分库,主从分离)
前言:数据库的优化是一个程序员的分水岭,作为小白我也得去提前学习这方面的数据的 (一) 三范式和逆范式 听起范式这个迟非常专业我来举个简单的栗子: 第一范式就是: 把能够关联的每条数据都拆分成一个 ...
- mysql数据库的主从同步,实现读写分离 g
https://blog.csdn.net/qq_15092079/article/details/81672920 前言 1 分别在两台centos 7系统上安装mysql 5.7 2 master ...
- mysql数据库的主从同步,实现读写分离
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库连接操作,数据库必然会崩溃,特别 ...
- SSM 配合 Mysql 数据库和代码数据源主从分离
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- MySQL数据库主从分离的配置方法
1.介绍 MySQL数据库设置读写分离,可以使对数据库的写操作和读操作在不同服务器上执行,提高并发量和响应速度.现在的网站一般大点的,都采用有数据库主从分离.读写分离,既起到备份作用也可以减轻数据库的 ...
- laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题
在Model里面加上下面这句,强制读主(写)库数据库,解决主从延迟问题. public static function boot() { //清空从连接,会自动使用主连接 DB::connection ...
- MySQL的主从分离基本配置
1.介绍 MySQL数据库设置读写分离,可以使对数据库的写操作和读操作在不同服务器上执行,提高并发量和响应速度.现在的网站一般大点的,都采用有数据库主从分离.读写分离,既起到备份作用也可以减轻数据库的 ...
- 解决mysql开启GTID主从同步出现1236错误问题【转】
最近遇到mysql开启gtid做复制时,从库出现1236错误,导致同步无法进行,本文就这问题记录下处理步骤,有关gtid知识在这里不做介绍,mysql版本为5.7.16. 一.错误原因分析 错误信息如 ...
- 解决mysql开启GTID主从同步出现1236错误问题
解决mysql开启GTID主从同步出现1236错误问题 最近遇到mysql开启gtid做复制时,从库出现1236错误,导致同步无法进行,本文就这问题记录下处理步骤,有关gtid知识在这里不做介 ...
随机推荐
- C# 注释 各个关键字段 使用说明
https://www.cnblogs.com/xdot/p/6632313.html#:~:text=%E5%9C%A8C%23%E6%99%BA%E8%83%BD%E6%B3%A8%E9%87%8 ...
- Atlas启动报错:Caused by: org.apache.solr.common.SolrException: Cannot connect to cluster at xxx.com:2181: cluster not found/not ready
Atlas启动时报以下错误,看情况是atlas没有在zk上找到solr注册信息:然后发现solr启动命令bin/solr start -force会默认使用内置的zk,不会往公共zk上面注册: 解决方 ...
- 前端开发系列122-进阶篇之Floating point addition
本文简单说明 JavaScript 中常见的进制转换函数以及浮点数计算的注意点. 如何把任意进制的数据转换为十进制? 假设我们有二进制数据110,如果要把该数据转换为十进制数据可以参考下面的处理过程. ...
- AE 制作 音乐频谱
简介 RT 参考链接 https://www.bilibili.com/video/BV1Xz4y197qP?from=search&seid=15972112592919808236
- GAMES101 作业1 基础版 答案
简介 GAME101作业1的答案,基础版本,仅供参考,一直认为,没有标准版本和评级版本的作业没有必要做.所以希望分享我的观点. 问题 实现 MVP中的M和P矩阵的构建. get_model_matri ...
- SciTech-Mathmatics-Probability+Statistics-VIII-Statistics:Quantifing Uncertainty+ANOCOVA(ANalysis of COVAriance)协方差分析原理
SciTech-Mathmatics-Probability+Statistics-VIII-Statistics:Quantifing Uncertainty ANOCOVA(ANalysis Of ...
- SciTech-Math-AdvancedAlgebra- Cramer' Rule (Gabriel Cramer (1704–1752)) + Gauss-Jordan Method
OPEN TEXTBOOK PROJECTS: https://sparcopen.org/our-work/open-textbook-pilot/ Grant Program for U.S. C ...
- 题解:Addition Chains
洛谷同步链接 题目传送门(洛谷) 题目传送门(UVA) 前置知识:迭代加深搜索 定义 迭代加深是一种 每次限制搜索深度的 深度优先搜索.--OI Wiki 简单而言,就是一种限制搜索深度的DFS.有什 ...
- win10 2004使用打印机提示应用被阻止的解决方法
有深度win10专业版2004系统版本用户反馈说,在电脑上使用打印机出现用户账户控制,应用被阻止的问题,其实这是脱机情况,一般是未连接打印机所致.我们首先检查打印机是否通电正常连接,如果是网络打印机, ...
- Win10纯净版软件闪退无法运行的问题
最近不少雨林木风官网用户在使用Win10电脑的时候都遇到了这么一个问题,在运行某些软件的时候,程序直接闪退无法正常的额运行 ,遇到这种问题我们具体应该怎么解决呢?下面小编就带着大家一起看看吧! Win ...