概念
MySQL 主从复制(Master-Slave Replication)是 MySQL 数据库提供的一种数据同步机制,允许将一个 MySQL主服务器(Master)的数据自动复制到一个或多个其他 MySQL 服务器(从服务器或 Slave)。
-
主服务器 (Master)
接收所有写操作(INSERT, UPDATE, DELETE 等)
将数据变更记录到二进制日志(Binary Log)中
一个主服务器可以有多个从服务器
-
从服务器 (Slave)
复制主服务器的数据变更
默认情况下只接受读操作(可配置)
可以提升为新的主服务器(故障转移时)
-
二进制日志 (Binary Log)
记录所有对数据库的修改操作(从数据库根据日志文件redo)
是主从复制的核心组件
三种格式:STATEMENT(语句)、ROW(行)、MIXED(混合)
复制拓扑类型
-
标准主从复制
一主一从或一主多从,最简单的复制结构
-
链式复制
主→从1→从2 的级联结构,减轻主服务器压力
-
多主复制
多个主服务器相互复制, 需要特殊配置(如组复制)
-
环形复制
多个服务器形成环形复制,已不推荐使用
主从复制的优势
-
读写分离
主库写,从库读,提高整体性能
-
数据备份
从服务器作为实时备份
-
高可用性
主服务器故障时可快速切换到从服务器 -
负载均衡
将读请求分散到多个从服务器
-
数据分析
在从服务器上执行分析查询,不影响主服务器性能
主从复制的限制
-
复制延迟
从服务器数据可能落后于主服务器
-
单点写入
标准配置下只有主服务器可写
-
配置复杂性
需要维护主从服务器的配置和状态
-
数据一致性风险
异步复制可能导致数据丢失
MySQL主从复制主要特点
- 主库产生问题,可以快速切换到从库提供服务。
- 实现读写分离,降低主库的访问压力。
- 可以在从库中执行备份,以避免备份期间影响主库服务。
Binlog 在主从复制中的流转
-
主服务器:
-
事务提交时写入 Binlog
-
通过 Binlog Dump 线程发送给从库
-
-
从服务器:
-
I/O 线程接收 Binlog 并写入 Relay Log
-
SQL 线程读取 Relay Log 并重放事件
-
搭建
-
主库(Master)配置
#非生产环境,直接关闭防火墙
systemctl stop firewalld;
#关闭开机自启
systemctl disable firewalld;
#修改配置文件 etc/my.cnf (Linux)
[mysqld]
# 服务器唯一ID,默认是1
server-id = 1
#是否只读,1代表只读,0代表读写
read-only=0
# 启用二进制日志
log_bin = mysql-bin
# 需要复制的数据库(可选)
binlog-do-db = db_name
# 不需要复制的数据库(可选)
binlog-ignore-db = mysql
重启mysql服务
systemctl restart mysqld;
#创建复制专用账户
CREATE USER 'repl'@'从服务器IP或%' IDENTIFIED BY 'YourPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从服务器IP或%';
#获取主节点二进制日志文件位置和偏移量
show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 341 | | |
+------------------+----------+--------------+------------------+
#备份主数据库(可选)
mysqldump -u root -p --all-databases --master-data > master_dump.sql
从库配置
#修改配置文件 /etc/my.cnf
[mysqld]
# 服务器唯一ID,必须与主服务器不同
server-id = 2
# 启用中继日志
relay-log = mysql-relay-bin
# 可选:设置只读(超级用户仍可写)
read_only = 1
# 可选:记录从服务器自己的更新(级联复制时需要)
log_bin = mysql-bin
# 可选:复制的数据库
replicate-do-db = db_name
#重启 MySQL 服务
systemctl restart mysqld;
#导入主数据库备份(如果做了备份)
mysql -u root -p < master_dump.sql;
#配置复制连接
CHANGE MASTER TO
MASTER_HOST = '主服务器IP',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'YourPassword123!',
MASTER_LOG_FILE = 'mysql-bin.000003', #记录的File值
MASTER_LOG_POS = 341; #记录的Position值
#启动复制
start slave;
验证主从集群的同步状态
1、通过从节点查看同步信息
#查看复制从属性线程基本参数的状态信息
SHOW SLAVE STATUS\G;
#提示信息:
Slave_IO_Running: Yes #线程启动成功
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0 或很小的数值
Last_IO_Error: 空
Last_SQL_Error: 空
2、验证数据是否同步
#在主节点添加数据
CREATE DATABASE test_repl;
USE test_repl;
CREATE TABLE test_table(id INT);
INSERT INTO test_table VALUES(1);
SELECT * FROM test_repl;
#验证从节点数据是否同步
SHOW DATABASES;
USE test_repl;
SHOW TABLES;
SELECT * FROM test_table;