MySQL的多源复制(multi-source replication)允许将一个MySQL从库连接到多个主库,并从每个主库获取和复制数据更改。这种复制拓扑结构可以实现在多个数据库服务器之间进行数据同步和复制。

传统的MySQL复制是单源复制,其中一个主库(也称为主服务器或主节点)将其数据更新记录在二进制日志中,并将这些日志传播给一个或多个从库(也称为从服务器或从节点)。每个从库通过读取主库的二进制日志并应用这些更新来保持与主库的数据同步。

在多源复制中,可以将一个从库连接到多个主库,每个主库都有其独立的二进制日志。这使得从库能够同时从多个主库获取数据更改,并将它们应用到从库中。

新初始化安装两个数据库服务:

1node1 192.168.1.11
2node2 192.168.1.12

这里将配置从node1到到node2的多源复制,node2作为从库。

确认这两台MySQL服务器的配置中开启了二进制ID和GTID:

 1[mysqld]
 2server-id = 11
 3log-bin = mysql-bin
 4binlog-format = ROW
 5gtid_mode = ON
 6enforce_gtid_consistency = ON
 7
 8
 9[mysqld]
10server-id = 12
11log-bin = mysql-bin
12binlog-format = ROW
13gtid_mode = ON
14enforce_gtid_consistency = ON

分别在这两台服务器上查看从服务器(SLAVE)的复制状态信息,确认复制状态信息为空:

1mysql> SHOW SLAVE STATUS \G
2Empty set (0.00 sec)

SHOW SLAVE STATUS 是一个MySQL命令,用于显示从服务器(Slave)的复制状态信息。通过执行该命令,可以获取有关从服务器当前的复制配置、复制进程状态和复制性能等方面的详细信息。

以下是一些SHOW SLAVE STATUS \G输出中常见的字段和信息:

  • Slave_IO_State:从服务器复制进程的当前状态。

  • Master_HostMaster_PortMaster_UserMaster_Log_File:主服务器(Master)的连接和日志信息。

  • Slave_IO_RunningSlave_SQL_Running:指示从服务器的I/O线程和SQL线程是否正在运行。

  • Seconds_Behind_Master:从服务器相对于主服务器的延迟时间,表示复制的滞后程度。

  • Last_Error:如果复制过程中发生错误,将显示该错误的详细信息。

  • Last_SQL_ErrnoLast_SQL_Error:如果SQL线程执行过程中发生错误,将显示该错误的错误号和详细信息。

  • Executed_Gtid_Set:从服务器已执行的GTID(全局事务标识符)集合。

    通过检查SHOW SLAVE STATUS \G的输出,可以评估从服务器的复制健康状况、延迟情况以及是否有任何复制错误发生。这对于监控和故障排除复制过程非常有用,以确保主从服务器之间的数据同步和一致性。

因为这里测试的两个数据库服务都是全新初始化安装的,当前还没有使用,可以省略下面的数据导出导入过程。

如果主库中已经存在数据库和数据了,还需要将主库node1中的数据导出,并导入到从库node2中。 具体要导出哪些数据库还是要导出全部数据库,这个由具体业务和复制规则决定。另外注意要加上--set-gtid-purged=ON参数:

1mysqldump --single-transaction --default-character-set=utf8mb4 --master-data=2 --set-gtid-purged=ON -vv -E -R \
2--databases db1 db2 db3 db4 \
3-uroot -p > db.sql

将上面导出的db.sql拷贝到从库node2上。在从库node2上操作,使用RESET MASTER清空二进制日志文件。执行完RESET MASTER后,查询@@GLOBAL.GTID_PURGED变量返回为空。

 1mysql> RESET MASTER;
 2Query OK, 0 rows affected (0.13 sec)
 3
 4mysql> SELECT @@GLOBAL.GTID_PURGED;
 5+----------------------+
 6| @@GLOBAL.GTID_PURGED |
 7+----------------------+
 8|                      |
 9+----------------------+
101 row in set (0.00 sec)

在从库node2上操作,将db.sql导入到node2中。

1\. db.sql

在从库node2上操作, RESET MASTER用于清空二进制日志文件(导入数据产生的)并重新开始记录新的二进制日志。

1RESET MASTER;

在主库库node1上操作, 创建用户复制的用户:

1CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
2GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';

在从库node2上操作,创建用于复制的channel:

1CHANGE MASTER TO
2  MASTER_HOST = '192.168.1.11',
3  MASTER_USER = 'repl',
4  MASTER_PASSWORD = 'password',
5  MASTER_AUTO_POSITION = 1 FOR CHANNEL 'source_node1_channel';
6START SLAVE FOR CHANNEL source_node1_channel;

MASTER_AUTO_POSITION是用于指定从服务器(Slave)在配置主从复制时是否自动获取并使用主服务器(Master)的GTID(全局事务标识符)。 当设置MASTER_AUTO_POSITION = 1时,从服务器会自动从主服务器获取当前的GTID执行位置,并使用该位置开始复制。这意味着从服务器将根据主服务器的GTID自动选择要复制的事务,并在复制过程中保持与主服务器的一致性。这种自动位置模式可以简化配置,并确保复制从主服务器开始。相反,如果将MASTER_AUTO_POSITION = 0,则需要手动指定从服务器复制的起始位置。

在从库node2上执行,查看从服务器复制状态信息:

 1SHOW SLAVE STATUS \G
 2*************************** 1. row ***************************
 3               Slave_IO_State:
 4                  Master_Host: 192.168.1.11
 5                  Master_User: repl
 6                  Master_Port: 3306
 7                Connect_Retry: 60
 8              Master_Log_File:
 9          Read_Master_Log_Pos: 4
10               Relay_Log_File: relay_bin-source_node1_channel.000001
11                Relay_Log_Pos: 4
12        Relay_Master_Log_File:
13             Slave_IO_Running: No
14            Slave_SQL_Running: No
15              Replicate_Do_DB:
16          Replicate_Ignore_DB:
17           Replicate_Do_Table:
18       Replicate_Ignore_Table:
19      Replicate_Wild_Do_Table:
20  Replicate_Wild_Ignore_Table:
21                   Last_Errno: 0
22                   Last_Error:
23                 Skip_Counter: 0
24          Exec_Master_Log_Pos: 0
25              Relay_Log_Space: 150
26              Until_Condition: None
27               Until_Log_File:
28                Until_Log_Pos: 0
29           Master_SSL_Allowed: No
30           Master_SSL_CA_File:
31           Master_SSL_CA_Path:
32              Master_SSL_Cert:
33            Master_SSL_Cipher:
34               Master_SSL_Key:
35        Seconds_Behind_Master: NULL
36Master_SSL_Verify_Server_Cert: No
37                Last_IO_Errno: 0
38                Last_IO_Error:
39               Last_SQL_Errno: 0
40               Last_SQL_Error:
41  Replicate_Ignore_Server_Ids:
42             Master_Server_Id: 0
43                  Master_UUID:
44             Master_Info_File: mysql.slave_master_info
45                    SQL_Delay: 0
46          SQL_Remaining_Delay: NULL
47      Slave_SQL_Running_State:
48           Master_Retry_Count: 86400
49                  Master_Bind:
50      Last_IO_Error_Timestamp:
51     Last_SQL_Error_Timestamp:
52               Master_SSL_Crl:
53           Master_SSL_Crlpath:
54           Retrieved_Gtid_Set:
55            Executed_Gtid_Set:
56                Auto_Position: 1
57         Replicate_Rewrite_DB:
58                 Channel_Name: source_node1_channel
59           Master_TLS_Version:
601 row in set (0.00 sec)

在从库node2上执行,启动复制channel:

1START SLAVE FOR CHANNEL 'source_node1_channel';

在从库node2上执行,查看从服务器复制状态信息,确认复制已经启动,并且运行正常:

1SHOW SLAVE STATUS \G

最后,执行操作验证主从复制正常。