文章目录
前言
MySQL
主从复制是一种数据同步机制,通过将主库(Master
)的变更实时复制到一个或多个从库(Slave
),实现数据冗余与读写分离。主库记录所有数据更改(写入、更新等)到二进制日志(binlog
),从库通过I/O
线程拉取这些日志并保存为中继日志(relay log
),再由SQL
线程重放操作,最终保持数据一致。主从复制支持高可用、负载均衡及备份扩展,适用于读多写少场景。配置需确保主从服务器ID唯一,并指定binlog格式(如ROW
或STATEMENT
)。延迟和一致性需监控优化。
1、Mysql主从复制介绍
MySQL
主从复制(Replication
)是一种数据同步机制,允许数据从一个主库(Master
)自动复制到一个或多个从库(Slave
)。以下是其背景、原理及实现步骤的详细说明:
1.1 背景与作用
1、背景
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够。到了数据业务层、数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库连接操作,数据库必然会崩溃,特别是数据丢失的话,后果更是不堪设想。这时候,我们会考虑如何减少数据库的连接,下面就进入我们今天的主题。
2、作用
-
高可用性:主库故障时,从库可快速切换为主库,减少停机时间。
-
负载均衡:主库处理写操作,从库处理读操作,分散数据库压力。
-
数据备份:从库作为实时备份,避免数据丢失。
-
数据分析:在从库执行复杂查询,不影响主库性能。
-
地理分布:跨地域部署从库,提升访问速度。
1.2 核心原理及模型说明
1、核心原理
主从复制基于二进制日志(Binary Log),过程分为三阶段:
-
主库写入二进制日志(Binlog)
-
主库将所有修改数据的操作(如INSERT/UPDATE/DELETE)记录到Binlog中。
-
支持三种Binlog格式:语句模式(SBR)、行模式(RBR)、混合模式(Mixed)。
-
-
从库拉取日志(IO线程)
-
从库通过IO线程连接主库,读取Binlog并保存为中继日志(Relay Log)。
-
使用主库授权的账号认证。
-
-
从库重放日志(SQL线程)
-
从库的SQL线程读取Relay Log,按顺序执行SQL操作,更新自身数据。
-
保证最终数据一致性。
-
2、模型说明
说明:
- 在上面的模型中,
Mysql-A
就是主服务器,即master
,Mysql-B
就是从服务器,
即slave
。 - 在
Mysgl-A
的数据库事件(例如修改数据库的SQL
操作语句),都会存储到日
志系统A
中,在相应的端口(默认3306
)通过网络发送给Mysql-B
。Mysql-B
收到后,写入本地日志系统B
,然后一条条的将数据库事件在数据库Mysgl-B
中完成。 - 日志系统
A
,是MYSQL
的日志类型中的二进制日志,也就是专门用来保存修改
数据库表的所有动作,即bin log
,注意MYSQL
会在执行语句之后,释放锁之
前,写入二进制日志,确保事务安全。 - 日志系统
B
,不是二进制日志,由于它是从MYSQL-A
的二进制日志复制过来的,
并不是自己的数据库变化产生的,有点接力的感觉,称为中继目志,即relaylog
。 - 通过上面的机制,可以保证
Mysgl-A
和MysgL-B
的数据库数据一致,但是时间
上肯定有延迟,即MysqL-B
的数据是滞后的。因此,会出现这样的问题,Mysgl-A
的数据库操作是可以并发的执行的,但是Mysgl-B
只能从relaylog
中一条一条
的读取执行。若Mysql-A
的写操作很频繁,Mysgl-B
很可能就跟不上了。
1.3 主从复制方式
-
异步复制
master
只需要完成自己的数据库操作即可,至于slave
是否收到二进制日志,是否完成操作,不用关心。MYSQL
的默认设置。
-
同步复制
master
的事务需在所有slave
节点提交后才返回成功,通常通过第三方方案实现(如Galera Cluster 或 MySQL Group Replication
)。
-
半同步复制
master
只保证slave
中的一个操作成功,就返回,其他slave
不管。这个功能,是由Google
为MYSQL
引入的。
下面主从复制的搭建默认使用的是异步复制方式,大家可自行扩展其它方式。
2、主从复制实现步骤
2.1 描述和原理
1、描述
- 主从复制是指将主数据库的
DDL
和DML
操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而
使得从库和主库的数据保持同步。 MySQL
支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。- MySQL复制的有点主要包含以下三个方面:
- 主库出现问题,可以快速切换到从库提供服务。
- 实现读写分离,降低主库的访问压力。
- 可以在从库中执行备份,以避免备份期间影响主库服务。
2、原理
从上图来看,复制分成三步:
Master
主库在事务提交时,会把数据变更记录在二进制日志文件Binlog
中。- 从库读取主库的二进制日志文件
Binlog
,写入到从库的中继日志RelayLog
。 slave
重做中继日志中的事件,将改变反映它自己的数据。
2.2 搭建步骤
本文说的是在
centos 7
系统上,实现mysql5.7
数据库的主从配置,从而实现读写分离操作。
Linux上安装mysql教程
1、准备两台服务器(用虚拟机安装两台centos7即可)
- 防火墙配置: 两个服务器做相同配置
两台服务器需要安装对应的mysql软件,并启动。开放指定的3306端口号: firewall-cmd --zone=public -add-port=3306/tcp -permanent firewall-cmd -reload 关闭服务器的防火墙: systemctl stop firewalld systemctl disable firewalld
2、主库的配置(master)
-
修改配置文件
/etc/my.cnf
# mysql服务ID,保证整个集群环境中唯一,取值范围:1-232-1,默认为1 server-id=1 # 是否只读,1代表只读,0代表读写 read-only=0 # 忽略的数据,指定不需要同步的数据库 # binlog-ignore-db=mysql # 指定同步的数据库,默认同步全部数据库 # binlog-do-db=db01
-
重启MySQL服务
systemctl restart mysqld
-
登陆mysql,创建远程连接的账号,并授予主从复制的权限
# 创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务 creat user itcast'@'% identified by 'password' # 为itcast@%用户分配主从复制权限 grant replication slave on *.* to 'itcaast'@'%'; # 刷新权限 flush privileges;
-
查看主库状态
show master status;
字段说明:
file
:从哪个日志文件开始推送日志文件position
:从哪个位置开始推送日志binlog_ignore_db
:指定不需要同步的数据库
记录这几个字段,后续在从库需要使用。
3、从库的配置(slave)
-
修改配置文件
/etc/my.cnf
# mySql服务ID,保证整个集群环境中唯一,取值范围:1-232-1,和主库不一样即可 server-id=2 # 是否只读,1代表只读,0代表读写 read-only=1
如果想要超级管理员也是只读的添加字段:
super-read-only=1
-
重启MySQL服务
systemctl restart mysqld
-
登陆mysql,设置主库配置
-
Mysql8.0.23之前的写法:(本文使用该写法)
change master to master_host = '主库ip', master_user = 'itcast', # 主库创建用户名 master_password = 'password', # 密码 master_log_file = 'mysql-bin.000001', # 日志文件名 master_log_pos = 154; # 位置
-
Mysql8.0.23写法:
change replication source to source_host = '主库ip', source_user = 'itcast', source_password = 'password', source_log_file = 'mysql-bin.000001', source_log_pos = 154;
-
参数说明:
mysql8.0.23 含义 mysql8.0.23之前 source_host 主库IP地址 master_host source_user 连接主库的用户名 master_user source_password 连接主库的密码 master_password source_log_file binlog日志文件名 master_log_file source_log_pos binlog日志文件位置 master_log_pos
-
-
开启同步状态
start replica; # 8.0.22之后 start slave; # 8.0.22之前(本文使用该方法)
-
登陆mysql,查看主从同步状态
show replica status; # 8.0.22之后 show slave status; # 8.0.22之前(本文使用该方法)
4、验证配置
-
在主库上创建数据库、表,并插入数据,如下:
# 创建数据库 create database db0l; # 选择数据库 use db01; # 创建表 create table tb user( idint(11)primarykeynotnullauto_increment, namevarchar(5o)notnull sex varchar(1) )engine=innodb default charset=utf8mb4; # 插入数据 insert into tb_user(id,name,sex) values(null,'Tom','1'),(null,'Trigger','O'),(null,'Dawn','1');
-
在从库中查询数据,验证主从库是否同步
2.3 初始数据同步
如果需要将主库之前的数据库同步到从库,可以提前先将主库数据拷贝到从库,因为主从同步是从当前位置进行同步的。
步骤如下:
-
锁定主库(可选)
flush tables with read lock;
-
导出数据
mysqldump -u root -p --all-databases > master_data.sql
-
解锁主库
unlock tables;
-
导入数据到从库
mysql -u root -p < master_data.sql
2.4 常见问题排查及总结
1、问题排查
-
连接失败:检查主从网络、防火墙、复制用户权限。
-
数据不一致:使用工具如
pt-table-checksum
校验数据。 -
复制延迟:优化从库硬件、减少大事务、调整并行复制参数。
2、总结:
MySQL
主从复制通过Binlog
实现数据同步,配置步骤包括主库开启Binlog
、创建复制用户,从库配置连接信息并启动复制。该机制为高可用、读写分离及数据备份提供了基础支持,是构建健壮数据库架构的核心技术之一。