MySQL 入门(5):复制
摘要
在这篇文章中,我将从MySQL为什么需要主从复制开始讲起,然后会提到MySQL复制的前提,bin log
。
在这里会说明三种格式的bin log
分别会有什么优缺点。
随后会讲到主从延迟方面的问题,我将从几个角度出发,提供一些可能造成延迟的思路。
1 为什么需要复制
MySQL内建的复制功能是构建大型,高性能应用程序的基础。随着目前并发量的增加,单机的MySQL渐渐没有办法承担这些请求,所以MySQL服务器也需要进行扩展。
MySQL的复制功能不仅可以提高可用性,还能用作灾备,数据仓库等。
2 如何复制
说到复制,那么问题的关键就在于数据从主库复制到从库时间需要多少,准确度能有多高。
对于MySQL来说,复制使用的是bin log
。
对于bin log
相信你不会陌生,我们在聊到MySQL的“两阶段提交”的时候有说到这个。
也就是说,MySQL会将主库记录的bin log
发送到从库中,然后从库按照bin log
的内容,“重放一遍”主库执行过的操作,达到主从同步的目的。
在这里我们先详细说一说bin log
记录了什么。
2.1 SBR(statement-based replication)
在这种模式下,bin log
会完整的记录下所执行的SQL语句。也就是说,如果使用了statement
格式的bin log
的话,主库执行的SQL语句就会在从库中完整的再执行一遍。
可是,这样的做法,是有可能导致主从不一致的。
例如下面这样的语句:
delete from t where a >= 1 and b => 2 limit 1;
这样的语句在从库中就不一定能够实现跟主库一样的效果。因为我们不能够确定在从库中是否走的跟主库是同样的索引,所查找的第一条数据,是不是跟主库一样的,也就可能删除的数据不是同一行。
又或者主库执行的SQL语句里面有一些锁相关的语句,也可能会造成主从不一致的问题。
但是要注意的是,NOW()
函数是可以被正确执行的,因为在bin log
语句中会记录时间戳。
也就是说,基于statement
模式,在上下文不同的时候,是有可能造成数据不一致的。
至于其他的不安全情况,可以参考官方文档,这里不展开介绍。
2.2 RBR(row-based replication)
既然statement
模式下会造成数据不一致,那么有没有一种模式是上下文无关的呢?
所以就有了row
模式。
在这个模式中,bin log
中只记录了所操作的行的修改情况,会精确到某一行。
比如你更新了某一行,在bin log
中就会记录在id等于多少多少,某某字段等于多少多少的行中,将某个字段的值从A改成了B。
甚至是删除操作,都会记录删除了id等于多少,A字段等于多少,B字段等于多少的一行数据。
听到这里你可能会觉得很方便,也很精确,主从不再会发生不一致的情况了。甚至于删库了都不需要跑路了,只需要查看bin log
就能恢复相应的数据了。
但是使用row
模式同样会有一些问题。比如你在主库执行了delete from t where id < 10000
这么一行sql语句,如果使用statement
格式,在bin log
内记录只有这么一条,但是如果你使用的是row
模式,那么就需要记录10000条数据,占用很大的空间。
2.3 MBR(mixd-based replication)
于是就有了mixd
模式。
混合了以上两种模式的优点,MySQL会在没有歧义的时候使用statement
格式,在有歧义的时候使用row
格式。
3 复制的具体过程
上面介绍了bin log
的作用,以及bin log
的组成形式,在这一章中我们聊一聊整个的复制流程。
我们拿《高性能MySQL》中的图来解释:
这里涉及到了有三个线程:
Binlog dump thread
这个线程在MySQL主库中,负责读取bin log
中的内容,并将这些内容推送到从库IO进程中。I/O thread
这个线程在MySQL从库中,负责跟主库建立一条长连接,并且将读取到的bin log
数据保存到从库的中继日志(relay log)中。SQL thread
这个线程也是在MySQL的从库中,负责读取中继日志中的内容,然后执行这些语句,将对数据的修改应用到从库中。
简单的来讲,就是主库经过两阶段提交后,把修改内容保存在了bin log
中,然后把这个bin log
发送给从库,让从库也执行一次,以达到同步的目的。
而这里采用了中继日志的原因是从库消费bin log
的速度和主库生产bin log
的速度是不一致的,所以需要一个中继日志作为缓冲。
4 复制可能造成的问题
在MySQL复制的过程中,经常出现的问题是延迟。
假设我们把主库一个事务提交后
bin log
落盘的时间点设为t1把从库接受到主库新事务写的
bin log
并写入relay log
的时间节点设为t2把从库执行完这个新的事务的时间节点设为t3
那么执行一条事务,从库的延迟可以认为是(t3 - t1)。
也就是说,如果我们需要分析造成主从延迟的原因,应该从两个方面考虑:传输过程,以及从库消费relay log
的速度。
4.1 网络问题
网络确实可能会造成主从延迟,比如主库或者从库的带宽打满,又或者是主库的bin log
被设置成了row
格式,导致有大量的数据需要传输,造成了主库的bin log
没有及时的同步到从库中,导致了主从的延迟。
4.2 机器性能
但是除了网络,更多的是从库的消费速度,跟不上主库的生产速度。
这方面有很多原因,比如可能从库的机器配置低于主库,因为会有人觉得既然是备库,没什么请求,就把备库配置在了比较差的机器上面。
又或者在是后台的数据分析,将CPU打满。
总之,如果在从库中需要有大量的查询分析操作,需要考虑多个从库。
4.3 大事务
如果主库执行了一条耗时很长的事务,那么这条事务发送到从库中,可能也需要执行这么长的时间。而这个时候,从库是没有办法继续消费新的relay log
的。这就造成了主从延迟。
4.4 锁
我们之前提到过了,不仅仅写数据会加锁,使用“当前读”,也一样可能会加锁。
所以,如果在从库上执行了一些诸如select ... for update
,或者一些DDL语句,可能也会造成从库加锁,导致主从延迟。
4.5 并发
在我们上面的介绍中,SQL线程是单线程的,所以,如果能够让SQL线程可以并发消费,那么主从延迟就可以大幅度的降低了。
关于MySQL的并发复制策略,MySQL5.6开始已经正式支持了,本文不详细解释。
写在最后
首先,谢谢你能看到这里。
这一篇的文章,其实说的内容不多,大多都是一些理论性质的内容,目的是能够对MySQL的主从复制有一些大体上的了解,并且知道对于延迟方面的问题,应该从哪个方向去考虑。
至于其他更具体的操作、如何调优,以及更深的原理,我想在今后的《进阶篇》来提到。
并且,《MySQL 入门》系列到这里就完结了。希望这五篇的内容能够给你带来一些帮助,能够让你对MySQL的了解更深一些。
当然了,在学习MySQL的过程中,我可能也会有一些错误的理解,如果有哪里是不对的,希望你能指出,谢谢你!
PS:如果有其他的问题,也可以在公众号找到我,欢迎来找我玩~
MySQL 入门(5):复制的更多相关文章
- MySQL入门笔记
MySQL入门笔记 版本选择: 5.x.20 以上版本比较稳定 一.MySQL的三种安装方式: 安装MySQL的方式常见的有三种: · rpm包形式 · 通用二进制 ...
- MySQL入门介绍(mysql-8.0.13)
MySQL入门介绍(mysql-8.0.13单机部署) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL数据库介绍 1>.MySQL是一种开放源代码的关系型数据库 ...
- MySQL入门——Linux下安装后的配置文件
MySQL入门——Linux下安装后的配置文件 摘要:本文主要了解了在Linux环境下安装MySQL后的配置文件的位置,以及如何创建配置文件. 查看配置文件的加载顺序 找到mysqld的路径 通过wh ...
- MySQL入门——在Linux下安装和卸载MySQL
MySQL入门——在Linux下安装和卸载MySQL 摘要:本文主要学习了如何在Linux系统中安装和卸载MySQL数据库. 查看有没有安装过MySQL 使用命令查看有没有安装过: [root@loc ...
- MySQL入门——在Windows下安装MySQL
MySQL入门——在Windows下安装MySQL 摘要:本文主要说明了如何下Windows环境下安装MySQL. 查看电脑上是否安装了MySQL 打开cmd窗口,输入 services.msc 命令 ...
- MySQL入门(4)——操作数据表
MySQL入门(4)--操作数据表 创建数据库 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 数据库名 [(create_definition,...)] [tab ...
- 21分钟 MySQL 入门教程(转载!!!)
21分钟 MySQL 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数 ...
- MySQL半同步复制
从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认的复制即是 ...
- MySQL入门02-MySQL二进制版本快速部署
在上篇文章 MySQL入门01-MySQL源码安装 中,我们介绍了MySQL源码安装的方法. 源码安装虽然有着更加灵活和更加优化等诸多优势.但源码编译安装部署的过程相对复杂,而且整个过程所花费的时间很 ...
随机推荐
- Asp.Net Core 3.1 学习3、Web Api 中基于JWT的token验证及Swagger使用
1.初始JWT 1.1.JWT原理 JWT(JSON Web Token)是目前最流行的跨域身份验证解决方案,他的优势就在于服务器不用存token便于分布式开发,给APP提供数据用于前后端分离的项目. ...
- MySQL主从数据库配置与原理
1.为什么要搭建主从数据库 (1)通过增加从库实现读写分离,提高系统负载能力 (2)将从库作为数据库备份库,实现数据热备份,为数据恢复提供机会 (3)根据业务将不同服务部署在不同机器同时又共享相同的数 ...
- thinkphp5.0.x
payload5.0.24 http://-----/index.php?s=index/think\app/invokefunction&function=call_user_func_ar ...
- serialize和json_encode 区别
(1)serialize主要用于php的序列化,存储到文件或者数据库中,json_encode 也是序列化,但是 主要用于与其他语言比如js进行交互使用,对于传输来说,json有许多优点. (2)在显 ...
- 数据结构入门第二课(浙大mooc)
数据结构入门第二课 目录 数据结构入门第二课 引子 多项式的表示 方法1 顺序结构表示多项式各项 方法2 顺序结构表示非零项 方法3 链表结构存储非零项 多项式问题的启示 线性表 线性表的抽象数据类型 ...
- CYQ.Data 轻量数据层之路 使用篇-MProc 存储过程与SQL 视频[最后一集] H (二十八)
2019独角兽企业重金招聘Python工程师标准>>> 说明: 本次录制主要为使用篇:CYQ.Data 轻量数据层之路 使用篇五曲 MProc 存储过程与SQL(十六) 的附加视 ...
- TypeScript 2.0 正式发布
9 月 22 日,TypeScript 2.0 正式发布了. TypeScript 是微软开发的开源的编程语言,主要负责人是 C# 之父 Anders Hejlsberg. TypeScript 成功 ...
- Struts2深入之动态调用Action
使用过Struts2的小伙伴们应该知道当我们的action的方法过多是如果需要通过Struts2框架进行运行,我们就必须在Struts2的配置文件Struts2.xml文件中配置多个action属性标 ...
- Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?
Redis 6.0.1 于 2020 年 5 月 2 日正式发布了,如 Redis 作者 antirez 所说,这是迄今为止最"企业"化的版本,也是有史以来改动最大的一个 Redi ...
- USACO Training Section 1.1黑色星期五Friday the Thirteenth
题目描述 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的一个周期,要求计算1900年1月1日至1900+N- ...