MySQL主从复制是一种数据复制技术,通过建立主服务器(Master)与从服务器(Slave)之间的数据同步,实现数据的备份、负载均衡和高可用性。
主从复制原理
MySQL binlog(binary log 即二进制日志文件) 主要记录了 MySQL 数据库中数据的所有变化(数据库执行的所有 DDL 和 DML 语句)。因此,我们根据主库的 MySQL binlog 日志就能够将主库的数据同步到从库中。
日志机制:
- 主服务器记录所有更改数据的操作到二进制日志(Binary Log,简称为binlog)。
- 从服务器通过读取主服务器的binlog来跟进数据变化,从而保持与主服务器的数据一致性。
复制过程:
- 主服务器(Master)处理所有的写操作,并将这些操作记录到binlog中。
- 从服务器定期连接主服务器,获取binlog并进行解析,将其中的更改应用到本地数据库,以此实现数据同步。
工作模式:
- 异步复制:从服务器在确认更新后,主服务器并不会等到从服务器会话响应后再执行其他操作。可能导致数据延迟。
- 半同步复制:主服务器在发送更新后,会等待至少一个从服务器确认已接收到该更新。
- 全同步复制:主服务器在每次操作后,必须等待所有从服务器确认更新,这可能会影响性能。
实现教程
这里采用一主一从配置:
需要准备两台服务器,分别安装好MySQL
如果是一台服务器,则可以安装两个端口不一样的MySQL
配置主节点
-
编辑配置文件(my.cnf 或 my.ini):
[mysqld] server-id = 1 # 唯一的server-id log_bin = mysql-bin # 启用二进制日志
-
重启主服务器:
sudo service mysql restart
-
创建复制用户:
登录到MySQL并执行:CREATE USER 'root'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE ON *.* TO 'root'@'%'; FLUSH PRIVILEGES;
-
锁定表并获取当前binlog文件和位置:
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
配置从节点
-
编辑配置文件:
[mysqld] server-id = 2 # 唯一的server-id
-
重启从服务器:
sudo service mysql restart
-
配置从服务器连接主服务器:
登录到从服务器的MySQL并执行:CHANGE MASTER TO MASTER_HOST='主服务器的IP地址', MASTER_USER='root', # 刚刚配置的主服务器的用户名 MASTER_PASSWORD='123456', # 刚刚配置的主服务器的密码 MASTER_log_file='mysql-bin.000001', # 主服务器SHOW MASTER STATUS获取的File MASTER_log_pos=123; # 主服务器SHOW MASTER STATUS获取的Position
-
启动从服务器复制:
START SLAVE;
-
检查复制状态:
SHOW SLAVE STATUS\G;
确保
Slave_IO_Running
和Slave_SQL_Running
都是Yes
。
解锁主服务器的表
再回到主服务器执行:
UNLOCK TABLES;
注意事项
- 确保主从节点的时钟同步。
- 在主节点上修改数据后,不要进行
DROP
操作或者直接删除binlog文件,可能导致从节点无法同步。 - 不能对从节点进行删除数据的操作,如果在从节点上手动删除数据,可能导致主从数据不一致,破坏复制的一致性。在一些特定情况下,例如为了数据清理或符合业务需求,可能需要直接在从节点上操作,但要确保了解这些操作的后果,并能在必要时手动同步数据。
- 建议将从节点设置为只读模式,防止在从节点上进行数据修改。可以通过以下配置项设置从节点为只读:
-
SET GLOBAL read_only = ON;
- 进行备份时,应避免对主数据库的频繁访问。