MySQL 主从复制是一种将数据从主数据库(Master)复制到一个或多个从数据库(Slave)的机制,常用于负载均衡、数据备份和灾难恢复。
通过主从复制,主数据库负责处理写请求,而从数据库可以处理读请求,从而提高数据库系统的性能和可用性。
一、基本原理
主库记录数据更改:
在主库上,当有数据写入或更新时,MySQL 会将这些操作记录到二进制日志(Binary Log) 中。二进制日志记录了所有导致数据变化的 SQL 语句(INSERT、UPDATE、DELETE 等),它是主从复制的基础。
从库拉取日志:
从库启动后,会创建一个 I/O 线程,这个线程向主库发起请求,获取主库的二进制日志文件,并将其存储在本地的中继日志(Relay Log) 中。
从库应用日志:
从库的 SQL 线程 会读取中继日志中的内容,并依次执行这些 SQL 语句,将主库的操作复制到从库上,从而保持与主库数据的一致性。
二、过程详解
主库上的二进制日志(Binary Log):
主库会将所有更改数据的操作写入到二进制日志文件中,二进制日志按顺序记录每个事务的开始和结束,并包含具体的 SQL 语句。
主从复制以二进制日志为基础,当从库开始同步数据时,它实际上是从主库获取二进制日志文件内容。
从库的 I/O 线程:
从库中的 I/O 线程负责与主库建立连接,请求主库的二进制日志,并将日志中的内容写入从库的 中继日志(Relay Log)。中继日志是从库用于存储来自主库的更新信息的临时日志文件。
从库的 SQL 线程:
从库中的 SQL 线程负责读取中继日志中的内容并执行相应的 SQL 操作,这个过程会将主库的数据更新同步到从库。通过这种方式,从库保持与主库的数据同步。
三、模式
异步复制:
默认情况下,MySQL 的主从复制是异步的,主库在执行完 SQL 并记录到二进制日志后,不会等待从库确认日志已被接收或执行。因此,主库的性能不会因为从库延迟而受到影响,但存在数据不一致的风险,即主库崩溃时,从库可能尚未接收到最新的更新。
半同步复制:
半同步复制(Semi-Synchronous Replication)是一种增强的模式,当主库将事务写入二进制日志并传输给至少一个从库后,主库才会继续确认事务提交成功。这减少了数据丢失的风险,但会增加一定的延迟。
全同步复制:
全同步复制要求主库等待所有从库确认事务已完成后,才会提交事务。这个模式很少使用,因为它对性能有极大的影响。
四、类型
基于语句的复制(Statement-Based Replication, SBR):
复制每个 SQL 语句到从服务器。
适用于只读的操作,但某些语句可能在不同的环境中有不同的效果。
基于行的复制(Row-Based Replication, RBR):
复制实际的行数据变更到从服务器。
更加准确,但会增加二进制日志的大小。
混合复制(Mixed-Based Replication, MBR):
结合了基于语句和基于行的复制,自动选择适合的复制模式。
五、优势
读写分离:主库负责写操作,从库负责读操作,这样可以减轻主库的负载,增强系统的并发处理能力。
负载均衡:可以将多个从库分配给不同的应用进行查询,实现负载均衡。
高可用性和容错:当主库发生故障时,可以迅速切换到从库,保证服务的持续性。
备份与容灾:从库可以作为备份库使用,避免影响主库的性能。同时,在灾难恢复时可以迅速从从库恢复数据。
六、不足
数据延迟:
在异步复制模式下,从库总会比主库有一定的数据延迟,可能会导致短时间内的数据不一致。
从服务器可能会有短暂的延迟,这取决于主服务器和从服务器之间的数据传输和应用速度。可以通过 SHOW SLAVE STATUS 来监控复制延迟。
单点故障:如果主库出现故障,除非采取自动化的故障转移机制(如 MHA、PXC),否则需要手动将从库提升为主库。
写入性能限制:由于主库仍然需要处理所有写操作,所以写入性能不会因为有多个从库而提升。
七、配置步骤
7.1、主数据库
在主库上开启二进制日志: 编辑 MySQL 配置文件(如 /etc/my.cnf),确保 log_bin 已启用:
[mysqld]
log-bin=mysql-bin
server-id=1 # 每个节点必须有唯一的 server-id
重启主库 MySQL 服务使配置生效。
创建复制用户并授权: 在主库上创建一个用于复制的用户并授予权限:
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
获取当前二进制日志位置:
SHOW MASTER STATUS;
记下 File 和 Position 的值。
7.2、从数据库
在从库上配置复制: 配置从库的 server-id,并确保从库不会生成二进制日志(从库的二进制日志可选):
[mysqld]
server-id=2 # 从库的 server-id 不同于主库
重启从库 MySQL 服务使配置生效。
从库开始复制: 在从库上执行 CHANGE MASTER TO 命令,指定主库的连接信息:
CHANGE MASTER TO
MASTER_HOST='master_host_ip',
MASTER_USER='replica_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001', -- 从主服务器SHOW MASTER STATUS中获取
MASTER_LOG_POS= 4; -- 从主服务器SHOW MASTER STATUS中获取
START SLAVE;
验证复制状态: 在从库上执行
SHOW SLAVE STATUS\G
查看复制是否正常。如果 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes,说明复制正常。
八、总结
MySQL 主从复制是数据库高可用性架构中的重要组成部分,通过异步或半同步复制机制,从库可以高效同步主库的数据,支持读写分离和负载均衡。
mysql 第40章 主从复制