一文详解MySQL主从同步原理
作者:一灯架构??????? 发布时间:2024-01-24 03:00:59
1. MySQL主从同步实现方式
MySQL主从同步是基于Bin Log实现的,而Bin Log记录的是原始SQL语句。
Bin Log共有三种日志格式,可以binlog_format配置参数指定。
参数值 | 含义 |
---|---|
Statement | 记录原始SQL语句,会导致更新时间与原库不一致。 比如 update_time=now() |
Row | 记录每行数据的变化,保证了数据与原库一致,缺点是数据量较大。 |
Mixed | Statement和Row的混合模式,默认采用Statement模式,涉及日期、函数相关的时候采用Row模式,既减少了数据量,又保证了数据一致性。 |
常见的主从同步架构有一主多从、双主多从
2. MySQL主从同步的作用
读写分离,提升数据库性能
容灾恢复,主服务器不可用时,从服务器提供服务,提高可用性
冗余备份,主服务器数据损坏丢失,从服务器保留备份
一主多从架构
一般是主库负责所有读写请求,而从库只负责容灾恢复和冗余备份。
如果做了读写分离的话,主库负责写请求,从库负责读请求,可以提升数据库性能。
双主多从架构
一般是主库1负责所有读写请求,主库2不对外提供服务,只用来容灾恢复。
相比一主多从架构,双主多从架构可以减少宕机时间,更快恢复数据库可用状态。
3. 主动同步的原理
当主库数据发生变更时,写入本地Bin Log文件
从库IO线程发起dump主库Bin Log文件的请求
主库IO线程推送Bin Log文件到从库中
从库IO线程把Bin Log内容写入本地的Relay Log文件中
从库SQL线程读取Relay Log文件内容
从库SQL线程重新执行一遍SQL语句
4. 主从同步延迟问题
主从同步最常遇到的问题就是主从同步延迟,可以通过在从库上执行show slave status命令查看延迟时间,Seconds_Behind_Master表示延迟的秒数。
主从同步延迟的原因有哪些?
从库机器性能较差:
主库负责所有读写请求,从库只用来备份,会用性能较差的机器,执行时间自然较慢。
从库压力更大:
读写分离后,主库负责写请求,从库负责读请求。
互联网应用一般读请求更多,所以从库读压力更大,占用更多CPU资源。
网络延迟:
当主库的Bin Log文件往从库上发送时,可能产生网络延迟,也会导致从库数据跟不上。
主库有大事务:
当主库上有个大事务需要执行5分钟,把Bin Log文件发送到从库,从库至少也需要执行5分钟,所以这时候从库就出现了5分钟的延迟。
主从同步延迟的解决方案?
从库机器性能较差:
把从库换成跟主库同等规格的机器。
从库压力更大:
多搞几台从库,分担读请求压力。
网络延迟:
联系运维或者云服务提供商解决。
主库有大事务:
把大事务分割成小事务执行,大事务不但会产生从库延迟,还可能产生死锁,降低数据库并发性能,所以尽量少用大事务。
5. 如何提升主从同步性能
从库开启多线程复制
就是在主从同步的最后两步使用多线程,修改配置 slave_parallel_workers=4,代表开启4个复制线程。
修改同步模式,改为异步
主从同步共有三种复制方式:
全同步复制:
当主库执行完一个事务,并且所有从库都执行完该事务后,才给客户端返回成功。
半同步复制:
至少有一个从库执行完成后,就给客户端返回成功。
异步复制:
主库执行完后,立即返回成功,不关心从库是否执行完成。
如果对数据安全性要求没那么高,可以把同步模式改成半同步复制或者异步复制。
修改从库Bin Log配置
修改sync_binlog配置:
sync_binlog=0 ,表示写binlog不立即刷新磁盘,由系统决定什么时候刷新磁盘。
sync_binlog=1,每次写binlog都刷新磁盘,安全性高,性能差。
sync_binlog=N,写N次binlog才刷新磁盘。
从库对数据安全性要求没那么高,可以设置sync_binlog=0。
修改innodb_flush_log_at_trx_commit配置:
innodb_flush_log_at_trx_commit=0,每隔一秒钟,把事务日志刷新到磁盘。
innodb_flush_log_at_trx_commit=1,每次事务都刷新到磁盘。
innodb_flush_log_at_trx_commit=2,每次事务都不主动刷新磁盘,由系统决定什么时候刷新磁盘。
从库对数据安全性要求没那么高,可以设置innodb_flush_log_at_trx_commit=2。
知识点总结
来源:https://juejin.cn/post/7112669947477622797


猜你喜欢
- 中文如果用表单提交的话,不会出现乱码,而用ajax提交就会出现乱码,这是什么原因呢?我的理解是,我在写源码的时候,一般用记事本写,保存的时候
- View in Browser功能不生效问题安装玩view in browser插件后,在文档中点击邮件的view in browser 不
- 早就想用一个系列的文章来写AJAX,让自己头到尾理一遍,更好的掌握基础知识(昨天的面试受打击了,基础知识很重要).要是写的好,也许也可以帮助
- 本文为大家分享了python实现外卖信息管理系统的具体代码,供大家参考,具体内容如下一、需求分析 需求分析包含如下:1、问题描述 以外卖信息
- 现象:已知,连接的WIFI网络需要通过代理服务器才能连接外网,按照正常的程序无法发送邮件,而直连一个没有代理的网络【如自己的wifi热点】,
- 亲身实践安装mysql,用时居然花费了三个小时,在有那么多教程的情况下,依然在不该花费时间的路上浪费了太多时间。希望这篇文章能够帮助大家少走
- 公用表表达式简介:公用表表达式 (CTE) 可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VI
- <?php /********************************************** *&n
- 概述我们可以将此归咎于许多原因,但这肯定不仅仅是因为 PHP 生态系统缺乏适当的测试工具。在本文中,我想向您展示一个简单的设置,用于项目的基
- 在本篇文章中,我们将探讨如何使用YOLOv5车牌识别系统开发一个Web应用,以及如何创建一个车牌识别API供其他开发者使用。我们将介绍Fla
- 本文主要是讲解Spark在Windows环境是如何搭建的一、JDK的安装1、1 下载JDK首先需要安装JDK,并且将环境变量配置好,如果已经
- Python中的变量作用域一般在函数体外定义的变量成为全局变量,在函数内部定义的变量称为局部变量。全局变量所有作用域都可用,局部变量只能在本
- 很多时候,设计师们都会通过各种渠道去了解用户的需求,然而从这些渠道反馈回来的信息大部分只是用户的期望并不是真正的用户需求,但是很多时候这些期
- 前言Pillow库有很多用途,本文使用Pillow来生成随机的验证码图片。Pillow的用法参考:https://www.jb51.net/
- 前言在Django中有大量的通用类视图,例如ListView,DetailView,CreateView,UpdateView等等,将所有重
- 斐波那契记忆优化法:<script type="text/javascript">var fibonacci
- 1. 语句块:{ }之间的部分即为BLOCK语句块。2. 条件语句:if ( expression ) BLOCK;if ( e
- 前言最近参加了大创项目,题目涉及到计算机视觉,学姐发了个修正图像的博客链接,于是打算用这个题目入门OpenCV。分析问题照片中的PPT区域总
- 最近正在用功的学习jQuery,在琢磨了不少别人写的功能之后,也开始尝试着自己开发一些功能。今天我做了一个简单的密码强度测试工具。这可功能的
- 这篇文章主要介绍了python智联招聘爬虫并导入到excel代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习