手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

MySQL5.6 -> MySQL5.7 跨版本多源复制(Multi-Source Replication)

[日期:2017-03-30] 来源:Linux社区  作者:Fantasy life [字体: ]

MySQL多源复制支持【多个低版本->MySQL 5.7】的结构,这样就可以让多个实例的schema汇聚在一台实例上,而且无需升级mysql版本并避免未知风险,用户只需要给这些实例安一个MySQL 5.7作为slave就可以了。

当然Slave必须为MySQL 5.7



本次实验将使用MySQL 5.6.x作为多“主”。

〇 测试环境:
OS:CentOS 6.5
master_1: 192.168.1.185(MySQL 5.6.30)
master_2: 192.168.1.186(MySQL 5.6.30)
slave: 192.168.1.1.187(MySQL 5.7.15)

〇 配置:
master_1相关配置:

  1. [mysqld]
  2. server_id    = 185
  3. log-bin      = master_1
  4. log-bin-index    = master_1.index


master_2相关配置:

  1. [mysqld]
  2. server_id    = 186
  3. log-bin      = master_2
  4. log-bin-index    = master_2.index

slave相关配置:

  1. [mysqld]
  2. server_id    = 187
  3. relay-log    = slave
  4. relay-log-index           = slave.index
  5. # 多源复制结构中的slave,官方要求master-info和relay-log-info存放处必须为TABLE.
  6. # 如果为FILE,则在添加多个master时,会失败:ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORY.
  7. master-info-repository    = TABLE
  8. relay-log-info-repository = TABLE

〇 为master_1 & master_2上建立复制用户:

  1. GRANT REPLICATION SLAVE ON *.* to repl@'192.168.1.187' IDENTIFIED BY 'repl';
  2. FLUSH PRIVILEGES;

〇 测试数据准备:
master_1测试数据:

  1. master_1> FLUSH LOGS;
  2. Query OK, 0 rows affected (0.00 sec)
  3. master_1> SHOW BINARY LOGS; -- 记住当前binlog的name和position
  4. +-----------------+-----------+
  5. | Log_name        | File_size |
  6. +-----------------+-----------+
  7. | master_1.000001 | 166       |
  8. | master_1.000002 | 455       |
  9. | master_1.000003 | 120       |
  10. +-----------------+-----------+
  11. 3 rows in set (0.00 sec)
  12. master_1> CREATE DATABASE master_1;
  13. Query OK, 1 row affected (0.03 sec)

master_2测试数据:

  1. master_2> FLUSH LOGS;
  2. Query OK, 0 rows affected (0.00 sec)
  3. master_2> SHOW BINARY LOGS;    -- 记住当前binlog的name和position
  4. +-----------------+-----------+
  5. | Log_name       | File_size |
  6. +-----------------+-----------+
  7. | master_2.000001 | 166       |
  8. | master_2.000002 | 455       |
  9. | master_2.000003 | 120       |
  10. +-----------------+-----------+
  11. 3 rows in set (0.00 sec)
  12. master_2> CREATE DATABASE master_2;
  13. Query OK, 1 row affected (0.02 sec)

〇 在slave上执行:

  1. salve> CHANGE MASTER TO
  2.     -> MASTER_HOST='192.168.1.185',
  3.     -> MASTER_USER='repl',
  4.     -> MASTER_PORT=3306,
  5.     -> MASTER_PASSWORD='repl',
  6.     -> MASTER_LOG_FILE='master_1.000003',
  7.     -> MASTER_LOG_POS=120
  8.     -> FOR CHANNEL 'master_1';
  9. Query OK, 0 rows affected, 2 warnings (0.02 sec)    -- 此处产生的warnings是一些安全建议和警告,本实验无视。
  10. salve> CHANGE MASTER TO
  11.     -> MASTER_HOST='192.168.1.186',
  12.     -> MASTER_USER='repl',
  13.     -> MASTER_PORT=3306,
  14.     -> MASTER_PASSWORD='repl',
  15.     -> MASTER_LOG_FILE='master_2.000003',
  16.     -> MASTER_LOG_POS=120
  17.     -> FOR CHANNEL 'master_2';
  18. Query OK, 0 rows affected, 2 warnings (0.02 sec)
  19. slave> START SLAVE;
  20. Query OK, 0 rows affected (0.01 sec)
  21. salve> SHOW DATABASES;    -- 此时在master_1和master_2上的binlog events已经被正常的apply了
  22. +--------------------+
  23. | Database            |
  24. +--------------------+
  25. | information_schema |
  26. | master_1           |
  27. | master_2           |
  28. | mysql             |
  29. | performance_schema |
  30. | sys                |
  31. +--------------------+
  32. 6 rows in set (0.00 sec)

最后通过start slave status即可查到复制状态

  1. slave> SHOW SLAVE STATUS\G
  2. *************************** 1. row ***************************
  3.                Slave_IO_State: Waiting for master to send event
  4.                   Master_Host: 192.168.1.185
  5.                   Master_User: repl
  6.                   Master_Port: 3306
  7.                 ……………………………………………………
  8.              Slave_IO_Running: Yes
  9.             Slave_SQL_Running: Yes
  10.                 ……………………………………………………
  11.              Master_Server_Id: 185
  12.                   Master_UUID: ee1f8704-58c4-11e6-95b5-000c297f23b7
  13.              Master_Info_File: mysql.slave_master_info
  14.                     SQL_Delay: 0
  15.           SQL_Remaining_Delay: NULL
  16.       Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  17.                ……………………………………………………
  18.                  Channel_Name: master_1
  19.            Master_TLS_Version:
  20. *************************** 2. row ***************************
  21.                Slave_IO_State: Waiting for master to send event
  22.                   Master_Host: 192.168.1.186
  23.                   Master_User: repl
  24.                   Master_Port: 3306
  25.                 Connect_Retry: 60
  26.                ……………………………………………………
  27.              Slave_IO_Running: Yes
  28.             Slave_SQL_Running: Yes
  29.                ……………………………………………………
  30.              Master_Server_Id: 186
  31.                   Master_UUID: 53774f2d-7e14-11e6-8900-000c298e914c
  32.              Master_Info_File: mysql.slave_master_info
  33.                     SQL_Delay: 0
  34.           SQL_Remaining_Delay: NULL
  35.       Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  36.                ……………………………………………………
  37.                  Channel_Name: master_2
  38.            Master_TLS_Version:
  39. 2 rows in set (0.00 sec)

 

〇 测试:
master_1上操作:

  1. master_1> CREATE TABLE master_1.test_table(id int);
  2. Query OK, 0 rows affected (0.05 sec)
  3. master_1> INSERT INTO master_1.test_table SELECT 666666;
  4. Query OK, 1 row affected (0.01 sec)
  5. Records: 1 Duplicates: 0 Warnings: 0

master_2上操作:

  1. master_2> CREATE TABLE master_2.test_table(massage varchar(16));
  2. Query OK, 0 rows affected (0.02 sec)
  3. master_2> INSERT INTO master_2.test_table SELECT '嘿嘿嘿';
  4. Query OK, 1 row affected (0.00 sec)
  5. Records: 1 Duplicates: 0 Warnings: 0
  6. master_2> INSERT INTO master_2.test_table SELECT '三阳之炎';
  7. Query OK, 1 row affected (0.00 sec)
  8. Records: 1 Duplicates: 0 Warnings: 0

slave上操作:

  1. salve> SELECT id FROM master_1.test_table;
  2. +--------+
  3. | id     |
  4. +--------+
  5. | 666666 |
  6. +--------+
  7. 1 row in set (0.00 sec)
  8. salve> SELECT massage FROM master_2.test_table;
  9. +--------------+
  10. | massage      |
  11. +--------------+
  12. | 嘿嘿嘿        |
  13. | 三阳之炎      |
  14. +--------------+
  15. 2 rows in set (0.00 sec)

 

〇 其他相关语法:

  1. START/STOP/RESET ALL/RESET SLAVE FOR CHANNEL 'XXX';
  2.  
  3. SHOW SLAVE STATUS FOR CHANNEL 'XXX';

ps.
与上述传统position方式类似,GTID方式配置起来也类似,开启GTID后,需要注意使用FOR CHANNEL 'xxx'关键字即可,比如:

  1. CHANGE MASTER TO
  2.     MASTER_HOST='',
  3.     MASTER_USER='repl',
  4.     MASTER_PORT=3306,
  5.     MASTER_PASSWORD='repl',
  6.     MASTER_AUTO_POSITION = 1
  7.     FOR CHANNEL 'master_1';


多台主机的schema名字不可以一样,(比如master_1为db_00 ... db_09共10库,master_2为db_10 ... db_19,master_3为db_20 ... db_29 ……)




参考文档:
MySQL 5.7 Reference Manual 14 SQL Statement Syntax - 14.4.2.1 CHANGE MASTER TO Syntax
MySQL 5.7 Reference Manual 18 Replication - 18.1.4 MySQL Multi-Source Replication

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-03/142387.htm

linux
相关资讯       MySQL多源复制  MySQL跨版本多源复制 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款