mysql5.7 gtid多源_MySQL 5.7基于GTID的多源复制

我们知道,如果我们想把多个 MySQL Master 数据汇集到同一个实例,可以选择 MySQL 5.7 提供的多源复制,就是建立多个复制通道,每个通道分别 change master 到不同的实例即可。但这里对于复制方式可以基于 position 模式,或 gitd 模式。这里并不是介绍一些关于复制的基础知识,对于 position 模式,就不说了,也比较简单,主要说在多源复制怎么基于 gtid 的复制。

我们现在要搭建一套基于 GTID 复制的 2 个主实例,1 个多源实例的架构。

Master my.cnf

gtid_mode = ON

enforce_gtid_consistency = true

log_bin = /var/log/mysql/bin_log.index

log_slave_updates = true

server-id = 2061

1

2

3

4

5

gtid_mode=ON

enforce_gtid_consistency=true

log_bin=/var/log/mysql/bin_log.index

log_slave_updates=true

server-id=2061

Multi Source my.cnf

[client]

port = 3306

socket = /var/run/mysqld/mysqld.sock

[mysqld_safe]

pid-file = /var/run/mysqld/mysqld.pid

socket = /var/run/mysqld/mysqld.sock

nice = 0

[mysqld]

user = mysql

pid-file = /var/run/mysqld/mysqld.pid

socket = /var/run/mysqld/mysqld.sock

port = 3306

basedir = /usr

datadir = /var/lib/mysql

tmpdir = /tmp

server-id = 10001

explicit_defaults_for_timestamp

gtid_mode = ON

enforce_gtid_consistency = true

log_bin=/var/log/mysql/bin_log.index

log_slave_updates=true

master_info_repository=TABLE

relay_log_info_repository=TABLE

log-error = /var/log/mysql/error.log

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

[client]

port=3306

socket=/var/run/mysqld/mysqld.sock

[mysqld_safe]

pid-file=/var/run/mysqld/mysqld.pid

socket=/var/run/mysqld/mysqld.sock

nice=0

[mysqld]

user=mysql

pid-file=/var/run/mysqld/mysqld.pid

socket=/var/run/mysqld/mysqld.sock

port=3306

basedir=/usr

datadir=/var/lib/mysql

tmpdir=/tmp

server-id=10001

explicit_defaults_for_timestamp

gtid_mode=ON

enforce_gtid_consistency=true

log_bin=/var/log/mysql/bin_log.index

log_slave_updates=true

master_info_repository=TABLE

relay_log_info_repository=TABLE

log-error=/var/log/mysql/error.log

Master A

首先在线导出数据,注意保证数据一致性。

mysqldump --databases profiles --single-transaction --triggers --routines --host=A --port=3306 --user=user --password=pass > ~/dump-a.sql

1

mysqldump--databasesprofiles--single-transaction--triggers--routines--host=A--port=3306--user=user--password=pass>~/dump-a.sql

默认导出是带有 GTID 信息的。可以通过 grep 命令查看到导出文件中 GTID 的值。

$ grep PURGED ~/dump-a.sql

SET @@GLOBAL.GTID_PURGED='d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';

1

2

$grepPURGED~/dump-a.sql

SET@@GLOBAL.GTID_PURGED='d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';

可以看到导出带有 GTID 的备份文件时,当时导入目标库的时候是需要把导出文件的 GTID 值 SET 到目标库的。当然,GLOBAL.GTID_PURGED 有值时是无法进行 SET 操作的,会报如下错误。

ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

1

ERROR1840(HY000)atline24:@@GLOBAL.GTID_PURGEDcanonlybesetwhen@@GLOBAL.GTID_EXECUTEDisempty.

然后,在目标多源库进行 reset master 操作(这里有一个重要条件就是这是一个没有任何复制通道的多源实例,如果当前已经存在复制通道了,切记不可操作 reset master;具体怎么做,下面介绍 Master B 节点加入多源库时再说)。执行完成后,可以把 dump-a.sql 文件利用 source 命令导入到多源库了,这个过程根据数据大小可能需要很长一段时间,静静等待便是。

等待数据导入完成后,就可以建立复制通道了。

CHANGE MASTER TO MASTER_HOST="A", MASTER_PORT=3306, MASTER_USER="user", MASTER_PASSWORD="pass", MASTER_AUTO_POSITION=1 FOR CHANNEL "channel01";

1

CHANGEMASTERTOMASTER_HOST="A",MASTER_PORT=3306,MASTER_USER="user",MASTER_PASSWORD="pass",MASTER_AUTO_POSITION=1FORCHANNEL"channel01";

复制通道建立成功之后,start slave for channel ‘channel01’ 启动便是了。

Master B

首先在线导出数据,注意保证数据一致性。

mysqldump --databases profiles --single-transaction --triggers --routines --host=A --port=3306 --user=user --password=pass > ~/dump-b.sql

1

mysqldump--databasesprofiles--single-transaction--triggers--routines--host=A--port=3306--user=user--password=pass>~/dump-b.sql

默认导出是带有 GTID 信息的。可以通过 grep 命令查看到导出文件中 GTID 的值。

$ grep PURGED ~/dump-a.sql

SET @@GLOBAL.GTID_PURGED='4354e460-159f-11ea-81ab-7cd30adb115e:1-6942';

1

2

$grepPURGED~/dump-a.sql

SET@@GLOBAL.GTID_PURGED='4354e460-159f-11ea-81ab-7cd30adb115e:1-6942';

需要在导出文件中删除这行数据,这点很重要,避免把数据导入到多源库时导致多源库 GLOBAL.GTID_PURGED 值被覆盖(当然,GLOBAL.GTID_PURGED 有值时是无法进行 SET 操作的)。

然后可以把 dump-b.sql 文件利用 source 命令导入到多源库了。这可能需要一个过程,等待数据导入完成之后。就可以建立 Master B 的复制通道了。

CHANGE MASTER TO MASTER_HOST="B", MASTER_PORT=3306, MASTER_USER="user", MASTER_PASSWORD="pass", MASTER_AUTO_POSITION=1 FOR CHANNEL "channel02";

1

CHANGEMASTERTOMASTER_HOST="B",MASTER_PORT=3306,MASTER_USER="user",MASTER_PASSWORD="pass",MASTER_AUTO_POSITION=1FORCHANNEL"channel02";

由于多源库已经存在了复制通道 Master A,所以需要关闭所有复制通道,执行 stop slave 即可,这是为了获取当前静态的 GTID 信息。

mysql> show master status\G

*************************** 1. row ***************************

File: bin_log.000034

Position: 312746766

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set: d23dceda-08a4-11e5-85e4-005056a2431f:1-10073

1

2

3

4

5

6

7

mysql>showmasterstatus\G

***************************1.row***************************

File:bin_log.000034

Position:312746766

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:d23dceda-08a4-11e5-85e4-005056a2431f:1-10073

然后把当前已经执行的 GTID 值与 dump-b.sql 文件中的 GTID 值合并成一个新的 GLOBAL.GTID_PURGED 值,并 SET 到多源库,在 SET 之前需要先执行 reset master 操作,注意要确保所有的复制通道已经关闭了。

RESET MASTER;

SET @@GLOBAL.GTID_PURGED='4354e460-159f-11ea-81ab-7cd30adb115e:1-6942,d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';

1

2

RESETMASTER;

SET@@GLOBAL.GTID_PURGED='4354e460-159f-11ea-81ab-7cd30adb115e:1-6942,d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';

配置完成后,然后就可以启动所有的复制通道了。

设置 GTID_PURGED 会改变三个地方的 Gtid,如下:

mysql.gtid_executed 表

gtid_purge 变量

gtid_executed 变量

此时,io_thread 会把多源库 GTID_PURGE 值发送给主库,主库会找到自己的 GTID 并把差异的事务发送到多源库进行应用。

如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值