MySQL 主从复制是指将一个 MySQL 数据库(主库)上的数据同步到一个或多个 MySQL 数据库(从库)上的机制。复制可以用于负载均衡、备份、容灾等场景。MySQL 5.7 在主从复制配置上有一些改进,支持更灵活的配置和功能。本文将详细介绍 MySQL 5.7 主从复制的安装和工作原理,并分别介绍 一主二从二主二从 的配置方法。


一、MySQL 主从复制工作原理

MySQL 主从复制的基本原理是:

  1. 主库(Master)

    • 主库是数据源,所有的写操作(INSERT、UPDATE、DELETE等)都发生在主库上。主库将数据更改记录到二进制日志(binlog)中。
    • MySQL 通过二进制日志记录所有的更改操作,并将这些日志信息传递给从库。
  2. 从库(Slave)

    • 从库会读取主库的二进制日志,执行日志中记录的操作,从而使得从库的数据与主库保持同步。
    • 从库通过 I/O 线程 从主库获取 binlog 事件,通过 SQL 线程 执行这些事件,更新本地数据。

主从复制的基本流程:

  1. 主库记录所有更改操作到 binlog 文件。
  2. 从库通过 I/O 线程连接到主库,读取 binlog 中的内容(包括 SQL 语句或事件)。
  3. 从库通过 SQL 线程将这些 binlog 事件应用到自己的数据表中。

二、MySQL 5.7 主从复制的安装和配置

1. 安装 MySQL 5.7

假设你要配置 MySQL 复制的机器已经安装了 MySQL 5.7,假定安装了 3 台机器:

  • 主库:192.168.1.1
  • 从库 1:192.168.1.2
  • 从库 2:192.168.1.3

2. 配置主库(Master)

2.1. 配置主库的 my.cnf

首先,编辑主库的 my.cnf 配置文件(一般位于 /etc/my.cnf/etc/mysql/my.cnf):

[mysqld]
# 启用二进制日志
log-bin = mysql-bin
# 设置唯一的服务器 ID(每个节点必须唯一)
server-id = 1
# 设置日志格式,ROW格式最为常用
binlog_format = row
# 开启同步复制(可以确保一致性)
sync_binlog = 1
# 开启GTID模式(可以使用基于GTID的复制)
gtid_mode = ON
enforce-gtid-consistency = ON
# 配置复制使用的数据库(可选,指定只同步部分数据库)
# binlog-do-db = mydb

2.2. 重启 MySQL 服务

修改完成后,重启 MySQL 服务使配置生效:

sudo systemctl restart mysql

2.3. 创建复制账号

登录主库创建一个专门用于复制的账号:

mysql -u root -p

-- 创建复制账号
CREATE USER 'replica'@'%' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;

-- 获取当前主库的二进制日志文件名和位置
SHOW MASTER STATUS;

输出类似如下:

+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001  |   107   |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+

记录下 File(如 mysql-bin.000001)和 Position(如 107)的值,这是配置从库时需要用到的信息。


3. 配置从库(Slave)

3.1. 配置从库的 my.cnf

同样,编辑从库的 my.cnf 配置文件(一般位于 /etc/my.cnf/etc/mysql/my.cnf):

[mysqld]
# 设置唯一的服务器 ID
server-id = 2  # 从库1配置为2,从库2配置为3
# 设置读取主库的二进制日志
relay-log = mysql-relay-bin
log-bin = mysql-bin
gtid_mode = ON
enforce-gtid-consistency = ON

3.2. 配置从库连接主库

在从库上执行以下命令,指定主库的连接信息:

mysql -u root -p

-- 配置从库连接到主库
STOP SLAVE;

CHANGE MASTER TO
    MASTER_HOST='192.168.1.1',    -- 主库 IP 地址
    MASTER_USER='replica',         -- 复制账号
    MASTER_PASSWORD='replica_password',  -- 复制账号密码
    MASTER_LOG_FILE='mysql-bin.000001',  -- 主库的 binlog 文件
    MASTER_LOG_POS=107,            -- 主库的 binlog 位置
    MASTER_AUTO_POSITION = 1;      -- 开启 GTID 模式

-- 启动从库复制进程
START SLAVE;

-- 查看从库状态
SHOW SLAVE STATUS\G;

3.3. 检查复制状态

运行以下命令检查从库的复制状态,确认是否正常同步:

SHOW SLAVE STATUS\G

如果 Slave_IO_RunningSlave_SQL_Running 都是 Yes,则表示复制成功。


三、配置一主二从(1 Master, 2 Slaves)

一主二从的配置中,主库可以有多个从库。主库会把数据同步到从库1和从库2,复制过程相同,只是每个从库都需要配置并连接到主库。

  • 主库(192.168.1.1)配置已经完成,假设我们用 从库1(192.168.1.2)和 从库2(192.168.1.3)。
  1. 配置从库1(server-id = 2)和从库2(server-id = 3),并分别执行 CHANGE MASTER TO 指令连接到主库。

  2. 从库1和从库2都会从主库获取 binlog 数据,执行与主库相同的操作,实现数据同步。


四、配置二主二从(2 Masters, 2 Slaves)

二主二从配置支持双向复制,其中每个主库都有自己的从库,两个主库之间也可以相互复制。这种配置支持读写分离和高可用性。配置时需要格外注意 冲突管理数据一致性

4.1. 配置主库1和主库2

假设你有两个主库:

  • 主库1(192.168.1.1)和 主库2(192.168.1.2)

每个主库都有对应的从库。

  • 主库1 配置 server-id = 1,从库1 配置 server-id = 3
  • 主库2 配置 server-id = 2,从库2 配置 server-id = 4

4.2. 配置双向复制

主库1 上,创建复制账号,并配置双向复制:

-- 在主库1上创建复制账号
CREATE USER 'replica'@'%' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';

-- 配置主库1复制主库2
CHANGE MASTER TO
    MASTER_HOST='192.168.1.2',
    MASTER_USER='replica',
    MASTER_PASSWORD='replica_password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=107,
    MASTER_AUTO_POSITION = 1;
START SLAVE;

主库2 上,创建复制账号,并配置双向复制:

-- 在主库2上创建复制账号
CREATE USER 'replica'@'%' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';

-- 配置主库2复制主库1
CHANGE MASTER TO
    MASTER_HOST='192.168.1.1',
    MASTER_USER='replica',
    MASTER_PASSWORD='replica_password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=107,
    MASTER_AUTO_POSITION = 1;
START SLAVE;

4.3. 配置从库

从库1(192.168.

1.3)和 从库2(192.168.1.4)上,分别配置与相应主库的复制关系。


五、总结

  • 一主二从:适用于主库有多个从库的场景。主库进行数据更新,从库同步数据。配置时需要确保每个节点的 server-id 唯一。
  • 二主二从:适用于双主复制的场景,允许两个主库互相复制。配置时需要小心数据冲突,尤其是在同时进行写操作时。

在实际运维中,主从复制需要监控和管理复制延迟、复制中断等问题。对于高可用环境,可以结合 MHAOrchestratorGalera Cluster 等技术实现更高的可靠性和容错性。

作者:严锋  创建时间:2024-11-09 15:57
最后编辑:严锋  更新时间:2024-11-09 15:59