千家信息网

6:多源复制的实现

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,MySQL多源复制允许复制slave同时从多个源接收事务。可以使用多源复制将多个服务器备份到一个服务器,合并表碎片,并将来自多个服务器的数据合并到一个服务器。多源复制在应用事务时不实现任何冲突检测或解
千家信息网最后更新 2026年11月01日6:多源复制的实现
  • MySQL多源复制允许复制slave同时从多个源接收事务。可以使用多源复制将多个服务器备份到一个服务器,合并表碎片,并将来自多个服务器的数据合并到一个服务器。多源复制在应用事务时不实现任何冲突检测或解决,如果需要,这些任务留给应用程序完成。
  • 下面我们就来配置一个多源复制,多源复制这种拓扑至少需要两个masters和slaves。
  • 服务器环境:192.168.1.2 (master1) 192.168.1.3 (new master) 192.168.1.4 (slave)
  • 可以将多源复制拓扑中的masters配置为使用基于全局事务标识符(GTID)的复制或基于二进制日志位置的复制,有关如何使用基于GTID的复制配置master,请看https://blog.51cto.com/itzhoujun/2351367。 有关如何使用基于文件位置的复制配置master,请参见https://blog.51cto.com/itzhoujun/2352688和https://blog.51cto.com/itzhoujun/2352693
  • 本次我们基于GTID来做多源复制
    1. 登录slave
      • 多源复制拓扑中的slaves需要基于TABLE的存储库。多源复制与基于FILE的存储库不兼容。mysqld使用的存储库类型可以在启动时配置,也可以动态配置。分别有以下两种形式
        • 要在启动时配置复制slave使用的存储库类型,请使用以下选项启动mysqld:
          • --master-info-repository=TABLE --relay-log-info-repository=TABLE
        • 要修改使用FILE存储库以使用TABLE存储库的现有复制slave,请通过运行以下命令动态转换现有复制存储库:
          • STOP SLAVE;
          • SET GLOBAL master_info_repository = 'TABLE';
          • SET GLOBAL relay_log_info_repository = 'TABLE';
      • 我们使用使用动态修改
        • mysql> STOP SLAVE;
        • Query OK, 0 rows affected (0.00 sec)
        • mysql> SET GLOBAL master_info_repository = 'TABLE';
        • Query OK, 0 rows affected (0.00 sec)
        • mysql> SET GLOBAL relay_log_info_repository = 'TABLE';
        • Query OK, 0 rows affected (0.00 sec)
        • mysql> show variables like 'master_info_repository';
        • +------------------------+-------+
        • | Variable_name | Value |
        • +------------------------+-------+
        • | master_info_repository | TABLE |
        • +------------------------+-------+
        • 1 row in set (0.01 sec)
        • mysql> show variables like 'relay_log_info_repository';
        • +---------------------------+-------+
        • | Variable_name | Value |
        • +---------------------------+-------+
        • | relay_log_info_repository | TABLE |
        • +---------------------------+-------+
        • 1 row in set (0.00 sec)
        • #说明设置成功了
    2. 登录new master(如果有多个new master就重复此步骤)
      • 要启用基于GTID的复制,必须在启用GTID模式的情况下启动每个服务器,所以我们先修改配置文件,修改后配置文件再重启mysql
        • 参数的具体含义,我已经在https://blog.51cto.com/itzhoujun/2351367和https://blog.51cto.com/itzhoujun/2352693详细介绍过了
        • mysql> show variables like '%gtid%';
        • +----------------------------------+-------------------------------------------+
        • | Variable_name | Value |
        • +----------------------------------+-------------------------------------------+
        • | binlog_gtid_simple_recovery | ON |
        • | enforce_gtid_consistency | ON |
        • | gtid_executed_compression_period | 1000 |
        • | gtid_mode | ON |
        • | gtid_next | AUTOMATIC |
        • | gtid_owned | |
        • | gtid_purged | b45f359b-1747-11e9-bee2-00163e0ea0d9:1-15 |
        • | session_track_gtids | OFF |
        • +----------------------------------+-------------------------------------------+
        • 8 rows in set (0.00 sec)
        • #可以看到这个结果,就说明设置成功了
      • 添加复制用户(如果已经有复制用户了,则跳过这一步)
        • mysql> CREATE USER 'xiaoming'@'%' IDENTIFIED BY 'Xiaoming@123456';
        • Query OK, 0 rows affected (0.01 sec)
        • mysql> GRANT REPLICATION SLAVE ON . TO 'xiaoming'@'%';
        • Query OK, 0 rows affected (0.01 sec)
    3. 登录slave
      • 使用CHANGE MASTER TO语句通过使用FOR CHANNEL channel 子句将新master添加到通道
        • mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.4', MASTER_USER='xiaoming', MASTER_PASSWORD='Xiaoming@123456', MASTER_AUTO_POSITION = 1 FOR CHANNEL 'newmaster-1';
        • Query OK, 0 rows affected, 2 warnings (0.03 sec)
        • #如果有多个new master 则需要重复此步骤,根据实际情况更改主机名,端口和通道名称。
      • 启动多源复制slaves
        • 添加了要用作复制master的所有通道后,使用START SLAVE thread_types语句启动复制。在slave上启用多个通道后,您可以选择启动所有通道,也可以选择要启动的特定通道
        • 要启动所有当前配置的复制通道:
          • START SLAVE thread_types;
        • 要仅启动命名通道,请使用FOR CHANNEL channel子句:
          • START SLAVE thread_types FOR CHANNEL channel;
      • 我们这里直接START SLAVE,启动所有的渠道
      • 然后我们查看一下状态信息
        • mysql> select * from performance_schema.replication_applier_status;
        • +--------------+---------------+-----------------+----------------------------+
        • | CHANNEL_NAME | SERVICE_STATE | REMAINING_DELAY | COUNT_TRANSACTIONS_RETRIES |
        • +--------------+---------------+-----------------+----------------------------+
        • | | ON | NULL | 0 |
        • | newmaster-1 | ON | NULL | 0 |
        • +--------------+---------------+-----------------+----------------------------+
        • 2 rows in set (0.00 sec)
        • #表示有两个渠道,那么分别看下两个渠道的信息
        • mysql> show slave status for channel '' \G
        • #Slave_IO_Running和Slave_SQL_Running都是YES,那说明没问题
        • mysql> show slave status for channel 'newmaster-1' \G
        • #Slave_IO_Running和Slave_SQL_Running都是YES,那说明没问题
          1. 接下来就是分别在master和new master针对数据库操作一些测试数据,然后看下slave是否同步过来了,如果同步过来了,那就没啥问题

参考资料:https://dev.mysql.com/doc/refman/5.7/en/replication-multi-source.html

PREV: 5:使用GTID进行复制 https://blog.51cto.com/itzhoujun/2352693
NEXT: 7:基于语句复制和行复制的优点和缺点 https://blog.51cto.com/itzhoujun/2354045

多源 配置 通道 存储 多个 服务器 服务 两个 事务 动态 拓扑 数据 文件 渠道 语句 问题 登录 成功 位置 信息 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 湖南永感互联网科技有限公司 互联网科技工作委员会副主任毛军 科技股互联网 互联网与科技金融数据 银优互联网科技有限公司 互联网科技宣传片 互联网科技类展会 互联网科技创新企业排名 卫星互联网科技股票 科技互联网的估值 互联网科技产业特征 辽宁互联网新科技 开一家科技互联网公司需要多少钱 电子科技大学互联网创业大赛 世界互联网领先科技成果获奖 互联网科技公司营业执照怎么办理 35岁以上互联网科技行业 黑龙江互联网科技公司 瑞安市蟠桃会互联网科技有限公司 哈尔滨大商圈互联网科技有限公司 互联网科技公司经营范围 互联网的科技 互联网科技的发展 互联网金融公司科技 苏州大垚互联网科技 互联网金融 科技创新 互联网第三次科技革命特征 互联网科技实习生岗位 上海同邻互联网科技有限公司规模
0