本文主要讲解MySQL多源复制相关内容,包括搭建一个简单的多源复制环境;
一、概述
MySQL多源复制使副本能够并行接收来自多个数据源的事务。在多源复制拓扑中,副本应该为每个数据源创建一个复制通道。在多源复制拓扑中的一个从服务器上最多可以创建256个通道。每个复制通道必须具有唯一的(非空)名称;
多源复制可以满足的场景:
(1)将多个服务器备份到单个服务器。
(2)合并表碎片。
(3)将数据从多个服务器整合到单个服务器。
在应用事务时,多源复制不会实现任何冲突检测或解决方案,并且如果需要,这些任务将留给应用程序。
注意
多源复制的从库上的每个通道必须从不同的源复制。不能设置从单个Master到单个Slave源的多个复制通道。这是因为server_id在复制拓扑中必须唯一。源仅通过server_id来区分Master,而不通过复制通道的名称来区分,因此它无法识别来自同一Master的不同复制通道。
通过将slave_parallel_workers系统变量设置为大于0的值,也可以将多源副本设置为多线程副本。在多源副本上执行此操作时,副本上的每个通道均具有指定数量的应用程序线程,再加上一个协调器线程来管理它们。不能为单个通道配置应用程序线程数。
从MySQL 8.0开始,可以在特定的复制通道上使用复制过滤器配置多源副本。当多个源上存在相同的数据库或表时,可以使用通道特定的复制筛选器。对于基于GTID的复制,如果同一事务可能来自多个源,则必须确保所有通道上的过滤设置都相同。
测试环境:
主库:
10.30.124.187:6306 Master1
10.30.124.187:6307 Master2
从库:
10.30.124.187:6308 Slave
二、配置多源复制
多源复制拓扑至少需要配置两个源和一个副本。我们假设有两个源source1和source2,以及一个复制主机。复制副本从每个源复制一个数据库,从source1复制db1,从source2复制db2。
多源复制拓扑中的源可以配置为使用基于GTID的复制或基于二进制日志和偏移量的复制。推荐使用基于GTID的复制方式方式
多源复制拓扑中的副本需要用于副本的连接元数据存储库和applier元数据存储库的表存储库,这是MySQL 8.0中的默认值。多源复制与不推荐使用的备用文件存储库不兼容。
首先备份Master1 和Master2上的数据库,备份的时候,仅仅只备份了需要进行数据同步的数据库,并未进行全部备份,而做多源复制中,也需要这样做,否则做第一个复制还好,配置后面的复制的时候,会出现复制失败的情况;
mysqldump -udba_admin -p -h127.0.0.1 -P6306 --single-transaction --master-data=2 --set-gtid-purged=OFF --triggers --routines --events --databases datax_conf_db metdb > /tmp/datax_conf_db_metdb.sql mysqldump -udba_admin -p -h127.0.0.1 -P6307 --single-transaction --master-data=2 --set-gtid-purged=OFF --triggers --routines --events --databases jjlive_spider ads_schedular > /tmp/ads_schedular_jjlive_spider.sql
在Slave上恢复恢复相关的数据库
mysql -u dba_admin -p -h 127.0.0.1 -P6308 < /tmp/datax_conf_db_metdb.sql mysql -u dba_admin -p -h 127.0.0.1 -P6308 < /tmp/ads_schedular_jjlive_spider.sql
三、基于GTID的复制配置多源副本
如果多源复制拓扑中的源具有现有数据,则可以节省时间在开始复制之前为副本提供相关数据。在多源复制拓扑中,无法使用数据目录的克隆或复制为副本提供来自所有源的数据,并且可能还希望仅复制来自每个源的特定数据库。因此,提供这种副本的最佳策略是使用mysqldump在每个源上创建一个转储文件,然后使用mysql客户端在副本上导入转储文件。
如果使用基于GTID的复制,则需要注意mysqldump放在转储输出中的SET @@GLOBAL.gtid_purged声明。该语句将在源上执行的事务的GTID传输到副本,副本则需要此信息。但是,对于比从一个源配置一个新的空副本更为复杂的情况,需要检查该语句在该副本使用的MySQL版本中具有什么作用,并相应地处理该语句。
与MySQL 5.6和5.7相比SET @@GLOBAL.gtid_purged,mysqldump编写的语句的行为在MySQL 8.0版本中有所不同。在MySQL 5.6和5.7中,该语句替换gtid_purged副本上的值,并且在发行版中,仅当副本中具有GTID(gtid_executed集合)的事务记录为空时,才能更改该值。因此,在多源复制拓扑中,必须删除SET @@GLOBAL.gtid_purged在导入转储文件之前,否则不能应用包含此语句的第二个或后续转储文件。还要注意,对于MySQL 5.6和5.7,此限制意味着来自源的所有转储文件必须在具有空gtid_executed集的副本上一次操作中应用。可以通过RESET MASTER在副本上发布副本来清除副本的GTID执行历史记录。
对于MySQL 8.0.17以上开始,作为删除该SET @@GLOBAL.gtid_purged语句的替代方法,可以将mysqldump的–set-gtid-purged选项设置COMMENTED为包括该语句但被注释掉,以便在加载转储文件时不起作用。如果使用来自同一源的两个部分转储来配置副本,并且在第二个转储中设置的GTID与第一个相同,则可以设置mysqldump输出第二个转储文件时的–set-gtid-purged选项OFF,以忽略该语句。
ads_schedular_jjlive_spider.sql文件中的GTID相关信息
-- -- GTID state at the beginning of the backup -- SET @@GLOBAL.GTID_PURGED='0008c013-afb2-11ea-9fa9-005056b7a90a:1-4, 1f7133df-aa0b-11e9-af7d-005056b7a90a:1-8158244:8158247-8199883, 6b7f2891-5c90-11eb-b9a5-005056b7a90a:1-38, bca9ac2e-aa0a-11e9-ac0c-005056b71124:1-11393066, e308e300-a63c-11ea-ae39-005056b71124:1-2';
datax_conf_db_metdb.sql文件中的GTID相关信息
-- -- GTID state at the beginning of the backup -- SET @@GLOBAL.GTID_PURGED='0008c013-afb2-11ea-9fa9-005056b7a90a:1-4, 1f7133df-aa0b-11e9-af7d-005056b7a90a:1-8158244:8158247-8199883, b012f5ec-5c8f-11eb-94e2-005056b7a90a:1-38, bca9ac2e-aa0a-11e9-ac0c-005056b71124:1-11393036, e308e300-a63c-11ea-ae39-005056b71124:1-2';
副本中需要执行的GTID集合如下:
SET @@GLOBAL.GTID_PURGED='0008c013-afb2-11ea-9fa9-005056b7a90a:1-4, 1f7133df-aa0b-11e9-af7d-005056b7a90a:1-8158244:8158247-8199883, 6b7f2891-5c90-11eb-b9a5-005056b7a90a:1-38, b012f5ec-5c8f-11eb-94e2-005056b7a90a:1-38, bca9ac2e-aa0a-11e9-ac0c-005056b71124:1-11393066, e308e300-a63c-11ea-ae39-005056b71124:1-2';
下面我们来建立与两台MYSQL的主从复制
在Master1和Master2上创建repl账户:
CREATE USER 'repl'@'10.30.124.%' IDENTIFIED WITH 'mysql_native_password' BY 'XXXXXX'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'10.30.124.%' ;
在Slave上配置主从复制关系
mysql> RESET MASTER; mysql> SET @@GLOBAL.GTID_PURGED='0008c013-afb2-11ea-9fa9-005056b7a90a:1-4, 1f7133df-aa0b-11e9-af7d-005056b7a90a:1-8158244:8158247-8199883, 6b7f2891-5c90-11eb-b9a5-005056b7a90a:1-38, b012f5ec-5c8f-11eb-94e2-005056b7a90a:1-38, bca9ac2e-aa0a-11e9-ac0c-005056b71124:1-11393066, e308e300-a63c-11ea-ae39-005056b71124:1-2';
配置复制关系
mysql> CHANGE MASTER TO MASTER_HOST='10.30.124.187', MASTER_USER='repl', MASTER_PORT=6306, MASTER_PASSWORD='XXXXXX', MASTER_AUTO_POSITION = 1 FOR CHANNEL 'M_10.30.124.187_6306'; mysql> CHANGE MASTER TO MASTER_HOST='10.30.124.187', MASTER_USER='repl', MASTER_PORT=6307, MASTER_PASSWORD='XXXXXX', MASTER_AUTO_POSITION = 1 FOR CHANNEL 'M_10.30.124.187_6307';
也可以配置复制通道过滤,本文测试中没有配置复制过滤,配置过滤内容放到下面一篇文章中进行讲解
mysql> CHANGE REPLICATION FILTER REPLICATE_DO_DB=(datax_conf_db,metdb) for channel 'm_10.30.124.187_6306'; mysql> CHANGE REPLICATION FILTER REPLICATE_DO_DB=(ads_schedular,jjlive_spider) for channel 'm_10.30.124.187_6307';
四、启动多源副本
为所有复制源添加通道后,发出一条START REPLICA | SLAVE语句以开始复制。在副本上启用多个通道后,可以选择启动所有通道,也可以选择一个特定的通道来启动。例如,要分别启动两个通道,使用mysql客户端发出以下语句:
mysql> START SLAVE FOR CHANNEL "M_10.30.124.187_6306"; mysql> START SLAVE FOR CHANNEL "M_10.30.124.187_6307"; Or from MySQL 8.0.22: mysql> START REPLICA FOR CHANNEL "M_10.30.124.187_6306"; mysql> START REPLICA FOR CHANNEL "M_10.30.124.187_6307";
要验证两个通道均已启动并正常运行,可以SHOW REPLICA | SLAVE STATUS在副本上发出 语句,例如:
mysql> SHOW SLAVE STATUS FOR CHANNEL "M_10.30.124.187_6306"\G mysql> SHOW SLAVE STATUS FOR CHANNEL "M_10.30.124.187_6307"\G Or from MySQL 8.0.22: mysql> SHOW REPLICA STATUS FOR CHANNEL "M_10.30.124.187_6306"\G mysql> SHOW REPLICA STATUS FOR CHANNEL "M_10.30.124.187_6307"\G
查看复制状态
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.30.124.187 Master_User: datax_repl Master_Port: 6306 Connect_Retry: 60 Master_Log_File: mysqlbin.000003 Read_Master_Log_Pos: 765 Relay_Log_File: slave-relay-bin-m_10@002e30@002e124@002e187_6306.000002 Relay_Log_Pos: 413 Relay_Master_Log_File: mysqlbin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 765 Relay_Log_Space: 654 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 311 Master_UUID: b012f5ec-5c8f-11eb-94e2-005056b7a90a Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: 0008c013-afb2-11ea-9fa9-005056b7a90a:1-4, 1f7133df-aa0b-11e9-af7d-005056b7a90a:1-8158244:8158247-8199883, 6b7f2891-5c90-11eb-b9a5-005056b7a90a:1-38, b012f5ec-5c8f-11eb-94e2-005056b7a90a:1-38, bca9ac2e-aa0a-11e9-ac0c-005056b71124:1-11393066, e308e300-a63c-11ea-ae39-005056b71124:1-2 Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: m_10.30.124.187_6306 Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: *************************** 2. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.30.124.187 Master_User: datax_repl Master_Port: 6307 Connect_Retry: 60 Master_Log_File: mysqlbin.000003 Read_Master_Log_Pos: 765 Relay_Log_File: slave-relay-bin-m_10@002e30@002e124@002e187_6307.000002 Relay_Log_Pos: 413 Relay_Master_Log_File: mysqlbin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 765 Relay_Log_Space: 654 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 311 Master_UUID: 6b7f2891-5c90-11eb-b9a5-005056b7a90a Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: 0008c013-afb2-11ea-9fa9-005056b7a90a:1-4, 1f7133df-aa0b-11e9-af7d-005056b7a90a:1-8158244:8158247-8199883, 6b7f2891-5c90-11eb-b9a5-005056b7a90a:1-38, b012f5ec-5c8f-11eb-94e2-005056b7a90a:1-38, bca9ac2e-aa0a-11e9-ac0c-005056b71124:1-11393066, e308e300-a63c-11ea-ae39-005056b71124:1-2 Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: m_10.30.124.187_6307 Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: 2 rows in set (0.00 sec)
五、停止多源副本
该STOP REPLICA | SLAVE语句可用于停止多源副本。默认情况下,如果STOP REPLICA | SLAVE在多源副本上使用该语句,则所有通道都将停止。(可选)使用该子句仅停止特定的频道。
要停止所有当前配置的复制通道:
mysql> STOP SLAVE; Or from MySQL 8.0.22: mysql> STOP REPLICA;
要仅停止命名通道,请使用子句:FOR CHANNEL channel
mysql> STOP SLAVE FOR CHANNEL "M_10.30.124.187_6306"; Or from MySQL 8.0.22: mysql> STOP REPLICA FOR CHANNEL "M_10.30.124.187_6306";
六、重置多源副本
该RESET REPLICA | SLAVE语句可用于重置多源副本。默认情况下,如果RESET REPLICA | SLAVE在多源副本上使用该语句,则会重置所有通道。(可选)使用该子句仅重置特定通道。
重置所有当前配置的复制通道:
mysql> RESET SLAVE; Or from MySQL 8.0.22: mysql> RESET REPLICA;
要仅重命名频道,请使用子句:FOR CHANNEL channel
mysql> RESET SLAVE FOR CHANNEL "M_10.30.124.187_6306"; Or from MySQL 8.0.22: mysql> RESET REPLICA FOR CHANNEL "M_10.30.124.187_6306";
对于基于GTID的复制,请注意,RESET REPLICA | SLAVE不会影响副本的GTID执行历史记录。如果要清除此问题RESET MASTER,请在副本上发出 。
RESET REPLICA | SLAVE使副本忘记其复制位置,并清除中继日志,但它不会更改任何复制连接参数(例如源主机名)或复制过滤器。如果要删除这些频道,请发出RESET REPLICA | SLAVE ALL。
七、监视多源复制
要监视复制通道的状态,存在以下选项:
使用复制性能架构表。这些表的第一列是Channel_Name。可以根据Channel_Name键编写复杂的查询。
SHOW REPLICA | SLAVE STATUS FOR CHANNELchannel
在 performance_schema 库中,提供了复制相关的一些视图,可供查看复制相关的信息。
USE performance_schema; select * from replication_applier_configuration; select * from replication_applier_status; select * from replication_applier_status_by_coordinator; select * from replication_applier_status_by_worker; select * from replication_connection_configuration; select * from replication_connection_status;
参考链接
https://dev.mysql.com/doc/refman/8.0/en/replication-multi-source.html