首页 > 数据库 >MySQL主从复制原理

MySQL主从复制原理

时间:2023-09-18 21:36:06浏览次数:44  
标签:主库 binlog 主从复制 log thread MySQL 原理

一张图让你牢记MySQL主从复制原理|原创 (qq.com)

为什么需要主从复制?

1、读写分离,增强MySQL数据库的可用性。

2、做数据的热备。

3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

说说Binlog

MySQL的Server之间通过二进制日志来实现实时数据变化的传输复制,这里的二进制日志是属于MySQL服务器的日志,记录了所有对MySQL所做的更改。这种复制模式也可以根据具体数据的特性分为三种:

  • Statement:基于语句格式

    Statement模式下,复制过程中向获取数据的从库发送的就是在主库上执行的SQL原句,主库会将执行的SQL原有发送到从库中。

  • Row:基于行格式

    Row模式下,主库会将每次DML操作引发的数据具体行变化记录在Binlog中并复制到从库上,从库根据行的变更记录来对应地修改数据,但DDL类型的操作依然是以Statement的格式记录。

  • Mixed:基于混合语句和行格式

    MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。

什么是MySQL的主从复制?

MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。

图片

主从复制搭建

主从复制的搭建可以看这篇文章快速入门Mycat及主从搭建指南

MySQL 主从复制原理

在多个源的复制中,每一个复制源都会打开一个复制通道,这是一个长链接。并且每个复制源都有自己的 IO线程、一个或者多个点 SQL 线程以及 realy log。复制源接收到事务时会将其添加到relay log 中,然后通过SQL thread执行。相关官方文档如下:

In MySQL multi-source replication, a replica opens multiple replication channels, one for each replication source server. The replication channels represent the path of transactions flowing from a source to the replica. Each replication channel has its own receiver (I/O) thread, one or more applier (SQL) threads, and relay log. When transactions from a source are received by a channel's receiver thread, they are added to the channel's relay log file and passed through to the channel's applier threads. This enables each channel to function independently.

主从复制应该是分为第一次建立连接增量数据同步过程。

第一次建立连接

备库 B 跟主库 A 之间维持了一个长连接。主库 A 内部有一个io_thread线程,专门用于服务备库 B 的这个长连接。一个事务日志同步的完整过程是这样的:

1.在备库 B 上通过change master 命令,设置主库 A 的 IP、端口、用户名、密码,以及要从哪个位置开始请求 binlog,这个位置包含文件名和日志偏移量。

CHANGE MASTER TO MASTER_HOST='192.168.56.104',MASTER_USER='root',MASTER_PASSWORD='qwer_123',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;

2.在备库 B 上执行 start slave 命令,这时候备库会启动两个线程,就是图中的 io_thread 和 sql_thread。其中 io_thread 负责与主库建立连接。

3.主库 A 校验完用户名、密码后,开始按照备库 B 传过来的位置,从本地读取 binlog,发给备库 B。

4.备库 B 拿到 binlog 后,写到relay log(中继日志)中。

5.备库的 sql_thread 读取 relay log,解析出日志里的命令,并且回放执行。

增量同步详细流程

详细过程如下:图片

1.客户端发起 update 请求,MySQL server 端收到请求。

2.生成被修改数据行对应的 undo log。

3.执行update成功写入内存。

4.InnboDB 生成 redo log ,此时处于 prepare阶段。

5.server 层生成binlog,事务提交时binlog做持久化,此时binlog便可以开始被同步到从库了。

6.redo log 做磁盘持久化,同时向客户端返回update的执行新结果(默认异步复制,以后会讲)。

7.主库发送生成的 binlog 数据。

8.从库的io_thread处理Maste传输过来的数据,保存为relay log。从库服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件

9.SQL thread 读取relay log,解析并且在从库中重放执行,数据同步完成。最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

MySQL 如何知道 binlog 是完整的?

因为一个事务的 binlog 是有完整格式的:

  • statement 格式的 binlog,最后会有 COMMIT 标记;

  • row 格式的 binlog,最后会有一个 XID event。

标签:主库,binlog,主从复制,log,thread,MySQL,原理
From: https://blog.51cto.com/coderge/7515962

相关文章

  • MySQL三大日志(binlog、redo log和undo log)详解
    硬核干货!一文掌握binlog、redolog、undolog(qq.com)MySQL日志:undolog、redolog、binlog(qq.com)MySQL三大日志(binlog、redolog和undolog)详解|JavaGuide(Java面试+学习指南)MySQL日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其......
  • 1.MySQL、基础架构(SQL语句执行流程、更新语句执行流程)
    1.MySQL的索引有哪些索引在什么层面:索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。B+树索引:是大多数MySQL存储引擎的默认索引类型。哈希索引:哈希索引能以O(1)时间进行查找,但是失去了有序性;InnoDB存储引擎有一个特殊的功能叫......
  • MySQL事务隔离级别详解
    MySQL事务隔离级别详解|JavaGuide(Java面试+学习指南)事务隔离级别总结SQL标准定义了四个隔离级别:READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读取已提交):允许读取并发事务已经提交的数......
  • Linux离线安装Mysql-5.7
    1、背景描述在真实业务场景下,Linux服务器一般位于内网,所以无法直接访问互联网资源;特别是安装数据库的Linux服务器,在网络方面的管控只会更加严格;因此,需要提前下载好相关资源,再传输到内网Linux服务器进行安装;2、下载Mysql的安装包下载地址:https://dev.mysql.com/downl......
  • 无法访问MySQL,错误代码1045 (28000): 用户'bill'@'localhost'被拒绝访问
    这个错误通常是由于权限设置不正确或者密码错误导致的。你可以尝试以下解决方案来解决这个问题:确保密码输入正确:在输入密码时要注意区分大小写,确保将正确的密码输入。检查用户权限:使用root用户登录MySQL,执行以下命令来查看用户bill的权限:SHOWGRANTSFOR'bill'@'localhost';确认用......
  • 从内核世界透视 mmap 内存映射的本质(原理篇)
    本文基于内核5.4版本源码讨论之前有不少读者给笔者留言,希望笔者写一篇文章介绍下mmap内存映射相关的知识体系,之所以迟迟没有动笔,是因为mmap这个系统调用看上去简单,实际上并不简单,可以说是非常复杂的一个系统调用。如果想要给大家把mmap背后的技术本质,正确地,清晰地还原......
  • MySQL实战实战系列 04 深入浅出索引(上)
    提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个SQL查询比较慢,分析完原因之后,你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就让我们一起来聊聊这个话题吧。    数据库索引的内容比较多,我分成了......
  • mysql 复制表数据和uuid 生成
    复制表结构及数据到新表CREATETABLE新表SELECT*FROM旧表这种方法会将旧表中所有的内容都拷贝过来,当然我们可以用deletefrom新表;来删除。不过这种方法的一个最不好的地方就是新表中没有了旧表的primarykey、Extra(auto_increment)等属性。需要自己添加uuid生成selectrep......
  • 错误记录——mysql5.7连接失败,服务无法启动
    起因:上周安装完mysql后,成功新建了数据库,一切都是正常的,于是就先搁置一旁。今天周一过来,却突然发现无法连接mysql了。过程:第一反应是服务没有启动,毕竟重启了电脑,说不定是服务没有自动启动,于是打开了服务管理器,却发现没有mysql对应的服务。既然没有,那我就自己手动创建一......
  • Ubuntu安装MySQL Access denied for user ‘root‘@‘localhost‘
    1、其它用户登录MySQL2、#查看user表usemysql;selectuser,pluginfromuser;3、修改root密码格式#修改其密码格式updateusersetplugin='mysql_native_password'whereuser='root';#查询其用户selectuser,pluginfromuser;#刷新权限flushprivileges;4、增加root密码#......