Mysql之多源复制

一、多源复制简介

  所谓多源复制,就是多台主库的数据同步到一台从库服务器上,从库创建通往每个主库的管道。在Mysql5.7之前的版本中,只支持一主一从,一主多从,多主多从的复制架构。从Mysql5.7版本开始支持多主一从的复制方式。搭建过程支持GTID复制模式和binlog+position方式复制。多源复制的好处:

  1. 可以集中备份,在从库上备份,不会影响线上的数据正常运行;
  2. 节约购买从库服务器的成本,只需要一个从库服务器即可;
  3. 数据汇总在一起,方便后期做数据统计;
  4. 减轻DBA维护工作量。
    本博文以GTID复制方式介绍多主一从的搭建方式。

二、多源复制搭建步骤

1、主从规划

序号角色server-id主机IP主机名
1master124192.168.0.124test1
2master125192.168.0.125test2
3slave126192.168.0.126test3

2、安装数据库

使用RPM方式安装mysql5.7数据库

rpm -ivh mysql-community-common-5.7.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.33-1.el7.x86_64.rpm

3、配置GTID复制参数

test1添加GTID参数配置

#GTID配置
server-id=124
log_bin=mysql-bin
log_slave_updates=1
gtid_mode=on
enforce_gtid_consistency=on
binlog_format=row

test2添加GTID参数配置

#GTID配置
server-id=125
log_bin=mysql-bin
log_slave_updates=1
gtid_mode=on
enforce_gtid_consistency=on
binlog_format=row

test3添加GTID参数配置

#GTID配置
server-id=126
log_bin=mysql-bin
log_slave_updates=1
gtid_mode=on
enforce_gtid_consistency=on
binlog_format=row
#多源复制从库配置
master_info_repository=table
relay_log_info_repository=table

4、创建复制账号

mysql> create user bak124@’%’ identified by ‘Test!123’;
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on . to bak124@’%’;
Query OK, 0 rows affected (0.00 sec)

mysql> create user bak125@’%’ identified by ‘Test!123’;
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on . to bak125@’%’;
Query OK, 0 rows affected (0.00 sec)

5、主库上备份导出需要同步的库

假设test1主库上需要同步备份的库未db124和test124,test2主库上需要备份的库为test125,首先在主库上创建数据库,然后使用mysqldump备份工具导出需要同步的库。

mysql> create database db124;
Query OK, 1 row affected (0.01 sec)

mysql> create database test124;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
[root@test1 opt]# mysqldump -uroot -p --master-data=2 --single-transaction --set-gtid-purged=OFF --databases --add-drop-database db124 test124 > s124.sql
Enter password:

mysql> create database test125;
Query OK, 1 row affected (0.03 sec)

mysql> exit
Bye
[root@test2 opt]# mysqldump -uroot -p --master-data=2 --single-transaction --set-gtid-purged=OFF --databases --add-drop-database test125 > s125.sql
Enter password:

6、从库上导入主库备份的库

[root@test3 opt]# mysql -uroot -p < s124.sql
Enter password:
[root@test3 opt]# mysql -uroot -p < s125.sql
Enter password:
[root@test3 opt]#

7、配置主从复制

mysql> change master to
-> MASTER_HOST=‘192.168.0.124’,
-> MASTER_USER=‘bak124’,
-> MASTER_PASSWORD=‘Test!123’,
-> MASTER_PORT=3306,
-> master_auto_position=1 for CHANNEL ‘s124’;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> change master to
-> MASTER_HOST=‘192.168.0.125’,
-> MASTER_USER=‘bak125’,
-> MASTER_PASSWORD=‘Test!123’,
-> MASTER_PORT=3306,
-> master_auto_position=1 for CHANNEL ‘s125’;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

8、开启主从复制

mysql> start slave for channel ‘s124’;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave for channel ‘s125’;
Query OK, 0 rows affected (0.01 sec)

9、验证数据是否同步

1)、在test1主库上新建表

mysql> use db124;
Database changed
mysql> CREATE TABLE IF NOT EXISTS `t1`(
-> `runoob_id` INT UNSIGNED AUTO_INCREMENT,
-> `runoob_company` VARCHAR(100) NOT NULL,
-> `runoob_name` VARCHAR(40) NOT NULL,
-> PRIMARY KEY ( `runoob_id` )
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.04 sec)

mysql> use test124;
Database changed
mysql> CREATE TABLE IF NOT EXISTS `t2`(
-> `s124_id` INT UNSIGNED AUTO_INCREMENT,
-> `s124_company` VARCHAR(100) NOT NULL,
-> `s124_name` VARCHAR(40) NOT NULL,
-> PRIMARY KEY ( `s124_id` )
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t2 (s124_id,s124_company,s124_name) values (‘1’,‘yhxx’,‘wuhs’);
Query OK, 1 row affected (0.05 sec)

2)、在test3从库上查看

mysql> use db124;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
±----------------+
| Tables_in_db124 |
±----------------+
| t1 |
±----------------+
1 row in set (0.00 sec)
mysql> select * from test124.t2;
±--------±-------------±----------+
| s124_id | s124_company | s124_name |
±--------±-------------±----------+
| 1 | yhxx | wuhs |
±--------±-------------±----------+
1 row in set (0.00 sec)

3)、在test2主库上新建表

mysql> CREATE TABLE IF NOT EXISTS `t3`(
-> `s125_id` INT UNSIGNED AUTO_INCREMENT,
-> `s125_company` VARCHAR(100) NOT NULL,
-> `s125_name` VARCHAR(40) NOT NULL,
-> PRIMARY KEY ( `s125_id` )
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.04 sec)
mysql> insert into t3 (s125_id,s125_company,s125_name) values (‘1’,‘sac’,‘sunru’);
Query OK, 1 row affected (0.01 sec)

mysql> insert into t3 (s125_id,s125_company,s125_name) values (‘2’,‘yhxx’,‘wuhs’);
Query OK, 1 row affected (0.01 sec)

4)、在test3从库上查看

mysql> select * from t3;
±--------±-------------±----------+
| s125_id | s125_company | s125_name |
±--------±-------------±----------+
| 1 | sac | sunru |
| 2 | yhxx | wuhs |
±--------±-------------±----------+
2 rows in set (0.00 sec)
----------------------------我是华丽的分割线----------------------------
至此Mysql5.7两主一从复制模式搭建完成

三、常用检查命令及注意事项

1、常用命令

  • show slave status for channel 'id’查看单个channel slave的状态

mysql> show slave status for channel ‘s124’\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.124
Master_User: bak124
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 2085
Relay_Log_File: test3-relay-bin-s124.000002
Relay_Log_Pos: 2298
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Retrieved_Gtid_Set: b9468eb8-74db-11eb-8e41-000c290b9fa0:1-8
Executed_Gtid_Set: b799ae0c-74db-11eb-8404-000c2964c7fe:1-8,
b8253ff7-74db-11eb-9897-000c29043152:1-3,
b9468eb8-74db-11eb-8e41-000c290b9fa0:1-8
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name: s124
Master_TLS_Version:
1 row in set (0.00 sec)

  • 通过查询replication_connection_status检查主从同步状态信息

mysql> select * from performance_schema.replication_connection_status\G
*************************** 1. row ***************************
CHANNEL_NAME: s124
GROUP_NAME:
SOURCE_UUID: b9468eb8-74db-11eb-8e41-000c290b9fa0
THREAD_ID: 77
SERVICE_STATE: ON
COUNT_RECEIVED_HEARTBEATS: 23
LAST_HEARTBEAT_TIMESTAMP: 2021-02-22 22:09:02
RECEIVED_TRANSACTION_SET: b9468eb8-74db-11eb-8e41-000c290b9fa0:1-8
LAST_ERROR_NUMBER: 0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00
*************************** 2. row ***************************
CHANNEL_NAME: s125
GROUP_NAME:
SOURCE_UUID: b799ae0c-74db-11eb-8404-000c2964c7fe
THREAD_ID: 79
SERVICE_STATE: ON
COUNT_RECEIVED_HEARTBEATS: 22
LAST_HEARTBEAT_TIMESTAMP: 2021-02-22 22:08:52
RECEIVED_TRANSACTION_SET: b799ae0c-74db-11eb-8404-000c2964c7fe:1-8
LAST_ERROR_NUMBER: 0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00
2 rows in set (0.00 sec)

2、注意事项

  • 多个master上不能拥有相同的数据库名,否则在从库会出现数据覆盖的现象;
  • master1、master2——>slave复制账号要求不一致;
  • 在从库需要设置参数将主从间复制信息记录到表中,见搭建步骤第3步;
  • 如果是新建库,可以跳过第5步和第6步。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恒悦sunsite

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值