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当前环境下的工作线程

相关推荐
挖土机_008几秒前
AI 是否真的能完全替代程序员?从我试用 AI 开发到前后端架构与页面开发的真实分析
后端·ai编程
芒克芒克10 分钟前
Java集合框架总结(面试八股)
java·开发语言·面试
chenyuhao202423 分钟前
Linux网络编程:HTTP协议
linux·服务器·网络·c++·后端·http·https
小石头 1008625 分钟前
MySQL 视图:把复杂变简单的“虚拟化”艺术
数据库·mysql
安当加密33 分钟前
PostgreSQL 透明数据加密(TDE)方案与应用场景详解
数据库·postgresql
Java中文社群1 小时前
避坑指南!别再被N8N循环节点“调戏”了!为什么你的Done分支执行了多次?
人工智能·后端
怪我冷i1 小时前
dbeaver如何连接PostgreSQL数据库
数据库·ai编程·ai写作
superman超哥1 小时前
仓颉元编程进阶:编译期计算能力的原理与深度实践
开发语言·后端·仓颉编程语言·仓颉·仓颉语言·仓颉元编程·编译器计算能力
QH_ShareHub1 小时前
如何使用 NHANES 数据库
数据库