读写分离有哪些坑?

读写分离存在的问题,主要是从库不可避免存在同步延迟,导致客户端在从库读取到旧数据。

读写分离架构

读写分离主要目的时分摊主库的压力。

上面的结构是client主动选择后端数据库。

还有一种结构是带Proxy的读写分离架构

客户端直连和带proxy读写分离架构的优缺点

  1. 客户端直连结构简单,相比proxy少了一层转发,性能好一点。缺点是clent和后端架构耦合严重,比如主备切换,库迁移都需要调整客户端。

  2. 带proxy的架构,相当于是hold住了后端的所有细节。对技术要求高,比如要求proxy高可用

过期读的问题

由于主从延迟的问题,从库的读取到的结果可能是旧的。

有几种方案可以解决:

  1. 强制走主库方案;
  2. sleep 方案;
  3. 判断主备无延迟方案;
  4. 配合 semi-sync 方案;
  5. 等主库位点方案;等 GTID 方案。

强制走主库

对请求做分类,将需要马上拿到最新结果的查询放到主库查询,其他请求放到从库执行。

Sleep方案

从库查询前执行前执行一次Sleep(1)。感觉不太靠谱

判断主备无延迟方案

  1. show slave status 查看seconds_behind_master ,判断seconds_bebind_master是否为0,为0就读从库。

  2. 对比位点

主库:Master_Log_File,Read_Master_Log_Pos

从库:Relay_Master_Log_File, Exec_Master_Log_Pos

只要主库和从库上面两组值相同,表示接受到的日志已经完全同步完成。

  1. 对比GTID集合

  2. Auto_Position=1 ,表示这对主备关系使用了 GTID 协议。

  3. Retrieved_Gtid_Set,是备库收到的所有日志的 GTID 集合;

  4. Executed_Gtid_Set,是备库所有已经执行完成的 GTID 集合。

如果Retrieved_Gtid_Set = Executed_Gtid_Set 表示备库接受到的日志都已经同步完成。

GTID 集合表示的是从库上已经收到的事务日志,对于主库已经执行完成,给客户端确认,但是还没通过binlog发给从库执行,这部分内容如果客户端到从库读取会发现还没同步到从库的

配合semi-sync

半同步确认指的是主库提交binlog后,要等至少一个从库确认收到了确认才会给客户端确认。

开启semi-sync 配置前面的对比位点或对比gtid集合,就能保证从库不会出现过期读。但是只适合一主一从的架构,如果有多个从库,由于半同步是只要一个从库有确认,就给客户端确认,那么其他没有得到确认的从库还是会出现过期读。

到这里,我们小结一下,semi-sync 配合判断主备无延迟的方案,存在两个问题:

  1. 一主多从的时候,在某些从库执行查询请求会存在过期读的现象;
  2. 在持续延迟的情况下,可能出现过度等待的问题。

等主库位点方案

select master_pos_wait(file, pos[, timeout]);

上面这条命令是在从库执行,表示在timeout时间内,等主库binlog文件file执行到pos位置返回执行了多少事务,如果是>=0 表示pos已经被执行了,超时则返回-1.

利用上面这个命令,我们有了等主库位点方案

  1. 执行完事务后,马上执行show master status, 得到主库执行到的File和Position
  2. 在从库执行select master_pos_wait(file, position, 1);
  3. 如果上面的语句返回时大于等于0,就在这个从库执行查询语句
  4. 否则到主库查询。

这个方案有个缺点就是,如果从库等主库位点都超时了,主库要做限流策略

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 如何解决主从分离带来的过期读问题的更多相关文章

  1. Mysql主从分离介绍及实现

    参考: http://www.cnblogs.com/panxuejun/p/5887118.html https://www.cnblogs.com/alvin_xp/p/4162249.html ...

  2. Mysql数据库进阶之(分表分库,主从分离)

    前言:数据库的优化是一个程序员的分水岭,作为小白我也得去提前学习这方面的数据的 (一)  三范式和逆范式 听起范式这个迟非常专业我来举个简单的栗子: 第一范式就是:  把能够关联的每条数据都拆分成一个 ...

  3. mysql数据库的主从同步,实现读写分离 g

    https://blog.csdn.net/qq_15092079/article/details/81672920 前言 1 分别在两台centos 7系统上安装mysql 5.7 2 master ...

  4. mysql数据库的主从同步,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库连接操作,数据库必然会崩溃,特别 ...

  5. SSM 配合 Mysql 数据库和代码数据源主从分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...

  6. MySQL数据库主从分离的配置方法

    1.介绍 MySQL数据库设置读写分离,可以使对数据库的写操作和读操作在不同服务器上执行,提高并发量和响应速度.现在的网站一般大点的,都采用有数据库主从分离.读写分离,既起到备份作用也可以减轻数据库的 ...

  7. laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题

    在Model里面加上下面这句,强制读主(写)库数据库,解决主从延迟问题. public static function boot() { //清空从连接,会自动使用主连接 DB::connection ...

  8. MySQL的主从分离基本配置

    1.介绍 MySQL数据库设置读写分离,可以使对数据库的写操作和读操作在不同服务器上执行,提高并发量和响应速度.现在的网站一般大点的,都采用有数据库主从分离.读写分离,既起到备份作用也可以减轻数据库的 ...

  9. 解决mysql开启GTID主从同步出现1236错误问题【转】

    最近遇到mysql开启gtid做复制时,从库出现1236错误,导致同步无法进行,本文就这问题记录下处理步骤,有关gtid知识在这里不做介绍,mysql版本为5.7.16. 一.错误原因分析 错误信息如 ...

  10. 解决mysql开启GTID主从同步出现1236错误问题

    解决mysql开启GTID主从同步出现1236错误问题     最近遇到mysql开启gtid做复制时,从库出现1236错误,导致同步无法进行,本文就这问题记录下处理步骤,有关gtid知识在这里不做介 ...

随机推荐

  1. 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 ...

  2. 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上面注册: 解决方 ...

  3. 前端开发系列122-进阶篇之Floating point addition

    本文简单说明 JavaScript 中常见的进制转换函数以及浮点数计算的注意点. 如何把任意进制的数据转换为十进制? 假设我们有二进制数据110,如果要把该数据转换为十进制数据可以参考下面的处理过程. ...

  4. AE 制作 音乐频谱

    简介 RT 参考链接 https://www.bilibili.com/video/BV1Xz4y197qP?from=search&seid=15972112592919808236

  5. GAMES101 作业1 基础版 答案

    简介 GAME101作业1的答案,基础版本,仅供参考,一直认为,没有标准版本和评级版本的作业没有必要做.所以希望分享我的观点. 问题 实现 MVP中的M和P矩阵的构建. get_model_matri ...

  6. SciTech-Mathmatics-Probability+Statistics-VIII-Statistics:Quantifing Uncertainty+ANOCOVA(ANalysis of COVAriance)协方差分析原理

    SciTech-Mathmatics-Probability+Statistics-VIII-Statistics:Quantifing Uncertainty ANOCOVA(ANalysis Of ...

  7. 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 ...

  8. 题解:Addition Chains

    洛谷同步链接 题目传送门(洛谷) 题目传送门(UVA) 前置知识:迭代加深搜索 定义 迭代加深是一种 每次限制搜索深度的 深度优先搜索.--OI Wiki 简单而言,就是一种限制搜索深度的DFS.有什 ...

  9. win10 2004使用打印机提示应用被阻止的解决方法

    有深度win10专业版2004系统版本用户反馈说,在电脑上使用打印机出现用户账户控制,应用被阻止的问题,其实这是脱机情况,一般是未连接打印机所致.我们首先检查打印机是否通电正常连接,如果是网络打印机, ...

  10. Win10纯净版软件闪退无法运行的问题

    最近不少雨林木风官网用户在使用Win10电脑的时候都遇到了这么一个问题,在运行某些软件的时候,程序直接闪退无法正常的额运行 ,遇到这种问题我们具体应该怎么解决呢?下面小编就带着大家一起看看吧! Win ...