MySQL 主从复制是数据库的一种高可用性和扩展性的重要特性。它允许一个或多个从库(Slave)跟随着主库(Master),实时或近似实时地复制主库的数据。这种机制不仅可以提高读取性能,还能提供灾难恢复和负载均衡的解决方案。
MySQL 主从复制的工作原理是基于二进制日志(Binary Log, 或者简称 Binlog)。在主库上,所有的更改操作都会被记录到 Binlog 中。这些更改包括了插入、更新和删除等操作。从库会定期检查来自主库的 Binlog,并执行其中的操作来保持数据的一致性。
在进行主从复制时,需要对主库和从库都进行相应的配置:
MySQL 的主从复制支持两种主要的同步模式:
在传统的 MySQL 版本中,主库和从库之间的数据传输是异步进行的。这意味着主库会继续处理新的写入操作,即使某些 Binlog 还没有被所有从库完全应用。
半同步复制是一种改进了的异步复制模式,它要求主库在执行一个事务前必须至少有一个从库接收到并确认该事务。这可以避免数据丢失的风险,但在某些情况下可能会导致性能上的降低。
要启用主库的数据复制功能,首先需要在主库的配置文件(通常是 my.cnf
或 my.ini
)中进行如下设置:
[mysqld]
log-bin = /path/to/binlog_dir/mysql-bin.log
server-id = 1
这里:
log-bin
指定了二进制日志的文件名和路径。server-id
是用于区分不同服务器标识符,必须在主从库之间各不相同。确保 MySQL 主服务已经按照上述配置启动,并开始生成 Binlog 日志:
sudo systemctl start mysql
或者
sudo service mysql restart
在主库上,创建一个专门用于从库连接的用户并授权其具有必要的权限。
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
在主库上启动从库的复制:
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4;
START SLAVE;
这里:
MASTER_HOST
指定了主库的 IP 地址或域名。MASTER_LOG_FILE
和 MASTER_LOG_POS
是要开始复制的最后一个 Binlog 文件名称和位置。可以通过以下命令查看从库的状态,确保其正在正确地跟随着主库:
SHOW SLAVE STATUS\G;
输出中会包括如 Slave_IO_Running
和 Slave_SQL_Running
等重要信息。这两个字段值均为 "Yes" 表示复制进程运行正常。
如果从库显示 Slave_IO_Running: No
或 Slave_SQL_Running: No
,可能是因为各种原因导致的复制中止。需要通过检查错误日志来确定具体的问题并进行修复。
主从复制过程中可能出现延迟情况,可以通过调整以下参数来优化性能:
sync_binlog
的值可以减少写入磁盘的频率,但需要确保在系统崩溃时不会丢失数据。read-rw-lock-tables
和 rpl_stop_slave_timeout
参数来控制从库如何处理长时间没有新日志进入的情况。MySQL 的主从复制功能为数据库设计提供了巨大的灵活性和可靠性。正确地部署和维护这种复制结构需要细致的规划以及对潜在问题的理解。通过上述步骤,可以建立起一个有效的主从复制环境,从而提高系统的可用性并减少单点故障的风险。