MySQL 主从复制原理

专栏持续更新中:MySQL详解

在实际生产环境中,如果对MySQL数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性,还是高并发等各个方面都是不能满足实际需求的,一般要通过数据库集群的主从复制机制来同步数据,再通过读写分离来提升数据库的并发负载能力

主从复制概念

主库对外提供数据的增删改查服务,主库中涉及到数据的修改都会写binlog

从库用来数据的同步和备份,从库通过专门的线程从主库里面的binlog(二进制日志),把主库里跟数据、权限、表结构相关的修改同步到从库里面,相当于就是主库的所有修改通过主从复制机制体现在从库上

好处是做数据备份以后,通过MySQL中间件mycat,可以实现容灾

容灾:如果主库挂了,由中间件代理mycat自动把服务的请求映射到从库,由从库继续对外提供服务,体现出了 高可用性(后端的服务允许一定的异常发生,但是后端的架构服务要可以容错,把这些异常的错误处理掉,并对外重新提供正常的服务)

读写分离概念

可以支持更大的并发,提高后端并发能力和高可用容灾,基于主从复制技术实现。我们读操作多,写操作少,主库专门处理写请求,数据的更新会记录在binlog,然后通过binlog同步到从库,客户端读数据的请求最终会转发到从库上(一主多从)

上图中的binlog,即使没有主从复制,也会写binlog,只不过主从复制就是通过binlog来复制的

主库介绍

主库master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器

从库介绍

从库专门有一个I/O线程,专门读取接收主库发过来的binlog的内容,并写到中继日志relay log,中继日志充当缓冲区,并不是把主库的binlog读过来直接执行,这样 master 就不必等待 slave 执行完成才发送下一个事件

relay log的作用: 主库的binlog的内容可能很多,而从库接收到binlog的内容,然后再执行,再去接收binlog的内容,会比较慢。可以把binlog的内容写入relay log,作为缓冲区,等待SQL线程逐条执行。这样SQL线程就不用和dump线程进行读写同步了

从库还会启一个SQL线程,专门从中继日志读取相应的操作,所有的SQL都执行一遍,这样就实现了从库内容和主库内容的同步

主从复制流程

两个log:binlog(master)、relay log(slave),三个thread:dump(master)、IO(slave)、SQL(slave)

  1. 主库的更新操作写入binlog二进制日志中(主库需要打开binlog开关)
  2. master服务器创建一个binlog转储线程,将binlog内容发送到从服务器
  3. slave执行START SLAVE命令会在从服务器创建一个IO线程,接收master的binary log复制到其中继日志(处于内存中,读写快)。 首先slave开始一个工作线程(I/O线程),I/O线程会主动连接master ,然后主库会开启dump线程,dump线程从master的binlog中读取事件并发送给slave的I/O线程,如果dump线程已经跟上master(主库上的dump线程已经把binlog的内容发完了,而且主库上binlog没有产生更多的内容),dump线程会睡眠并等待binlog产生新的事件,slave的I/O线程接收的事件写入中继日志
  4. slave的SQL线程处理该过程的最后一步,SQL线程从relay log中读取事件,并执行其中的事件更新slave的数据,使其与master的数据同步。只要SQL线程与I/O线程保持一致,中继日志通常会位于os缓存中,所以中继日志的开销很小

主从复制效果展示

我们把linux作为一个主库,Win10上的MySQL Server作为从库

主从复制是单向同步,master的更改(binlog)往slave同步。配置好主从复制的时候,两个库的数据可能是不一样的,从配置好主从复制开始,主库所有的更改都会同步到从库

master创建mytest数据库

查看slave,发现mytest同步过来了

master创建user表,slave也同步了user表

现在linux端的MySQL(master)删除mytest库

此时slave的mytest也不存在了

查看master当前环境下的工作线程

sql 复制代码
show processlist

查看slave当前环境下的工作线程

相关推荐
万维易源7 分钟前
油价行情数据接口整理:国际原油与国内成品油
大数据·数据库·原油·油价
TDengine (老段)18 分钟前
TDengine 如何支撑金隅集团水泥业务的能源精细化管控
大数据·数据库·物联网·能源·时序数据库·tdengine·涛思数据
破土士V38 分钟前
【MySQL基础知识】数据库约束&联合查询&索引
数据库·mysql·索引·联合查询·数据库约束
像风一样自由202039 分钟前
11.PostgreSQ、-MySQL与MongoDB-AI应用如何选择数据库
数据库·人工智能·mysql·mongodb·大模型·rag·智能体
夏之小星星1 小时前
【找回mysql被删除数据】
数据库·sql·mysql
__zRainy__1 小时前
Node系列 · ORM:Sequelize 模型
数据库·后端·node.js
whcyhhh1 小时前
头歌实践教学平台:数据科学与大数据技术导论(五)
大数据·数据库·python
大鹏说大话1 小时前
用 Python 与 DeviceAtlas 构建自动化设备数据库
数据库·python·自动化
肠畔码农1 小时前
深度解密 Redis 核心引擎:从 MULTI/EXEC 事务机制到 EVAL 脚本的原子性演进
数据库·redis·junit