MySQL 主从复制原理及其工作过程

一、MySQL主从复制原理

MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器(主服务器,Master)复制到一个或多个 MySQL 数据库服务器(从服务器,Slave)的技术。以下简述其原理,主要包含三个核心组件和三个主要步骤:

核心组件

  • **二进制日志(Binary Log):**位于主服务器上,主服务器会将所有对数据库进行更改的操作(如 INSERT、UPDATE、DELETE 等)以二进制的形式记录到二进制日志文件中。这些日志记录了数据修改的具体内容和执行顺序,是主从复制的基础数据来源。

  • **中继日志(Relay Log):**存在于从服务器上,从服务器通过 I/O 线程从主服务器的二进制日志中读取更新事件,并将这些事件写入到本地的中继日志文件中。中继日志起到了缓存和中转的作用,确保从服务器能够按顺序处理主服务器的更新。

  • **SQL 线程:**从服务器上的 SQL 线程负责读取中继日志中的事件,并将这些事件在从服务器上重新执行一遍,从而实现主从数据的同步。

工作步骤

1. 主服务器记录二进制日志

  • 当主服务器上发生数据更改操作(如插入、更新、删除数据)时,MySQL 会将这些更改操作记录到二进制日志中。二进制日志以事件(Event)的形式存储,每个事件对应一个具体的数据库更改操作。例如,当执行一条 INSERT 语句向表中插入数据时,主服务器会将该 INSERT 操作作为一个事件记录到二进制日志中。

2. 从服务器读取主服务器二进制日志

  • 从服务器上有一个 I/O 线程,它会与主服务器建立连接,并请求主服务器发送其二进制日志。主服务器接收到请求后,会将二进制日志中的更新事件发送给从服务器的 I/O 线程。从服务器的 I/O 线程将接收到的更新事件写入到本地的中继日志中。

3. 从服务器执行中继日志中的事件

  • 从服务器上的 SQL 线程会不断地监控中继日志,当发现中继日志中有新的事件时,会按照事件的顺序依次读取并执行这些事件。例如,如果中继日志中记录了一个 INSERT 事件,SQL 线程会在从服务器的相应表中执行相同的 INSERT 操作,从而保证从服务器的数据与主服务器的数据一致。

二、MySQL主从复制步骤

注意:firewall-cmd和getenforce处于关闭状态

1、基于binlog的主从同步

Master配置

复制代码
[root@openEuler-1 ~]# yum install -y mysql-server
 
#配置文件(主机克隆),注意://三台主从库的id必须不同
#查看命令 vim /var/lib/mysql/auto.cnf

[root@openEuler-1 ~]# vim /etc/my.cnf.d/mysql-server.cnf
server_id=1
[root@openEuler-1 ~]# systemctl restart mysqld
 
#授权用户
mysql> create user rep@'192.168.159.%' identified with mysql_native_password by 'MySQL@123';
mysql> grant replication slave on *.* to rep@'192.168.159.%';
mysql> show master status;  //查看主服务器状态,日志用于从服务器同步,position是当前定位

Slave配置

复制代码
#配置文件
[root@openEuler-2 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[root@openEuler-2 ~]# systemctl restart mysqld

[root@openEuler-3 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[root@openEuler-3 ~]# systemctl restart mysqld
[root@openEuler-3 ~]#

 
#设置复制参数,两个Slave一样的配置
mysql> change master to
    -> master_host='192.168.159.133',
    -> master_user='rep',
    -> master_password='MySQL@123',
    -> master_log_file='binlog.000004',
    ->  master_log_pos=1565;
Query OK, 0 rows affected, 9 warnings (0.03 sec)

#启动复制进程,两个Slave都启动
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)

检查从库状态

复制代码
mysql> show slave status \G

2、 基于gtid的主从同步配置

准备工作,停止从库的复制

复制代码
stop slave

Master配置

复制代码
#修改配置文件
[root@Master ~]# vim /etc/my.cnf.d/mysql-server.cnf
#在最后添加
gtid_mode=ON
enforce-gtid-consistency=ON
 
#重启MySQL服务
[root@Master ~]# systemctl restart mysqld.service
 
#重置二进制日志和GTID
mysql> reset master;
 
#创建用户授予权限
mysql> create user rep@'192.168.159.%' identified with mysql_native_password by 'MySQL@123'; 
mysql> grant replication slave on *.* to rep@'192.168.159.%';
 
#重新加载授权表
mysql> flush privileges;

Slave配置

复制代码
#修改配置文件
[root@Slave1 ~]# vim /etc/my.cnf.d/mysql-server.cnf
gtid_mode=ON
enforce-gtid-consistency=ON
 
#重启服务
[root@Slave1 ~]# systemctl restart mysqld.service
 
#配置连接到主库
mysql> change replication source to
    -> source_host='192.168.159.133',
    -> source_port=3306,
    -> source_user='rep',
    -> source_password='MySQL@123',
    -> source_auto_position=1;
 
mysql> start replica;

检查从库状态

复制代码
mysql> show slave status \G
相关推荐
0xDevNull11 分钟前
MySQL数据冷热分离详解
后端·mysql
科技小花27 分钟前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸28 分钟前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain30 分钟前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希1 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神1 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员1 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java2 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿2 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴2 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存