广告
返回顶部
首页 > 资讯 > 数据库 >分享MySQL 主从延迟与读写分离的七种解决方案
  • 303
分享到

分享MySQL 主从延迟与读写分离的七种解决方案

2024-04-02 19:04:59 303人浏览 泡泡鱼
摘要

目录一、强制走主库二、从库延迟查询三、判断主从是否延迟?决定选主库还是从库1.针对这个问题,有什么解决方案?四、从库节点判断主库位点五、比较 GTID六、引入缓存中间件七、数据分片1

前言:

我们都知道互联网数据有个特性,大部分场景都是 读多写少,比如:微博、微信、淘宝电商,按照 二八原则,读流量占比甚至能达到 90%。

结合这个特性,我们对底层的数据库架构也会做相应调整。采用 读写分离。

处理过程:

  • 客户端会集成 SDK,每次执行 sql 时,会判断是 写 或 读 操作。
  • 如果是 写 SQL,请求会发到 主库。
  • 主数据库执行SQL,事务提交后,会生成 binlog ,并同步给 从库。
  • 从库 通过 SQL 线程回放 binlog ,并在从库表中生成相应数据。
  • 如果是 读 SQL,请求会通过 负载均衡 策略,挑选一个 从库 处理用户请求。

看似非常合理,细想却不是那么回事。

主库 与 从库 是采用异步复制数据,如果这两者之间数据还没有同步怎么办?

主库刚写完数据,从库还没来得及拉取最新数据,读 请求就来了,给用户的感觉,数据丢了?

针对这个问题,今天,我们就来探讨下有什么解决方案?

一、强制走主库

针对不用的业务诉求,区别性对待。

场景一:

如果是对数据的 实时性 要求不是很高,比如:大V有千万粉丝,发布一条微博,粉丝晚几秒钟收到这条信息,并不会有特别大的影响。这时,可以走 从库。

场景二:

如果对数据的 实时性 要求非常高,比如金融类业务。我们可以在客户端代码标记下,让查询强制走主库。

二、从库延迟查询

由于主从库之间数据同步需要一定的时间间隔,那么有一种策略是延迟从从库查询数据。

比如:

select sleep(1)
select * from order where order_id=11111;

在正式的业务查询时,先执行一个sleep 语句,给从库预留一定的数据同步缓冲期。

因为是采用一刀切,当面对高并发业务场景时,性能会下降的非常厉害,一般不推荐这个方案。

三、判断主从是否延迟?决定选主库还是从库

之前写过一篇文章 《京东一面:Mysql 主备延迟有哪些坑?主备切换策略 》。

有讲过 什么是主备延迟?、主备延迟的常见原因?

方案一:

在从库 执行 命令 show slave status

查看seconds_behind_master 的值,单位为秒,如果为 0,表示主备库之间无延迟。

方案二:

比较主从库的文件点位。

还是执行show slave status,响应结果里有截个关键参数。

  • Master_Log_File 读到的主库最新文件。
  • Read_Master_Log_Pos 读到的主库最新文件的坐标位置。
  • Relay_Master_Log_File 从库执行到的最新文件。
  • Exec_Master_Log_Pos 从库执行到的最新文件的坐标位置。

两两比较,上面的参数是否相等。

方案三:

比较 GTID 集合

  • Auto_Position=1 主从之间使用 GTID 协议。
  • Retrieved_Gtid_Set 从库收到的所有binlog日志的 GTID 集合。
  • Executed_Gtid_Set 从库已经执行完成的 GTID 集合。

比较 Retrieved_Gtid_Set Executed_Gtid_Set 的值是否相等。

在执行业务SQL操作时,先判断从库是否已经同步最新数据。从而决定是操作主库,还是操作从库。

缺点:

无论采用上面哪一种方案,如果主库的写操作频繁不断,那么从库的值永远跟不上主库的值,那么读流量永远是打在了主库上。

1.针对这个问题,有什么解决方案?

这个问题跟 MQ消息队列 既要求高吞吐量又要保证顺序是一样的,从全局来看确实无解,但是缩小范围就容易多了,我们可以保证一个分区内的消息有序。

回到 主从库 之间的数据同步问题,从库查询哪条记录,我们只要保证之前对应的写binglog已经同步完数据即可,可以不用管主从库的所有的事务binlog 是否同步。

问题是不是一下简单多了。

四、从库节点判断主库位点

在从库执行下面命令,返回是一个正整数 M,表示从库从参数节点开始执行了多少个事务。

select master_pos_wait(file, pos[, timeout]);
  • file 和 pos 表示主库上的文件名和位置。
  • timeout 可选, 表示这个函数最多等待 N 秒。

缺点:

master_pos_wait 返回结果无法与具体操作的数据行做关联,所以每次接收读请求时,从库还是无法确认是否已经同步数据,方案实用性不高。

五、比较 GTID

执行下面查询命令:

  • 阻塞等待,直到从库执行的事务中包含gtid_set,返回 0。
  • 超时,返回 1。
select wait_for_executed_gtid_set(gtid_set, 1);

mysql 5.7.6 版本开始,允许在执行完更新类事务后,把这个事务的 GTID 返回给客户端。具体操作,将参数session_track_gtids 设置为OWN_GTID,调用 api 接口mysql_session_track_get_first 返回结果解析出 GTID。

处理流程:

  • 发起 写 SQL 操作,在主库成功执行后,返回这个事务的 GTID。
  • 发起 读 SQL 操作时,先在从库执行 select wait_for_executed_gtid_set (gtid_set, 1)
  • 如果返回 0,表示已经从库已经同步了数据,可以在从库执行 查询 操作。
  • 否则,在主库执行 查询 操作。

缺点:

跟上面的 master_pos_wait 类似,如果 写操作 与 读操作 没有上下文关联,那么 GTID 无法传递 。方案实用性不高。

六、引入缓存中间件

并发系统,缓存作为性能优化利器,应用广泛。我们可以考虑引入缓存作为缓冲介质。

处理过程:

  • 客户端 写 SQL ,操作主库。
  • 同步将缓存中的数据删除。
  • 当客户端读数据时,优先从缓存加载。
  • 如果 缓存中没有,会强制查询主库预热数据。

缺点:

K-V 存储,适用一些简单的查询条件场景。如果复杂的查询,还是要查询从库。

七、数据分片

参考 Redis Cluster 模式, 集群网络拓扑通常是 3主 3从,主节点既负责写,也负责读。

通过水平分片,支持数据的横向扩展。由于每个节点都是独立的服务器,可以提高整体集群的吞吐量。

1.转换到数据库方面

常见的解决方式,是分库分表,每次读写都是操作主库的一个分表,从库只用来做数据备份。当主库发生故障时,主从切换,保证集群的高可用性。

到此这篇关于分享MySQL 主从延迟与读写分离的七种解决方案的文章就介绍到这了,更多相关MySQL主从延迟读写分离解决方案内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 分享MySQL 主从延迟与读写分离的七种解决方案

本文链接: https://www.lsjlt.com/news/144139.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 分享MySQL 主从延迟与读写分离的七种解决方案
    目录一、强制走主库二、从库延迟查询三、判断主从是否延迟决定选主库还是从库1.针对这个问题,有什么解决方案四、从库节点判断主库位点五、比较 GTID六、引入缓存中间件七、数据分片1.转...
    99+
    2022-11-13
  • MySQL主从延迟、读写分离问题如何解决
    本文小编为大家详细介绍“MySQL主从延迟、读写分离问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL主从延迟、读写分离问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,...
    99+
    2022-10-19
  • 如何解决MySQL中主从延迟与读写分离的问题
    小编给大家分享一下如何解决MySQL中主从延迟与读写分离的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言:我们都知道互联网数据有个特性,大部分场景都是 读...
    99+
    2023-06-29
  • MYSQL主从不同步延迟原理分析及解决方案
    1. MySQL数据库主从同步延迟原理。要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog,binl...
    99+
    2022-11-15
    MYSQL 不同步 延迟
  • mysql主从复制读写分离的配置方法详解
    一、说明 前面我们说了mysql的安装配置,mysql语句使用以及备份恢复mysql数据;本次要介绍的是mysql的主从复制,读写分离;及高可用MHA; 环境如下: master:CentOS7_x64...
    99+
    2022-10-18
  • 原来这就是大厂的MySQL主从复制及读写分离方案
    1 单机 =》集群 随着数据量的增大,读写并发的增加,系统可用性要求的提升,单机 MySQL 出现危机: 容量问题,难以扩容,考虑数据库拆分、分库分表 读写压力,QPS 过大,特别是分析类需求会影响到业务事务,考虑多机集群、主从复制 高可...
    99+
    2022-10-22
  • 关于MySQL与Golan分布式事务经典的七种解决方案
    目录1、基础理论1.1 事务1.2 分布式事务2、分布式事务的解决方案2.1 两阶段提交/XA2.2 SAGA2.3 TCC2.4 本地消息表2.5 事务消息2.6 最大努力通知2....
    99+
    2022-11-12
  • Swoole和Workerman对PHP与MySQL的主从复制和读写分离的优化方法
    摘要:随着Web应用程序的日益复杂和用户规模的不断增长,对数据库性能的需求也越来越高。在PHP应用程序中,主从复制和读写分离是常用的数据库优化技术。本文将介绍如何使用Swoole和Workerman框架来实现这些技术,同时提供具体的代码示例...
    99+
    2023-10-21
    swoole 优化方法 Workerman
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作