目录
1. 什么是 MySQL 主从复制?
MySQL 主从复制(Master-Slave Replication)是一种数据复制技术,允许将一个 MySQL 数据库服务器(主服务器)的数据复制到一个或多个 MySQL 数据库服务器(从服务器)。主从复制的主要目的是实现数据的冗余备份、读写分离、负载均衡以及高可用性。
2. 主从复制的工作原理
MySQL 主从复制的核心原理是基于二进制日志(Binary Log)和 relay log(中继日志)。主服务器将所有写操作记录到二进制日志中,从服务器通过读取主服务器的二进制日志,将这些操作应用到自己的数据库中,从而实现数据的同步。
2.1 主从复制的基本流程
-
主服务器记录二进制日志:主服务器将所有对数据库的写操作(如 INSERT、UPDATE、DELETE)记录到二进制日志(Binary Log)中。
-
从服务器连接主服务器:从服务器通过 I/O 线程连接到主服务器,并请求获取二进制日志的内容。
-
主服务器发送二进制日志:主服务器将二进制日志中的内容发送给从服务器。
-
从服务器写入中继日志:从服务器的 I/O 线程将接收到的二进制日志内容写入到本地的中继日志(Relay Log)中。
-
从服务器应用日志:从服务器的 SQL 线程读取中继日志中的内容,并将其中的 SQL 语句应用到从服务器的数据库中,从而实现数据的同步。
2.2 主从复制的组件
-
主服务器(Master):负责处理客户端的写操作,并将这些操作记录到二进制日志中。
-
从服务器(Slave):从主服务器获取二进制日志,并将其应用到自己的数据库中。
-
二进制日志(Binary Log):记录主服务器上所有对数据库的写操作。
-
中继日志(Relay Log):从服务器从主服务器获取的二进制日志会先写入中继日志,然后再由 SQL 线程应用到从服务器的数据库中。
-
I/O 线程:从服务器上的线程,负责从主服务器获取二进制日志并写入中继日志。
-
SQL 线程:从服务器上的线程,负责读取中继日志并应用其中的 SQL 语句。
3. 主从复制的配置步骤
3.1 主服务器配置
- 修改主服务器的配置文件(通常是
my.cnf
或my.ini
):
[mysqld]
server-id=1 # 主服务器的唯一标识
log-bin=mysql-bin # 启用二进制日志
binlog-format=ROW # 设置二进制日志格式为 ROW
- 重启 MySQL 服务:
sudo systemctl restart mysql
- 创建用于复制的用户:
在主服务器上创建一个专门用于复制的用户,并授予复制权限。
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
- 获取主服务器的二进制日志位置:
在主服务器上执行以下命令,记录当前的二进制日志文件名和位置。
SHOW MASTER STATUS;
输出示例:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 107 | | | |
+------------------+----------+--------------+------------------+-------------------+
记下 File
和 Position
的值,后续在从服务器配置时会用到。
3.2 从服务器配置
-
修改从服务器的配置文件:
[mysqld]
server-id=2 # 从服务器的唯一标识,必须与主服务器不同
relay-log=mysql-relay-bin # 启用中继日志
read-only=1 # 设置从服务器为只读模式
- 重启 MySQL 服务:
sudo systemctl restart mysql
- 配置从服务器连接主服务器:
在从服务器上执行以下命令,配置从服务器连接主服务器的信息。
CHANGE MASTER TO
MASTER_HOST='master_ip_address', # 主服务器的 IP 地址
MASTER_USER='repl', # 主服务器上创建的复制用户
MASTER_PASSWORD='password', # 复制用户的密码
MASTER_LOG_FILE='mysql-bin.000001', # 主服务器上的二进制日志文件名
MASTER_LOG_POS=107; # 主服务器上的二进制日志位置
- 启动从服务器的复制进程:
START SLAVE;
- 检查从服务器的复制状态:
SHOW SLAVE STATUS\G;
在输出中,检查 Slave_IO_Running
和 Slave_SQL_Running
的值是否为 Yes
,如果都为 Yes
,则表示主从复制已成功启动。
4. 主从复制的常见问题与解决方案
4.1 主从复制延迟
问题描述:从服务器的数据同步速度跟不上主服务器,导致数据延迟。
解决方案:
-
优化主服务器的写操作,减少写入压力。
-
增加从服务器的硬件资源,如 CPU、内存、磁盘 I/O 等。
-
使用并行复制(Parallel Replication)功能,加快从服务器的数据同步速度。
4.2 主从复制中断
问题描述:主从复制过程中出现错误,导致复制中断。
解决方案:
-
检查从服务器的错误日志,找到具体的错误信息。
-
根据错误信息进行修复,如跳过错误的 SQL 语句、重新同步数据等。
-
如果问题无法解决,可以重新配置主从复制。
4.3 主从数据不一致
问题描述:主服务器和从服务器的数据不一致,导致查询结果不一致。
解决方案:
-
定期检查主从数据的一致性,可以使用工具如
pt-table-checksum
。 -
如果发现数据不一致,可以使用
pt-table-sync
工具进行数据同步。
5. 主从复制的优势与适用场景
5.1 优势
-
数据冗余备份:从服务器可以作为主服务器的备份,防止数据丢失。
-
读写分离:可以将读操作分发到从服务器,减轻主服务器的压力。
-
负载均衡:通过多个从服务器分担读操作,提高系统的整体性能。
-
高可用性:当主服务器出现故障时,可以快速切换到从服务器,保证系统的可用性。
5.2 适用场景
-
读写分离:适用于读多写少的应用场景,如电商网站、新闻网站等。
-
数据备份:适用于需要定期备份数据的场景,如金融系统、医疗系统等。
-
高可用性:适用于对系统可用性要求较高的场景,如在线交易系统、实时数据分析系统等。
6. 总结
MySQL 主从复制是一种非常实用的数据复制技术,能够有效提高系统的可用性、扩展性。