MySQL进阶运维与架构多源复制
31.6 搭建MySQL多源复制环境
MySQL中的多源复制指的是一个MySQL从库有多个MySQL主库,多个MySQL主库之间没有任何主从关系,从库可以同时接收多个主库的数据,主要的应用场景是将多个MySQL中的数据聚合到一个MySQL中。
注意:使用MySQL的多源复制时,为保证从库数据的一致性,需要保证从每个主数据库中复制不同的数据库,或者使用应用程序处理复制数据时产生的数据冲突。
31.6.1 服务器规划
MySQL多源复制的服务器规划如表31-5所示。
表31-5 MySQL多源复制的服务器规划
MySQL多源复制的示意图如图31-5所示。
图31-5 MySQL多源复制示意图
31.6.2 搭建MySQL多源复制环境
本节在31.3节的基础上将MySQL的主从模式切换为MySQL的多源复制模式,读者也可以在31.1节的基础上增加MySQL服务器搭建MySQL的多源复制环境。由于两种方式的搭建过程基本相同,因此不再赘述第二种搭建方式。
(1)修改每台MySQL服务器的my.cnf文件。
vim /data/mysql/conf/my.cnf
[mysqld]
master-info-repository=TABLE
relay-log- info-repository=TABLE
重启每台服务器上的MySQL服务。
(2)在binghe152服务器和binghe153服务器上停止从库的运行。
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.01 sec)
(3)在binghe151服务器上执行锁表操作。
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)
(4)重新打开连接binghe151服务器的命令行终端,登录MySQL,查看主库的运行状态。
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000008 | 16588 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
(5)在binghe151服务器上解除锁表操作。
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
(6)在binghe152服务器上创建数据同步的账户信息。
mysql> CREATE USER 'binghe153'@'192.168.175.153' IDENTIFIED BY 'binghe153';
Query OK, 0 rows affected (0.11 sec)
mysql> ALTER USER 'binghe153'@'192.168.175.153' IDENTIFIED WITH mysql_native_password BY 'binghe153';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'binghe153'@'192.168.175.153';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
(7)在binghe152服务器上查看主库的状态。
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000008 | 16578 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
结果显示,当前的二进制日志文件为mysql-bin.000008,位置坐标为16578。
(8)在binghe153服务器上,重置从库的设置。
mysql> CHANGE MASTER TO MASTER_HOST='192.168.175.151',
-> MASTER_PORT=3306,
-> MASTER_USER='binghe153',
-> MASTER_PASSWORD='binghe153',
-> MASTER_LOG_FILE='mysql-bin.000008',
-> MASTER_LOG_POS=16588
-> FOR CHANNEL 'binghe151-master';
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> CHANGE MASTER TO MASTER_HOST='192.168.175.152',
-> MASTER_PORT=3306,
-> MASTER_USER='binghe153',
-> MASTER_PASSWORD='binghe153',
-> MASTER_LOG_FILE='mysql-bin.000008',
-> MASTER_LOG_POS=16578
-> FOR CHANNEL 'binghe152-master';
Query OK, 0 rows affected, 2 warnings (0.01 sec)
注意:如果一个从库具有多个主库时,设置从库时需要使用FOR CHANNEL指定通道。
(9)在binghe153服务器上指定通道启动MySQL从库。
mysql> START SLAVE FOR CHANNEL 'binghe151-master';
Query OK, 0 rows affected (0.00 sec)
mysql> START SLAVE FOR CHANNEL 'binghe152-master';
Query OK, 0 rows affected (0.00 sec)
(10)在binghe153服务器上查看从库的运行状态。
mysql> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Channel_Name: binghe151-master
###################省略部分输出结果##############################
*************************** 2. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Channel_Name: binghe152-master
###################省略部分输出结果##############################
在binghe153服务器上的从库运行正常,并且分别指定了不同的通道连接到binghe151服务器上的MySQL和binghe152服务器上的MySQL。
31.6.3 测试MySQL多源复制环境
(1)在binghe151服务器上,向testdb数据库的t_user数据表中插入测试数据。
mysql> INSERT INTO testdb.t_user
-> (id, t_name)
-> VALUES
-> (8, 'binghe008');
Query OK, 1 row affected (1.04 sec)
(2)在binghe153服务器上,查看数据是否同步。
mysql> SELECT * FROM testdb.t_user;
+----+-----------+
| id | t_name |
+----+-----------+
| 1 | binghe |
| 2 | binghe002 |
| 3 | binghe003 |
| 4 | binghe004 |
| 5 | binghe005 |
| 6 | binghe006 |
| 7 | binghe007 |
| 8 | binghe008 |
| 9 | binghe009 |
+----+-----------+
9 rows in set (0.12 sec)
结果显示,数据已经成功同步。
(3)在binghe152服务器上的testdb数据库下新建t_order数据表,并插入测试数据。
mysql> CREATE TABLE testdb.t_order(
-> id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> t_remark VARCHAR(30) NOT NULL DEFAULT ''
-> );
Query OK, 0 rows affected (0.24 sec)
mysql> INSERT INTO testdb.t_order(t_remark) VALUES ('order001');
Query OK, 1 row affected (0.00 sec)
(4)在binghe153服务器上查看是否同步了数据。
mysql> SELECT * FROM testdb.t_order;
+----+----------+
| id | t_remark |
+----+----------+
| 1 | order001 |
+----+----------+
1 row in set (0.00 sec)
结果显示,在binghe153服务器上成功同步了数据。
- 点赞
- 收藏
- 关注作者
评论(0)