MySQL 主从复制 的原理、配置和如何实现 主从灾备

发布于:2025-02-10 ⋅ 阅读:(38) ⋅ 点赞:(0)

1. MySQL 主从复制原理与工作流程

MySQL 的主从复制本质上是一个 基于事件的日志传输系统。在这个系统中,所有对数据的修改(如 INSERTUPDATEDELETE)会在 主数据库 上记录到 二进制日志(binlog),然后通过复制线程传输给从数据库。从数据库会将这些操作应用到自己本地的数据库中,从而保持数据一致。

1.1 主从复制的核心组件
  1. 二进制日志(binlog):MySQL 中的二进制日志记录了数据库的所有数据变更操作。它是主从复制的关键组件,主数据库在执行每个写操作后将其记录到二进制日志中,供从数据库获取和执行。

  2. 主库的日志线程(I/O Thread):从库通过 I/O 线程连接主库,并从主库拉取 二进制日志

  3. 中继日志(Relay Log):从数据库将从主库拉取的二进制日志存储到本地的中继日志中,SQL 线程读取并执行这些日志中的操作,保持数据同步。

  4. 复制线程(SQL Thread):从库的 SQL 线程将从中继日志中读取的操作(数据变更)执行到从库本地数据库,保持数据一致。

1.2 主从复制的工作流程
  • 主数据库 记录写操作到 二进制日志
  • 从数据库I/O 线程 连接主数据库,读取主库的二进制日志,并存储到 中继日志
  • SQL 线程 从中继日志中读取事件,并将事件执行到从库中。

2. MySQL 主从复制配置实践

接下来,我们将深入配置 MySQL 主从复制。以一个实际的配置示例为基础,介绍如何将主数据库的数据同步到从数据库,并使其实现负载均衡和灾备。

2.1 配置主数据库

步骤 1:修改 my.cnf 配置文件

打开主库的 my.cnf 配置文件,启用 二进制日志,并设置一个唯一的 server-id。确保每个 MySQL 实例的 server-id 是唯一的。

[mysqld]
log-bin=mysql-bin
server-id=1
binlog-do-db=your_database_name  # 如果想要复制特定的数据库,可以设置这个参数
  • log-bin=mysql-bin:启用二进制日志,记录所有的写操作。
  • server-id=1:给主数据库设置唯一的 ID。

步骤 2:创建复制用户

在主库上创建用于复制的专用用户,并授予其 REPLICATION SLAVE 权限。

CREATE USER 'replica_user'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;

步骤 3:查看当前的日志位置

运行以下命令查看当前的 二进制日志文件位置。这些信息将在从数据库配置中使用。

SHOW MASTER STATUS;

输出示例:

+------------------+----------+--------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB  |
+------------------+----------+--------------+-------------------+
| mysql-bin.000001 | 154      | your_database |                   |
+------------------+----------+--------------+-------------------+

记录下 FilePosition 的值,我们将在从数据库配置中使用它们。


2.2 配置从数据库

步骤 1:修改 my.cnf 配置文件

从数据库的 my.cnf 配置文件需要设置一个 唯一的 server-id,并指定从库连接主库的信息。

[mysqld]
server-id=2
log-bin=mysql-bin
read-only=1  # 防止从库进行写操作
  • server-id=2:从库的唯一标识符。确保与主库不同。
  • read-only=1:标记从库为只读库,防止从库进行写操作。

步骤 2:配置主库连接信息

在从数据库上执行以下 SQL 命令,配置主库的连接信息。

CHANGE MASTER TO
    MASTER_HOST='master_ip',
    MASTER_USER='replica_user',
    MASTER_PASSWORD='your_password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=154;
  • MASTER_HOST='master_ip':主库的 IP 地址。
  • MASTER_USERMASTER_PASSWORD:用于复制的用户名和密码。
  • MASTER_LOG_FILE='mysql-bin.000001'MASTER_LOG_POS=154:在主库上执行 SHOW MASTER STATUS 命令时获取的 二进制日志文件位置

步骤 3:启动从数据库复制线程

执行以下命令启动从库的复制线程。

START SLAVE;

步骤 4:检查复制状态

使用 SHOW SLAVE STATUS\G 检查从数据库的复制状态。如果复制正常,Slave_IO_RunningSlave_SQL_Running 都应该显示为 Yes

SHOW SLAVE STATUS\G

输出示例:

*************************** 1. row ***************************
           Slave_IO_State: Waiting for master to send event
             Master_Host: master_ip
             Master_User: replica_user
             Master_Port: 3306
           Connect_Retry: 60
     Master_Log_File: mysql-bin.000001
  Read_Master_Log_Pos: 154
       Relay_Log_File: mysql-relay-bin.000001
        Relay_Log_Pos: 154
Relay_Master_Log_File: mysql-bin.000001
     Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

3. 主从灾备实现

为了实现高可用和灾备,我们可以通过 自动故障切换GTID(全局事务标识符)等技术进一步优化 MySQL 的主从复制架构。

3.1 使用 GTID 实现更简洁的复制

GTID 是 MySQL 5.6 引入的一种机制,它为每个事务分配一个唯一的 ID,简化了主从切换和故障恢复的过程。

步骤 1:配置主库启用 GTID

my.cnf 配置文件中启用 GTID:

[mysqld]
gtid_mode=ON
enforce-gtid-consistency=TRUE
log-bin=mysql-bin
server-id=1

步骤 2:配置从库启用 GTID

在从库的 my.cnf 配置文件中同样启用 GTID,并设置 server-id

[mysqld]
gtid_mode=ON
enforce-gtid-consistency=TRUE
log-bin=mysql-bin
server-id=2

步骤 3:配置主库和从库的连接

在从库上运行以下命令,启用 GTID 复制:

CHANGE MASTER TO
    MASTER_HOST='master_ip',
    MASTER_USER='replica_user',
    MASTER_PASSWORD='your_password',
    MASTER_AUTO_POSITION=1;

MASTER_AUTO_POSITION=1 表示启用 GTID 自动定位,MySQL 会自动管理主库和从库的同步位置。


3.2 使用 MHA 实现自动故障转移

MHA(MySQL High Availability) 是一个开源工具,用于 MySQL 的高可用性管理,可以自动检测主库故障并进行故障转移。

步骤 1:安装 MHA

在所有 MySQL 实例上安装 MHA,具体步骤请参考官方文档。

步骤 2:配置 MHA Manager 和 Node

MHA 由 ManagerNode 两部分组成:

  • MHA Manager:负责监控 MySQL 实例的状态,并在检测到主库故障时触发故障转移。
  • MHA Node:运行在每个 MySQL 实例上,监控并响应 Manager 的请求。

配置完成后,当主数据库故障时,MHA 会自动将一个从数据库提升为新的主数据库,从而确保系统的高可用性。


总结

通过这篇深入的解析,你可以了解 MySQL 主从复制 的底层原理、配置步骤以及如何在实际生产中实现 主从灾备

。配置主从复制时,确保每个 MySQL 实例有唯一的 server-id,并且正确配置 二进制日志中继日志复制用户。此外,使用 GTIDMHA 等技术,可以提高故障切换的自动化程度,确保高可用和灾难恢复。


网站公告

今日签到

点亮在社区的每一天
去签到