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
相关推荐
余衫马7 分钟前
CentOS7 离线安装 Postgresql 指南
数据库·postgresql
E___V___E40 分钟前
MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 2
数据库·笔记·mysql
m0_748254881 小时前
mysql之如何获知版本
数据库·mysql
小金的学习笔记1 小时前
如何在本地和服务器新建mysql用户和密码
运维·服务器·mysql
mikey棒棒棒2 小时前
Redis——优惠券秒杀问题(分布式id、一人多单超卖、乐悲锁、CAS、分布式锁、Redisson)
数据库·redis·lua·redisson·watchdog·cas·并发锁
星星点点洲2 小时前
【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致
java·mysql
水手胡巴3 小时前
oracle apex post接口
数据库·oracle
_院长大人_3 小时前
Docker Mysql 数据迁移
mysql·adb·docker
史迪仔01125 小时前
【SQL】SQL多表查询
数据库·sql
Quz5 小时前
MySQL:修改数据库默认存储目录与数据迁移
数据库·mysql