小知识:Docker容器实现MySQL多源复制场景分析

前言

MySQL 8.0 版本中,提供多源复制多源复制的出现对于分库分表的业务提供了极大的便利,本文做了详细的说明

1.多源复制简介

MySQL 8.0 版本中,提供了多源复制,多源复制的出现对于分库分表的业务提供了极大的便利,目前我们已经部署了多套多源复制供统计使用。MySQL 5.7 之前只能实现一主一从、一主多从或者多主多从的复制。如果想实现多主一从的复制,只能使用 MariaDB,但是 MariaDB 又与官方的MySQL 版本不兼容。

MySQL 5.7 开始支持了多主一从的复制方式,也就是多源复制。MySQL 8.0 版本相比之前的版本,无论在功能还是性能安全等方面都已经有不少的提升。

拓展:MySQL之父Widenius先生离开了Sun之后,觉得依靠Sun/Oracle来发展MySQL,实在很不靠谱,于是决定另开分支,这个分支的名字叫做MariaDB。

多源复制的好处

可以集中备份,在从库上备份,不会影响线上的数据正常运行

节约购买从库服务器的成本,只需要一个从库服务器即可

数据汇总在一起,方便后期做数据统计

减轻DBA维护工作量。

2.多源复制使用场景

Backing up multiple servers to a single server.

Merging table shards.

Consolidating data from multiple servers to a single server.

%小知识:Docker容器实现MySQL多源复制场景分析-猿站网-插图

如上图,多源复制采用多通道的模式,和普通的复制相比,就是使用 FOR CHANNEL进行了分离。

CHANGE MASTERTO…FORCHANNEL’m1’;

CHANGE MASTERTO…FORCHANNEL’m2’;

开启多源复制功能必须需要在从库上设置 master-info-repository 和 relay-log-info-repository 这两个参数。

这两个参数是用来存储同步信息的,可以设置的值为 FILE 和 TABLE,5.7默认值是 FILE。

比如 master-info 就保存在 master.info 文件中,

relay-log-info 保存在 relay-log.info 文件中,

如果服务器意外关闭,正确的 relay-log-info 没有来得及更新到 relay-log.info 文件,这样会造成数据丢失。

为了数据更加安全,通常设为 TABLE。这些表都是 innodb 类型的,支持事务。

相对文件存储安全得多。在 MySQL 库下可以看见这两个表信息,分别是 mysql.slave_master_info 和 mysql.slave_relay_log_info。

这两个参数也是可以动态调整的。

SET GLOBAL master_info_repository=‘TABLE’;

SET GLOBAL relay_log_info_repository=‘TABLE’;

3.多源复制部署

搭建过程支持GTID复制模式binlog+position方式复制。

%小知识:Docker容器实现MySQL多源复制场景分析-1猿站网-插图

3.1 下载镜像

docker pull mysql:8.0.27

docker network create –subnet=172.72.0.0/24 mysql-network

docker rm -f mysql8027M33265 mysql8027M33266 mysql8027M33267 mysql8027M33268

3.2 创建映射目录

mkdir -p /mysqlmultiple/master1/conf.d

mkdir -p /mysqlmultiple/master1/data

mkdir -p /mysqlmultiple/master2/conf.d

mkdir -p /mysqlmultiple/master2/data

mkdir -p /mysqlmultiple/master3/conf.d

mkdir -p /mysqlmultiple/master3/data

mkdir -p /mysqlmultiple/slave/conf.d

mkdir -p /mysqlmultiple/slave/data 3.3 创建容器安装MySQL
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker run -d –name mysql8027M33265 \
-h master1 -p 33265:3306 —net=mysql-network –ip 172.72.0.10 \
-v /mysqlmultiple/master1/conf.d:/etc/mysql/conf.d -v /mysqlmultiple/master1/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=jem \
mysql:8.0.27
docker run -d –name mysql8027M33266 \
-h master2 -p 33266:3306 –net=mysql-network –ip 172.72.0.11 \
-v /mysqlmultiple/master2/conf.d:/etc/mysql/conf.d -v /mysqlmultiple/master2/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=jem \
mysql:8.0.27
docker run -d –name mysql8027M33267 \
-h master3 -p 33267:3306 –net=mysql-network –ip 172.72.0.12 \
-v /mysqlmultiple/master3/conf.d:/etc/mysql/conf.d -v /mysqlmultiple/master3/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=jem \
mysql:8.0.27
docker run -d –name mysql8027S33268 \
-h slave1 -p 33268:3306 –net=mysql-network –ip 172.72.0.13 \
-v /mysqlmultiple/slave/conf.d:/etc/mysql/conf.d -v /mysqlmultiple/slave/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=jem \
mysql:8.0.27
3.4 参数文件配置
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
cat > /mysqlmultiple/master1/conf.d/my.cnf << “EOF”
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=
server-id = 802733265
log-bin =
binlog_format=row
expire_logs_days = 30
max_binlog_size = 100M
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys
replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
replicate_ignore_db=mysql
replicate_ignore_db=sys
gtid-mode=ON
enforce-gtid-consistency=on
skip_name_resolve
report_host=172.72.0.10
EOF
cat > /mysqlmultiple/master2/conf.d/my.cnf << “EOF”
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=
server-id = 802733266
log-bin =
binlog_format=row
expire_logs_days = 30
max_binlog_size = 100M
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys
replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
replicate_ignore_db=mysql
replicate_ignore_db=sys
gtid-mode=ON
enforce-gtid-consistency=ON
skip_name_resolve
report_host=172.72.0.11
EOF
cat > /mysqlmultiple/master3/conf.d/my.cnf << “EOF”
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=
server-id = 802733267
log-bin =
binlog_format=row
expire_logs_days = 30
max_binlog_size = 100M
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys
replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
replicate_ignore_db=mysql
replicate_ignore_db=sys
gtid-mode=ON
enforce-gtid-consistency=ON
skip_name_resolve
report_host=172.72.0.12
EOF
cat > /mysqlmultiple/slave/conf.d/my.cnf << “EOF”
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=
server-id = 802733268
log-bin =
binlog_format=row
expire_logs_days = 30
max_binlog_size = 100M
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys
replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
replicate_ignore_db=mysql
replicate_ignore_db=sys
gtid-mode=ON
enforce-gtid-consistency=ON
skip_name_resolve
report_host=172.72.0.13
master-info-repository = table
relay-log-info-repository = table
EOF
docker restart mysql8027M33265
docker restart mysql8027M33266
docker restart mysql8027M33267
docker restart mysql8027S33268
docker ps

登陆容器,确认数据

docker ps –format “table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}”

%小知识:Docker容器实现MySQL多源复制场景分析-2猿站网-插图

3.5 登陆MySQL
?
1
2
3
4
5
6
7
8
9
10
11
docker exec -it mysql8027M33265 mysql -uroot -pjem
mysql -uroot -pjem -h192.168.1.54 -P33265 -e “select @@hostname,@@server_id,@@server_uuid”
mysql -uroot -pjem -h192.168.1.54 -P33266 -e “select @@hostname,@@server_id,@@server_uuid”
mysql -uroot -pjem -h192.168.1.54 -P33267 -e “select @@hostname,@@server_id,@@server_uuid”
mysql -uroot -pjem -h192.168.1.54 -P33268 -e “select @@hostname,@@server_id,@@server_uuid”
远程登陆需要修改密码
docker exec -it mysql8027M33266 mysql -uroot -pjem
mysql> alter user root@% identified with mysql_native_password by root;   –更改密码
mysql>  flush privileges;
docker exec -it mysql8027S33268 mysql -uroot -pjem

4.主从配置

4.1 主库配置
?
1
2
3
4
5
6
7
8
9
10
11
–在 3 台主库
mysql -uroot -proot -h192.168.1.54 -P33265
mysql -uroot -proot -h192.168.1.54 -P33266
mysql -uroot -proot -h192.168.1.54 -P33267
mysql> create user repl@% identified with mysql_native_password by root;
mysql> grant all on *.* to repl@% with grant option;
mysql> flush privileges;
select user,host,grant_priv,password_last_changed,authentication_string from mysql.user;
show master status \G;
show slave hosts;
select @@hostname,@@server_id,@@server_uuid;
4.2 从库配置
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
mysql -uroot -proot -h192.168.1.54 -P33268
change master to
master_host=172.72.0.10,
master_port=3306,master_user=repl,
master_password=root,
master_auto_position=1 FOR CHANNEL Master1;
show slave status \G;
— 启动所有 SLAVE
mysql> START SLAVE;
–主库创建数据测试
mysql -uroot -proot -h192.168.1.54 -P33265
mysql> create database test;
–主库2和3
change master to
master_host=172.72.0.11,
master_port=3306,
master_user=repl,
master_password=root,
master_auto_position=1 FOR CHANNEL Master2;
change master to
master_host=172.72.0.12,
master_port=3306,
master_user=repl,
master_password=root,
master_auto_position=1 FOR CHANNEL Master3;
— 也可以单独启动需要同步的通道
START SLAVE FOR CHANNEL master2;
START SLAVE FOR CHANNEL master3;
select a.master_log_pos,a.host,a.user_name,a.user_password,a.port,a.uuid,a.channel_name
from mysql.slave_master_info a;

%小知识:Docker容器实现MySQL多源复制场景分析-3猿站网-插图

%小知识:Docker容器实现MySQL多源复制场景分析-4猿站网-插图

5.测试多源复制

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
— mysql -uroot -proot -h192.168.1.54 -P33265
create database master1;
use master1;
CREATE TABLE `test1` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
insert into test1 values(1,1);
— mysql -uroot -proot -h192.168.1.54 -P33266
create database master2;
use master2;
CREATE TABLE `test2` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
insert into test2 values(2,2);
— mysql -uroot -proot -h192.168.1.54 -P33267
create database master3;
use master3;
CREATE TABLE `test3` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
insert into test3 values(3,3);
–从库查询
— mysql -uroot -proot -h192.168.1.54 -P33268
show databases;
SELECT * FROM master1.test1;
SELECT * FROM master2.test2;
SELECT * FROM master3.test3;

6. 注意的点

1、初次配置耗时较长,需要将各个 master 的数据 dump 下来,再 source 到 slave 上。

2、需要考虑各 master 数据增长频率,slave 的数据增长频率是这些数据的总和。如果太高,会导致大量的磁盘 IO,造成数据更新延迟,最严重的是会影响正常的查询。

3、如果多个主数据库实例中存在同名的库,则同名库的表都会放到一个库中;

4、如果同名库中的表名相同且结构相同,则数据会合并到一起;如果结构不同,则先建的有效。

到此这篇关于Docker容器实现MySQL多源复制的文章就介绍到这了,更多相关Docker MySQL多源复制内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_41645135/article/details/125256808

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:安装harbor作为docker镜像仓库的问题

2023-3-6 14:59:10

建站知识

小知识:Docker Desktop更改镜像存储位置的实现

2023-3-6 15:05:56

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索