一起聊聊MySQL主从延时的处理方案

本篇文章给大家带来了关于mysql中主从延时处理方案的相关知识,mysql主从复制,读写分离是互联网常见的数据库架构,该架构最令人诟病的地方就是,在数据量较大并发量较大的场景下,主从延时会比较严重。希望对大家有帮助。

一起聊聊MySQL主从延时的处理方案

为什么主从延时这么大?

18.png

答:MySQL使用单线程重放RelayLog。

应该怎么优化,缩短重放时间?

答:多线程并行重放RelayLog可以缩短时间。

多线程并行重放RelayLog有什么问题?

19.png

答:需要考虑如何分割RelayLog,才能够让多个数据库实例,多个线程并行重放RelayLog,不会出现不一致。

为什么会出现不一致?

答:如果RelayLog随机的分配给不同的重放线程,假设RelayLog中有这样三条串行的修改记录:

update account set money=100 where uid=58;

update account set money=150 where uid=58;

update account set money=200 where uid=58;

如果单线程串行重放:能保证所有从库与主库的执行序列一致。

画外音:最后money都将为200。

如果多线程随机分配重放:多重放线程并发执行这3个语句,谁最后执行是不确定的,最终从库数据可能与主库不同。

画外音:多个从库可能money为100,150,200不确定。

如何分配,多个从库多线程重放,也能得到一致的数据呢?

答:相同库上的写操作,用相同的线程来重放RelayLog;不同库上的写操作,可以并发用多个线程并发来重放RelayLog。

20.png

如何做到呢?

答:设计一个哈希算法,hash(db-name) % thread-num,库名hash之后再模上线程数,就能很轻易做到,同一个库上的写操作,被同一个重放线程串行执行。

画外音:不同库上的重放,是并行的,就起到了加速做用。

这个方案有什么不足?

答:很多公司对MySQL的使用是“单库多表”,如果是这样的话,仍然只有一个库,还是不能提高RelayLog的重放速度。

百度虚拟主播 百度虚拟主播

百度智能云平台的一站式、灵活化的虚拟主播直播解决方案

百度虚拟主播 36 查看详情 百度虚拟主播

启示:将“单库多表”的DB架构模式升级为“多库多表”的DB架构模式。

画外音:数据量大并发量大的互联网业务场景,“多库”模式还具备着其他很多优势,例如:

(1)非常方便的实例扩展:DBA很容易将不同的库扩展到不同的实例上;

(2)按照业务进行库隔离:业务解耦,进行业务隔离,减少耦合与相互影响;

(3)非常方便微服务拆分:每个服务拥有自己的实例就方便了;

“单库多表”的场景,多线程并行重放RelayLog还能怎么优化?

答:即使只有一个库,事务在主库上也是并发执行的,既然在主库上可以并行执行,在从库上也应该能够并行执行呀?

新思路:将主库上同时并行执行的事务,分为一组,编一个号,这些事务在从库上的回放可以并行执行(事务在主库上的执行都进入到prepare阶段,说明事务之间没有冲突,否则就不可能提交),没错,MySQL正是这么做的。

解法:基于GTID的并行复制。

从MySQL5.7开始,将组提交的信息存放在GTID中,使用mysqlbinlog工具,可以看到组提交内部的信息:

20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=120181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=220181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=320181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=4

21.png

和原来的日志相比,多了last_committed和sequence_number。

什么是last_committed?

答:它是事务提交时,上次事务提交的编号,如果具备相同的last_committed,说明它们在一个组内,可以并发回放执行。

总结

MySQL并行复制,缩短主从同步时延的方法,体现着这样的一些架构思想:

多线程是一种常见的缩短执行时间的方法;

画外音:例如,很多crontab可以用多线程,切分数据,并行执行。

多线程并发分派任务时,必须保证幂等性:MySQL提供了“按照库幂等”,“按照commit_id幂等”两种方式,很值得借鉴;

画外音:例如,群消息,可以按照group_id幂等;用户消息,可以按照user_id幂等。

具体到MySQL主从同步延时:

mysql5.5:不支持并行复制,大伙快升级MySQL版本;

mysql5.6:按照库并行复制,建议使用“多库”架构;

mysql5.7:按照GTID并行复制;

推荐学习:mysql视频教程

以上就是一起聊聊MySQL主从延时的处理方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/285332.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
全民K歌怎么隐藏访问记录
上一篇 2026年10月19日 09:03:02
永劫无间手游左右键振刀怎么取消 左右键振刀取消方法
下一篇 2025年11月5日 02:08:40

相关推荐

  • mysql的表名区分大小写吗

    mysql的表名区分大小写吗mysql的表名区分大小写吗mysql的表名区分大小写吗mysql的表名区分大小写吗

    mysql在linux中表名区分大小写,mysql在Windows中表名不区分大小写;可以在MySQL的配置文件“my.ini [mysqld]”中增加一行“ower_case_table_names = 参数”来设置是否区分大小写。 本教程操作环境:windows10系统、mysql8.0.22版…

    2026年10月19日 • 用户投稿
    000
  • mysql怎样查询今天的数据

    mysql怎样查询今天的数据mysql怎样查询今天的数据mysql怎样查询今天的数据mysql怎样查询今天的数据

    在mysql中,可以利用select语句配合“to_days()”和now()函数查询今天的数据,语法为“select * from 表名 where to_days(时间字段名)=to_days(now());”。 本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3…

    2026年10月19日 • 用户投稿
    000
  • mysql怎样修改用户

    mysql怎样修改用户mysql怎样修改用户mysql怎样修改用户mysql怎样修改用户

    方法:1、利用“RENAME USER”语句修改用户名,语法为“RENAME USER 旧用户名 TO 新用户名”;2、利用“SET PASSWORD”语句修改用户密码,语法为“SET PASSWORD=PASSWORD(新用户密码)”。 本教程操作环境:windows10系统、mysql8.0.2…

    2026年10月19日 • 用户投稿
    100
  • mysql怎样修改内容

    mysql怎样修改内容mysql怎样修改内容mysql怎样修改内容mysql怎样修改内容

    在mysql中,可以利用UPDATE命令修改内容,该命令用于修改或更新MySQL中的数据,利用该命令可以同时修改一个或多个内容,语法为“UPDATE 表名 SET field1=new-value1,field2=new-value2”。 本教程操作环境:windows10系统、mysql8.0.2…

    2026年10月19日 • 用户投稿
    000
  • mysql怎样查询后合并

    mysql怎样查询后合并mysql怎样查询后合并mysql怎样查询后合并mysql怎样查询后合并

    在mysql中,可以利用UNION操作符实现查询后合并结果的效果,该操作符的作用就是连接两个以上的SELECT语句的结果组合到一个结果集合中,语法为“SELECT查询语句1 UNION [ALL] SELECT查询语句2”。 本教程操作环境:windows10系统、mysql8.0.22版本、Del…

    2026年10月19日 • 用户投稿
    000
  • MySQL如何使用UNION合并结果 结果集合并的注意事项

    MySQL如何使用UNION合并结果 结果集合并的注意事项MySQL如何使用UNION合并结果 结果集合并的注意事项MySQL如何使用UNION合并结果 结果集合并的注意事项MySQL如何使用UNION合并结果 结果集合并的注意事项

    union合并结果集要求列数和数据类型匹配,union会去重而union all保留重复行,union all效率更高;使用order by和limit需在每个select内分别指定,最后再整体排序;数据类型不匹配时应使用cast函数显式转换。1. 列数和数据类型必须一致;2. union自动去重,…

    2026年10月19日 • 用户投稿
    000
  • 带你搞懂MySQL字符集和比较规则

    带你搞懂MySQL字符集和比较规则带你搞懂MySQL字符集和比较规则带你搞懂MySQL字符集和比较规则带你搞懂MySQL字符集和比较规则

    本篇文章给大家带来了关于mysql中字符集比较的相关知识,其中包括了mysql中支持的字符集和排序规则,希望对大家有帮助。 字符集和比较规则简介 字符集简介 我们知道在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系了,建立这个关系最起码要搞清楚两件事儿: 你要…

    2026年10月19日 • 用户投稿
    000
  • 一起聊聊MySQL基础之触发器和事件

    一起聊聊MySQL基础之触发器和事件一起聊聊MySQL基础之触发器和事件一起聊聊MySQL基础之触发器和事件一起聊聊MySQL基础之触发器和事件

    本篇文章给大家带来了关于mysql中触发器和事件的相关知识,其中包括触发器使用注意事项、查看和删除事件、事件使用注意事项等等,希望对大家有帮助。 触发器 我们使用MySQL的过程中可能会有下边这些需求: 在向t1表插入或更新数据之前对自动对数据进行校验,要求m1列的值必须在1~10之间,校验规则如下…

    2026年10月19日 • 用户投稿
    100
  • mysql存储过程中怎么给变量赋值

    mysql存储过程中怎么给变量赋值mysql存储过程中怎么给变量赋值mysql存储过程中怎么给变量赋值mysql存储过程中怎么给变量赋值

    mysql存储过程中给变量赋值的方法:1、利用DECLARE关键字,语法“DECLARE 变量名 类型 DEFAULT 默认值;”;2、利用SET关键字,语法“SET 变量名 = 赋值表达式;”。 本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。 在mysql的存储过程和…

    2026年10月19日 • 用户投稿
    000
  • mysql存储过程的游标是什么

    mysql存储过程的游标是什么mysql存储过程的游标是什么mysql存储过程的游标是什么mysql存储过程的游标是什么

    在mysql存储过程中,游标也称为光标,是一个存储在DBMS服务器上的数据库查询,是检索操作返回一组结果集,一般用于对检索出来的数据进行前进或者后退操作。 本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。 在 MySQL 中,存储过程或函数中的查询有时会返回多条记录,而使…

    2026年10月19日 • 用户投稿
    200
  • thinkphp如何使用

    thinkphp如何使用thinkphp如何使用thinkphp如何使用thinkphp如何使用

    ThinkPHP 是一款 PHP MVC 框架,用于开发 Web 应用。使用步骤包括:安装 ThinkPHP、配置数据库、定义模型、定义控制器、定义视图、设置路由和运行。具体步骤为:1. 安装 ThinkPHP;2. 配置数据库;3. 定义模型;4. 定义控制器;5. 定义视图;6. 设置路由;7.…

    2026年10月19日 • 用户投稿
    100
  • 怎么查询mysql的字符集

    怎么查询mysql的字符集怎么查询mysql的字符集怎么查询mysql的字符集怎么查询mysql的字符集

    方法:1、“show charset”语句,查看MYSQL所支持的字符集;2、“show create database 库名G”语句,查看库的字符集;3、“show full columns from 表名”,查看表中所有列的字符集。 本教程操作环境:windows7系统、mysql8版本、Del…

    2026年10月19日 • 用户投稿
    100
  • mysql查询结果怎么合并

    mysql查询结果怎么合并mysql查询结果怎么合并mysql查询结果怎么合并mysql查询结果怎么合并

    在mysql中,可以利用UNION操作符来合并查询结果,该操作符用于将两个以上的SELECT语句的查询结果合并到一起,然后去除掉相同的记录;语法“查询语句1 union 查询语句2 union ….”。 本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。 在my…

    2026年10月19日 • 用户投稿
    100
  • mysql怎么将查询结果赋给变量

    mysql怎么将查询结果赋给变量mysql怎么将查询结果赋给变量mysql怎么将查询结果赋给变量mysql怎么将查询结果赋给变量

    mysql将查询结果赋给变量的方法:1、使用“DECLARE 变量名 类型 [DEFAULT 默认值];”语句创建变量;2、使用“SELECT 字段名 INTO 变量名 FROM 表名 WEHRE 查询条件;”语句将查询结果赋值给变量。 本教程操作环境:windows7系统、mysql8版本、Del…

    2026年10月19日 • 用户投稿
    100
  • 读完搞懂MySQL持久化和回滚(图文详解)

    读完搞懂MySQL持久化和回滚(图文详解)读完搞懂MySQL持久化和回滚(图文详解)读完搞懂MySQL持久化和回滚(图文详解)读完搞懂MySQL持久化和回滚(图文详解)

    本篇文章给大家带来了mysql中关于持久化和回滚的相关知识,希望对大家有帮助。 redo log 事务的支持是数据库区分文件系统的重要特征之一,事务的四大特性: 原子性:所有的操作要么都做,要么都不做,不可分割。一致性:数据库从一种状态变成另一种状态的的结果最终是一致的,比如A给B转账500,A最终…

    2026年10月19日 • 用户投稿
    200
  • mysql中的事务是什么

    mysql中的事务是什么mysql中的事务是什么mysql中的事务是什么mysql中的事务是什么

    在mysql中,事务是一种机制、一个操作序列,是访问和更新数据库的程序执行单元。事务中包含一个或多个数据库操作命令,会把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。 本教程操作环境:windows7系统、mysql5.6版本、Dell G3电脑。 …

    2026年10月19日 • 用户投稿
    300
  • workerman手册

    workerman手册workerman手册workerman手册workerman手册

    Workerman是一个异步事件驱动框架,用于开发高性能网络应用。其特点包括高性能、低内存消耗、易于使用和可扩展。它广泛应用于即时通讯、WebSocket服务、高并发HTTP服务等场景。使用时可创建Worker类,并调用run()函数运行Worker。Workerman提供了丰富的API,包括Wor…

    2026年10月19日 • 用户投稿
    000
  • mysql怎么修改事务隔离级别

    mysql怎么修改事务隔离级别mysql怎么修改事务隔离级别mysql怎么修改事务隔离级别mysql怎么修改事务隔离级别

    修改方法:1、在命令窗口中执行“set session transaction isolation level 事务级别;”语句即可;2、打开“mysql.ini”文件,添加“transaction-isolation=事务级别”语句即可。 本教程操作环境:windows7系统、mysql8版本、D…

    2026年10月19日 • 用户投稿
    100
  • mysql怎么查询事务隔离级别

    mysql怎么查询事务隔离级别mysql怎么查询事务隔离级别mysql怎么查询事务隔离级别mysql怎么查询事务隔离级别

    mysql查询事务隔离级别的方法:1、启动命令行窗口,连接MySQL数据库;2、在命令窗口中执行“show variables like ‘tx_isolation’;”或“SELECT @@tx_isolation;”命令即可查询。 本教程操作环境:windows7系统、m…

    2026年10月19日 • 用户投稿
    400
  • mysql where关键字怎么用

    mysql where关键字怎么用mysql where关键字怎么用mysql where关键字怎么用mysql where关键字怎么用

    在mysql中,where关键字需要和SELECT语句一起使用,用于指定查询条件,即有条件的从数据表中查询并返回数据;语法“SELECT {*|字段列名} FROM 数据表名 WHERE 查询条件;”。 本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。 MySQL WHE…

    2026年10月19日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信