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