一、前言

今天的这篇文章感觉有点难理解,最近这几篇其实都不太好理解。先整理自己的思路让自己更加好理解点~

二、正文

2.1.当下的主从架构都有哪两种?区别是什么?优缺点是什么?

  • 1)客户端至连、2)proxy代理

  • 第一种方式需要将连接信息放在客户端的链接层,客户端来选择后段数据库进行查询。第二种方式客户端只连接proxy,由proxy根据请求类型和上下文决定请求的分发路由。

  • 第一种优点:查询性能好;缺点:在主备切换和库迁移等操作时候客户端需要感知调整连接信息【一般会有一个zk组件来管理后端】。第二种优点:客户端不需要关注后端工作;缺点:结构复杂。

2.2.针对于“过期读”的解决方案有哪六种方案?

  1. 强制读主库方案

  2. Sleep方案

  3. 判断主从无延迟方案

  4. 配合semi-sync方案

  5. 等主库位点方案

  6. 等GTID方案

2.3.什么时候会强制读主库?

  • 金融场景较多。

2.4.Sleep方案查询命令是什么?弊端是什么?

  • select sleep(1)。弊端是略陋,等1秒这个事情随着业务的增产是在变化的。

2.5.主从无延迟有哪三种做法?每种的缺点是什么?

  • 通过show slave status判断seconds_behind_master是否为0。秒级别,精确度不高。

  • 通过show slave status中读到的主库最新位点信息[Read_Master_Log_Pos]和备库执行的最新位点信息[Exec_Master_Log_Pos]是否一致来判断。

  • 通过show slave status中auto_position=1和备库收到的所有日志的GTID集合[Retrieved_Gtid_Set]和执行的所有GTID集合[Executed_Gtid_Set]是否一致。通过位点和GTID方式相对于seconds_behind_master精确度较高,因为是单个事务级别的精确度,做不到完全精度。

2.5.1.上述主备无延迟的判断依据是什么?为什么通过位点的方式来判断主从无延迟做不到完全精度(从binlog的主备之间的执行状态描述)?

  • 备库收到的日志都执行完成。

  • 一个事务的 binlog 在主备库之间需要经过三步:1)主库执行完成,写入binlog,反馈给客户端。2)备库接受主库发送的binlog。3)备库执行完成binlog。原因就是:其中在第1步执行完后,就有一个查询请求导致备库没有还没有同步过来binlog。--如何解决?就是配合semi-sync方案

2.6.semi-sync replication是什么意思? 如何解决的主库和备库由于主从延迟造成的binlog堆积?这种方案的问题是什么?如何解决

  • 半同步复制。

  • 1)主库接执行完命令后写入binlog后,发送binlog给备库。2)备库接受到binlog后,告诉主库自己接受到了。3)主库接受到ack后返回给客户端事务执行完成。PS:同TCP三次握手原理。

  • 两个问题:1)仅支持一主一备的情况。当有一主多从时其中有一个从库ack后,另外的从库没有确认这时有查询请求过来会出现过期读。2)在持续延迟的情况下,可能出现过度等待的问题。比如:主库更新快导致两个位点的判断一直不准确,即relay log中始终比binlog多出一个日志,所以此时查询请求就一直处于阻塞(如下图)。

  • 通过等主库位点和等GTID方案。

2.7.等主库位点的命令是什么?在什么地方执行?返回结果的含义?如何选定命令中的pos[位置?这个方案有什么问题?

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

  • 从库执行

  • 四种情况:1)正常返回M,表示从命令开始执行,到应用完主库 file 和 pos 表示的 binlog 位置,执行了多少事务。2)如果执行期间,备库同步线程发生异常,则返回 NULL。3)等待超过timeout描述返回-1。4)如果刚开始执行的时候,就发现已经执行过这个位置了,则返回 0。

  • 1)trx1 事务更新完成后,马上执行 show master status 得到当前主库执行到的 File 和 Position;2)选定一个从库执行查询语句;3)在从库上执行 select master_pos_wait(File, Position, 1);4)如果返回值是 >=0 的正整数,则在这个从库执行查询语句;5)否则,到主库执行查询语句。

  • 一旦在timeout时间之后就会有请求到主库,给主库造成压力

2.8.等GTID的命令是什么?返回结果的含义是什么?比上一种好在什么地方?如何选定命令中的gtid_set?这个方案有什么问题?

  • select wait_for_executed_gtid_set(gtid_set, 1);

  • 等待,直到这个库执行的事务中包含传入的 gtid_set,返回 0;超时返回 1。

  • 无需在主库上执行 show master status

  • 1)trx1 事务更新完成后,从返回包直接获取这个事务的 GTID,记为 gtid1【⭐️:如何在事务执行完带上gtid?将参数 session_track_gtids 设置为 OWN_GTID,然后通过 API 接口 mysql_session_track_get_first 从返回包解析出 GTID 的值即可】;2)选定一个从库执行查询语句;3)在从库上执行 select wait_for_executed_gtid_set(gtid1, 1);4)如果返回值是 0,则在这个从库执行查询语句;5)否则,到主库执行查询语句。

  • 问题同上

三、评论专区

3.1.MySQL 是怎么快速定位 binlog 里面的某一个 GTID 位置的?

答案是,在 binlog 文件头部的 Previous_gtids 可以解决这个问题。

3.2.sql_slave_skip_counter 跳过的是一个 event,还是一个事务?

答:由于 MySQL 总不能执行一半的事务,所以既然跳过了一个 event,就会跳到这个事务的末尾,因此 set global sql_slave_skip_counter=1;start slave 是可以跳过整个事务的

四、课后题

当采用等 GTID 的方案,现在你要对主库的一张大表做 DDL,可能会出现什么情况呢?为了避免这种情况,你会怎么做呢?

答:这条语句在主库上要执行 10 分钟,提交后传到备库就要 10 分钟(典型的大事务)。那么,在主库 DDL 之后再提交的事务的 GTID,去备库查的时候,就会等 10 分钟才出现。这样,这个读写分离机制在这 10 分钟之内都会超时,然后走主库。这种预期内的操作,应该在业务低峰期的时候,确保主库能够支持所有业务查询,然后把读请求都切到主库,再在主库上做 DDL。等备库延迟追上以后,再把读请求切回备库。

28 | MySQL读写分离之主从延迟解决方案(主从延迟问题有救了)相关推荐

  1. 解决Mysql读写分离数据延迟

    MySQL的主从同步机制非常方便的解决了高并发读的应用需求,给Web方面开发带来了极大的便利.但这种方式有个比较大的缺陷在于MySQL的同步机制是依赖Slave主动向Master发请求来获取数据的,而 ...

  2. 项目性能优化(MySQL读写分离、MySQL主从同步、Django实现MySQL读写分离)

    当项目中数据库表越来越多,数据量也逐渐增多时,需要做数据库的安全和性能的优化.对于数据库的优化,可以选择使用MySQL读写分离实现. 1.MySQL主从同步 1.主从同步机制 1.1.主从同步介绍和优 ...

  3. mysql主主备份_MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离

    一.MySQL主从备份 为保证数据库的安全和效率,可以使用主从备份,当有写的操作可以在主服务器上操作,操作完之后备份到从服务器上,当有读操作时可以访问从服务器,这样在一定程度上保证了数据库的安全,当主 ...

  4. docker二进制安装mysql_Docker搭建MySQL读写分离主从模式 分布式数据库中间件Mycat分库分表应用...

    一.MySQL读写分离主从模式 1. 下载镜像 docker pull mysql 当前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Communi ...

  5. Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从

    Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从 参考文章: (1)Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从 (2)https://ww ...

  6. mysql备份-a是什么_MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离

    一.MYSQL主从备份 为保证数据库的安全和效率,可以使用主从备份,当有写的操作可以在主服务器上操作,操作完之后备份到从服务器上,当有读操作时可以访问从服务器,这样在一定程度上保证了数据库的安全,当主 ...

  7. MySQL的主从配置+SpringBoot的MySQL读写分离配置

    MySQL的主从复制 点击前往查看MySQL的安装 1.主库操作 vim /etc/my.cnf 添加如下配置 log-bin=mysql-bin #[必须]启用二进制日志 server-id=128 ...

  8. mysql 读写分离缺点6_6\MySQL 主从同步 , MySQL 读写分离 , MySQL 性能调优

    6\MySQL 主从同步 , MySQL 读写分离 , MySQL 性能调优 day06 一,mysql 主从同步 二,数据读写分离 三,MySQL 优化 ++++++++++++++++++++++ ...

  9. Linux企业运维 6.6 -- Redis部署及主从切换、Redis+Mysql读写分离

    目录 Redis简介 redis的编译.安装 1.server1的redis配置 2.server2的redis安装 3.server3配置redis 三.redis主从复制 四.Sentine主从自 ...

最新文章

  1. easyui 如何为标签动态追加属性实现渲染效果
  2. java mysql 事物_java基础之MySQL事务和视图
  3. 揭秘 RocketMQ 新特性以及在金融场景下的实践
  4. C#LeetCode刷题之#628-三个数的最大乘积( Maximum Product of Three Numbers)
  5. ssms安装_SQLServer 2019下载及安装教程
  6. Unity开发《一起来捉妖》教程 | 3.随机妖怪位置及旋转提示
  7. C语言第五次博客作业---函数
  8. mysql常量求和_Mysql之:count(*)、count(常量)、count(字段)的区别
  9. 简约记账系统基于android,基于Android平台的记账系统的设计与实现
  10. t470换屏线_硬件笔记之Thinkpad T470P更换2K屏幕
  11. 外贸软件供应链中供应商管理解决方案
  12. linux查看数据库实例名端口号,查看数据库tns配置
  13. 为什么微信无法打开html文件,微信网页版打不开怎么办?微信网页版无法打开的解决方法...
  14. Centos里tftp服务器的安装和配置
  15. AutoCAD快速入门(二十九):视口
  16. 大数据——DBT:dbt的数据质量监控插件re_data二次开发及编译(生产环境篇)
  17. hsv白色h值是多少_rgb颜色模型与hsv颜色模型的理解
  18. 计算机教师专业发展规划,信息技术教师个人成长计划
  19. 基于用户体验的手机产品交互设计原则
  20. win10下C盘分区扩容后, 系统不显示新增磁盘空间的处理办法

热门文章

  1. 性能测试--RoadRunner 2 Controller
  2. thinkphp mysql读写分离_ThinkPHP5分布式数据库读写分离
  3. StarUML 序列图建模
  4. 动态修改浏览器图标和标题
  5. Linux中git保存用户名密码
  6. 13/14周练习解析
  7. 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
  8. Scrapy框架流程图详解
  9. selenium测试浏览器指纹
  10. 笔记本使用久了键盘脏东西怎么清理?笔记本电脑如何清洁键盘?