一、多源复制简介
所谓多源复制,就是多台主库的数据同步到一台从库服务器上,从库创建通往每个主库的管道。在Mysql5.7之前的版本中,只支持一主一从,一主多从,多主多从的复制架构。从Mysql5.7版本开始支持多主一从的复制方式。搭建过程支持GTID复制模式和binlog+position方式复制。多源复制的好处:
- 可以集中备份,在从库上备份,不会影响线上的数据正常运行;
- 节约购买从库服务器的成本,只需要一个从库服务器即可;
- 数据汇总在一起,方便后期做数据统计;
- 减轻DBA维护工作量。
本博文以GTID复制方式介绍多主一从的搭建方式。
二、多源复制搭建步骤
1、主从规划
序号 | 角色 | server-id | 主机IP | 主机名 |
---|---|---|---|---|
1 | master | 124 | 192.168.0.124 | test1 |
2 | master | 125 | 192.168.0.125 | test2 |
3 | slave | 126 | 192.168.0.126 | test3 |
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步。