MySQL 主从复制原理
MySQL 主从复制(Master-Slave Replication)是一种数据复制技术,用于在多个 MySQL 数据库服务器之间复制数据,从而实现高可用性和负载均衡。其基本原理包括以下几个步骤:
1. 主服务器配置(Master Configuration)
在主服务器上进行一些必要的配置以启用二进制日志(Binary Log),这些日志记录了所有对数据库的更改操作。
配置步骤:
-
编辑 MySQL 配置文件:
- 打开主服务器的 MySQL 配置文件(通常是
my.cnf
或my.ini
)。 - 添加或修改以下配置项:
[mysqld] log-bin=mysql-bin server-id=1
log-bin
参数启用二进制日志。server-id
参数设置主服务器的唯一标识符。
- 打开主服务器的 MySQL 配置文件(通常是
-
重启 MySQL 服务:
- 保存配置文件并重启 MySQL 服务以应用更改。
-
创建复制用户:
- 在 MySQL 控制台中创建一个专门用于复制的用户,并授予适当的权限:
CREATE USER 'replica'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%'; FLUSH PRIVILEGES;
- 在 MySQL 控制台中创建一个专门用于复制的用户,并授予适当的权限:
2. 从服务器配置(Slave Configuration)
在从服务器上进行配置,使其能够从主服务器读取和应用二进制日志。
配置步骤:
-
编辑 MySQL 配置文件:
- 打开从服务器的 MySQL 配置文件。
- 添加或修改以下配置项:
[mysqld] server-id=2
server-id
参数设置从服务器的唯一标识符(必须不同于主服务器的server-id
)。
-
重启 MySQL 服务:
- 保存配置文件并重启 MySQL 服务以应用更改。
-
设置从服务器:
- 在从服务器的 MySQL 控制台中运行以下命令以配置复制:
CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='replica', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 4;
MASTER_HOST
是主服务器的 IP 地址。MASTER_USER
和MASTER_PASSWORD
是在主服务器上创建的复制用户。MASTER_LOG_FILE
和MASTER_LOG_POS
是主服务器当前的二进制日志文件名和位置(通过在主服务器上运行SHOW MASTER STATUS;
获取)。
- 在从服务器的 MySQL 控制台中运行以下命令以配置复制:
-
启动复制:
- 在从服务器的 MySQL 控制台中启动复制进程:
START SLAVE;
- 在从服务器的 MySQL 控制台中启动复制进程:
3. 复制过程
在主从服务器都配置好并启动复制后,实际的复制过程包括以下步骤:
-
主服务器生成二进制日志:
- 主服务器记录所有对数据库的更改操作,并将其写入二进制日志文件。
-
从服务器读取二进制日志:
- 从服务器通过 IO 线程从主服务器读取二进制日志,并将其写入本地的中继日志(Relay Log)。
-
从服务器应用中继日志:
- 从服务器的 SQL 线程读取中继日志,并将日志中记录的更改应用到从服务器的数据库中。
4. 监控和管理
可以通过以下命令监控和管理复制状态:
- 查看主服务器状态:
SHOW MASTER STATUS;
查看从服务器状态
SHOW SLAVE STATUS\G;
停止和启动从服务器的复制进程
STOP SLAVE;
START SLAVE;
优点和限制
优点:
- 高可用性:提供数据冗余,主服务器故障时可以切换到从服务器。
- 负载均衡:读操作可以分散到多个从服务器,提高读性能。
- 数据备份:从服务器可以用作数据备份的来源。
限制:
- 延迟:从服务器应用主服务器的更改可能有延迟。
- 单点故障:如果主服务器故障且没有配置自动故障转移,整个系统可能会受到影响。
主从复制的原理
- MySQL 主从复制的原理是通过在主服务器上启用二进制日志记录所有对数据库的更改,从服务器通过IO线程读取主服务器的二进制日志并将其写入本地的中继日志,SQL线程再读取中继日志并将更改应用到从服务器的数据库中,从而实现主从服务器之间的数据同步。这种机制允许从服务器在主服务器故障时接管读操作,提高系统的高可用性,并通过分散读操作到多个从服务器实现负载均衡。此外,从服务器还可以作为数据备份的来源,以提高数据的可靠性和可恢复性。