Docker容器实现MySQL多源复制场景分析

目录
  • 前言
    • ️ 1.多源复制简介
    • ️ 2.多源复制使用场景
    • ️ 3.多源复制部署
      • 3.1 下载镜像
      • 3.3 创建容器,安装MySQL
      • 3.4 参数文件配置
      • 3.5 登陆MySQL
    • ️ 4.主从配置
      • 4.1 主库配置
      • 4.2 从库配置
    • ️ 5.测试多源复制
    • ️ 6. 注意的点

前言

在 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.

如上图,多源复制采用多通道的模式,和普通的复制相比,就是使用 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方式复制。

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

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 参数文件配置

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}}”

3.5 登陆MySQL

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 主库配置

--在 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 从库配置

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;

️ 5.测试多源复制

-- 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多源复制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql 5.7 docker 主从复制架构搭建教程

    分享mysql 5.7 docker 主从复制架构搭建教程,供大家参考,具体内容如下 环境版本: MySQL :  5.7.13 Docker : 1.11.2 CentOS : 7.1 1.先在两个物理机上分别安装两个MySQL.命令如下 复制代码 代码如下: docker pull mysql:5.7.13  docker run --name anuo-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=qaz.00JK -d mysql:5.7.13 2.

  • docker实现mysql主从复制的示例代码

    目录 一.概述 1.原理 2.实现 三.创建Slave实例 四.主从配置 总结: 五.参考 一.概述 1.原理 master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中: slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启

  • 使用Docker容器搭建MySql主从复制

    1. 编写主MySQL的Docker文件 新建文件夹,命名为MySQL-master-v1.在文件夹mysql-master-v1中新建文件Dockerfile和master.cnf.笔者推荐使用的编辑器是Visual Studio Code.利用编辑器将这两个文件的编码设置成UTF-8.因为本文介绍安装到Linux系统下,所以笔者建议读者把换行符设置成LF,以兼顾Linux操作系统.按照如下内容编写这两个文件. Dockerfile FROM mysql:5.7 # set timezone

  • 基于Docker如何实现MySQL主从复制详解

    前言 MySQL的主从复制是实现应用的高性能,高可用的基础.对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同MySQL服务器,可有效减轻数据库压力.当遇到MySQL单点故障中,也能在短时间内实现故障切换.本文就MySQL的内建的复制功能进行阐述. 版本 MySQl: 5.7.17 CentOS: 7.4.1708 Docker: 1.13.1 概述 MySQL复制数据流程: 主库在数据更新提交事务之前,将事件异步记录到binlog二进制日志文件中,日志记录完成后存储引擎提交本次事

  • 详解Docker方式实现MySql 主从复制(实践篇)

    本文实践了用Docker方式来实现基于binlog的MySql主从复制.关于MySql主从复制的原理将在下一篇中进行讲解. 一些数据的本地存储目录结构 mysql >tree -L 2 . ├── data │ ├── master01 │ └── slave01 ├── master01 │ └── master01.cnf └── slave01 └── slave01.cnf master01.cnf配置 [mysqld] log-bin=mysql-master01-bin # 使用bi

  • 详解如何利用docker快速构建MySQL主从复制环境

    在学习MySQL的过程中,常常会测试各种参数的作用.这时候,就需要快速构建出MySQL实例,甚至主从. 考虑如下场景: 譬如我想测试mysqldump在指定--single-transaction参数的情况下,对于myisam表的影响. 本来想在现成的测试环境中进行,但测试环境中,有大量的数据,执行mysqldump进行全备,产生的SQL文件,很难基于表进行搜索. 这个时候,就特别渴望能有一套干净的实例进行测试. 此刻,快速构建能力就显得尤为必要,很多童鞋可能会问,通过脚本不就能实现么?为什么要

  • 基于Docker的MySQL主从复制环境搭建的实现步骤

    1. 前言 之前的程序架构可能是这样的一种形式: 当程序体量扩大后,我们进行扩展,可能会扩展多个后台服务实例,但数据库还是只有一个,所以系统的瓶颈还是在数据库上面,所以这次的主要任务就是对数据库进行扩展,主要形式为:扩展多台数据库实例,实现读写分离,对于一些写的任务分配到主数据库,对于读的任务使用子数据库进行读取.从而提高系统性能. 修改后的架构如下所示: 2. 环境预搭建 这次使用docker来进行这个环境的搭建,使用MySQL版本为5.7.13. docker pull mysql:5.7.

  • Docker容器实现MySQL多源复制场景分析

    目录 前言 ️ 1.多源复制简介 ️ 2.多源复制使用场景 ️ 3.多源复制部署 3.1 下载镜像 3.3 创建容器,安装MySQL 3.4 参数文件配置 3.5 登陆MySQL ️ 4.主从配置 4.1 主库配置 4.2 从库配置 ️ 5.测试多源复制 ️ 6. 注意的点 前言 在 MySQL 8.0 版本中,提供了多源复制,多源复制的出现对于分库分表的业务提供了极大的便利,本文做了详细的说明 ️ 1.多源复制简介 在 MySQL 8.0 版本中,提供了多源复制,多源复制的出现对于分库分表的业

  • VMware中安装CentOS7(设置静态IP地址)并通过docker容器安装mySql数据库(超详细教程)

    一位读大二的学弟问我怎么安装配置这些,我简单的整了一个教程,这里记录一下,并分享给需要的朋 安装过程学习使用足够,实际工作中有些繁琐的配置略过了! 打开VM虚拟机,菜单栏[文件]-->选择[新建虚拟机],选择"o自定义(高级)"-->[下一步] 默认一直点[下一步]到选择安装盘的位置,选择自己已经下载好的官方DVD镜像文件(不要整别的镜像,避免走不必要 的坑) [下一步]设置虚拟机名称(取一个合适的名称,设置合适的路径) 处理器设置默认,安装好虚拟centos后可以根据情况

  • docker容器的四种端口映射演示分析

    端口映射 把容器的端口映射为宿主机的一个随机或者特定端口,使用外部用户可以访问容器服务 端口映射本是在容器底层做了 iptables 地址转发,出去的流量做 SNAT 源地址转发,进来的流量做 DNAT 目标地址转发. 四种端口映射 随机端口映射:就是把容器的端口随机映射为宿主机的一个端口. 指定端口映射:就是把容器的端口映射为宿主机的指定端口. 指定网卡随机端口映射:就是把容器的端口映射为宿主机的指定网卡的随机端口. 指定网卡端口映射:就是把容器的端口映射为宿主机的指定网卡的指定端口. 端口映

  • Docker容器中Mysql数据的导入/导出详解

    前言 Mysql数据的导入导出我们都知道一个mysqldump命令就能够解决,但如果是运行在docker环境下的mysql呢? 解决办法其实还是用mysqldump命令,但是我们需要进入docker的mysql容器内去执行它,并且通过配置volumes让导出的数据文件可以拷贝到宿主机的磁盘上 所以操作步骤就可以分为: 配置docker的volumes 进入docker的mysql容器,导出数据文件 至于数据导入,太过简单,就不说了 先来看看mysqldump命令常见选项: --all-datab

  • 一文教会你在Docker容器中实现Mysql主从复制

    目录 一 主从复制概念 二 主从复制的优势 三 Docker容器实现Mysql主从复制 3.1 创建主服务器容器 3.2 新建主配置文件 my.cnf 3.3 重启master容器实例 3.4 进入mysql-master容器 3.5 在主服务器中创建用户并授权 3.6 创建从服务器容器 3.7 新建主配置文件 my.cnf 3.8 重启slave容器实例 3.9 在主数据库中查看主从同步状态 3.10 进入mysql-slave容器 3.11 在从数据库中配置主从复制 3.12 在从数据库中查

  • Docker创建一个mysql容器并保存为本地镜像

    查找docker hub上的镜像 [root@wls12c ~]$ docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relati... 2903 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Crea... 190 [OK] centurylink/mysql

  • Docker容器与主机间的文件传输方法(复制/上传/下载)

    1.首先启动容器(以first-mysql容器为例) docker start first-mysql 2.查看容器ID root@kobe:/opt/software/temp/test# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 688e83c55129 mysql "docker-entrypoint.s-" 6 days ago Up 3 seconds 0.0.0.0:3306->33

  • 基于spring-boot和docker-java实现对docker容器的动态管理和监控功能[附完整源码下载]

    docker简介 Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者喜爱.随着基于docker的开发者越来越多,docker的镜像也原来越丰富,未来各种企业级的完整解决方案都可以直接通过下载镜像拿来即用.因此docker变得越来越重要. 本文目的 本文通过一个项目实例来介绍如果通过docker对外接口来实现对docker容器的管理和监控. 应用场景: 对服务器资源池通过docker进行统一管理,按需分配资源和创建容器,达到资源最大化利

  • Docker容器启动时初始化Mysql数据库的方法

    1. 前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行.那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案. 第一种方案是在容器启动后手动导入,太low了不行.第二种在Spring Boot客户端连接Mysql容器时初始化数据库,你可以参考使用flyway进行数据库版本控制一文,但是这依赖客户端的能力.能不能做到Mysql容器启动时就自己初始化数据库呢?当然可以!今天就来演示一下.全部代码见文末. 2.

随机推荐