Mysql 多源复制
文章目录
MySQL 多源复制配置
- 多源复制可以解决多个主库实例同步到同一个从库实例的场景
- 以 MySQL8.0 为例,MySQL 5.7 中存在差异的部分后续补充说明
说明
- 准备三台实例,部署MySQL
- db1 db2 模拟两台单独的主库,db3模拟 db1/db2 的从库
hostname | IP | port |
---|---|---|
db1 | 172.17.191.106 | 6033 |
db2 | 172.17.191.108 | 6033 |
db3 | 172.17.191.107 | 6033 |
准备测试数据
db1
- db1 创建测试库表
|
|
- 创建存储过程
|
|
- 执行存储过程,写入 2w 条数据
|
|
- 检查
|
|
db2
- db2 创建测试库表
|
|
- 创建存储过程
|
|
- 执行存储过程,写入 2w 条数据
|
|
- 检查
|
|
db3 同步数据
- 由于是多个主库实例同步至一个从库实例,仅第一个实例的数据可通过物理备份导入,其他数据库实例数据仅能通过逻辑备份倒入
- 由于当前数据并不多,通过逻辑备份演示,物理备份、恢复过程可参考其他文档
备份 db1 数据
- 备份数据
|
|
- 发送数据至 db3
|
|
备份 db2 数据
- 备份数据
|
|
- 发送数据至 db3
|
|
db3 恢复数据
- db3 导入 db1、db2 数据
|
|
- 检查 GTID 状态,发现除自己的位置为 1 的 GTID 位置外,也增加了 db1/db2 同步的数据的 GTID 位置
|
|
- 检查导入的库表
|
|
配置主从
db1、db2 写入新数据
- db1、db2 再次调用存储过程,生成一部分数据,用于建立主从后测试从库是否同步数据
|
|
|
|
db1、db2 创建同步用户
- db1、db2 创建主从同步用户
- **注意!不要再db1/db2这些要同步数据的库下执行创建用户!!!**原因可看文末部分
|
|
建立同步关系
- db3 建立与 db1/db2 的同步关系
|
|
配置同步过滤
- db3利用复制过滤仅处理db1、db2数据,忽略其他表数据
- 针对主库来的数据,忽略 mysql 表
- 创建针对 db1 的过滤规则,假定从 db1 同步数据的 channel 为 db1_172.17.191.106,需要和后面建立同步是创建的 channel 一致
- 创建针对 db2 的过滤规则,假定从 db2 同步数据的 channel 为 db2_172.17.191.108,需要和后面建立同步是创建的 channel 一致
|
|
- 同步更改配置文件,否则重启 mysql 时会丢失配置
|
|
开启主从同步
- 开启 channel db1_172.17.191.106
|
|
- 查看状态
|
|
- 开启 channel db1_172.17.191.106
|
|
- 查看状态
|
|
验证
- 查询 db1 db2 内数据可知已同步后续数据
|
|
补充:MySQL 5.7 配置多源复
说明
- MySQL5.7 服务器 IP 不变,端口为 3306
- MySQL5.7 配置和 MySQL8.0 类似,存在如下差异
- 主从同步用户,权限部分和 MySQL8.0 存在区别
- 与主库建立同关系部分存在差异,由于 MySQL5.7 不支持追加 GTID,仅能通过 binlog + position id 的方式建立主从
- 配置过滤时 MySQL5.7 不支持针对单个 channel 设置,过滤规则对所有 channel 生效
准备测试数据
- 准备测试数据部分与 mysql8.0 一致,命令及存储过程可复用,略。
- 检查
|
|
|
|
db3 同步数据
- db1 导出数据
- –master-data=2:将备份时日志位置以注释方式写入备份文件中
|
|
- 发送备份文件至 db3
|
|
- db2 导出数据
|
|
- 发送备份文件至 db3
|
|
- db3 导入数据
|
|
建立同步关系
创建同步用户
- db1/db2 创建同步用户,db1/db2 均执行
|
|
db1建立同步关系
- 查看 db1 备份文件 binlog 位置
|
|
- db3 建立建立与 db1 的同步关系
|
|
db2建立同步关系
- 查看 db2 备份文件 binlog 位置
- 此处 MASTER_LOG_FILE 和 MASTER_LOG_POS 与 db1 的一样是巧合,因为都是新库且都写入 2w 条数据
|
|
- db3 建立建立与 db2 的同步关系
|
|
配置过滤规则
- MySQL 过滤规则不支持对 channel 配置,对所有 channel 生效。
|
|
- 同步更改配置文件,否则重启 mysql 时会丢失配置
|
|
开启主从同步
- 开启 channel db1_172.17.191.106
|
|
- 查看状态
|
|
- 开启 channel db2_172.17.191.108
|
|
- 查看状态
|
|
验证
- db1 db2 调用存储过程,继续生成数据
|
|
|
|
- db3 查询同步后的数据
|
|
已知存在的问题
在同步的 DB 内创建用户会导致主从异常
- 环境:8.0.37
- 报错信息
|
|
- 查看主节点对应报错信息,是在 db2 内执行 create user 导致。
- 由于是在 db2 下执行的 CREATE USER,binlog 内 CREATE USER 前拼接了 use db2,导致从库过滤 binlog 出错,从库判断要执行这条 binlog;而 db1,db2 都创建了同名用户,导致第二个库同步过来的 CREATE USER 语句出错。
|
|
MySQL5.7 GTID 模式导入备份时无法指定 GTID 位置
- 报错信息
|
|
- 问题说明
- MySQL 8.0 重复执行 SET @@GLOBAL.GTID_PURGED 效果类似于追加
- 而 MySQL 5.7 上重复执行,仅能覆盖,因此多源复制场景下,无法追加多个主库的 GTID
- 因此只能通过老版本的 binlog file + position id 的模式建立主从同步关系
文章作者 Xiang
上次更新 2024-09-23