📌 主要作用
🔹 主从复制的基本原理
🔹 MySQL 主从复制实施步骤
🔹 进阶优化
🔹 总结
🚀 推荐方案
主从复制(Master-Slave Replication) 是数据库的一种分布式架构,主库(Master) 负责 读写操作,而 从库(Slave) 仅进行 只读操作,并通过 复制主库的数据 保持同步。
假设:
在主库 /etc/mysql/my.cnf
或 /etc/my.cnf
添加以下内容:
[mysqld]
server-id=1 # 主库ID,必须唯一
log_bin=mysql-bin # 启用 Binlog
binlog_format=ROW # 推荐使用 ROW 级别
重启 MySQL
systemctl restart mysql
在主库 MySQL 终端执行:
CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
🔹 记下 File
和 Position
值,例如:
+------------------+----------+
| File | Position |
+------------------+----------+
| mysql-bin.000001 | 154 |
+------------------+----------+
在从库 /etc/mysql/my.cnf
或 /etc/my.cnf
添加:
[mysqld]
server-id=2 # 从库ID,需唯一
relay_log=mysql-relay-bin # 中继日志
read_only=1 # 只读模式(可选)
重启 MySQL
systemctl restart mysql
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001', -- 之前记录的 File 值
MASTER_LOG_POS=154; -- 之前记录的 Position 值
启动复制
START SLAVE;
检查复制状态
SHOW SLAVE STATUS\G;
🔹 关键字段:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Yes
,说明主从复制 正常运行。可以使用 Nginx + ProxySQL 或 MySQL Router 进行 读写分离:
默认情况下,主库提交事务后不会等待从库确认,这可能导致数据丢失。
半同步复制 确保主库至少等待一个从库确认数据接收后再提交:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
相比传统 Binlog 复制,GTID(Global Transaction ID) 复制更灵活,无需手动指定 File
和 Position
:
[mysqld]
gtid_mode=ON
enforce-gtid-consistency=ON
在从库执行:
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
方式 | 适用场景 | 优势 | 可能问题 |
---|---|---|---|
普通主从复制 | 小型系统 | 简单易用 | Binlog 可能丢失 |
GTID 复制 | 复杂系统 | 迁移方便 | 兼容性要求高 |
半同步复制 | 高可靠性 | 防止数据丢失 | 可能降低性能 |
读写分离 | 高并发读请求 | 提高吞吐量 | 需要额外代理 |
🚀 推荐方案:
💡 主从复制是高可用架构的基础,但要结合 负载均衡、分库分表 才能构建真正可扩展的分布式数据库! 🚀