我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Docker容器如何实现MySQL多源复制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Docker容器如何实现MySQL多源复制

今天小编给大家分享一下Docker容器如何实现MySQL多源复制的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    ⛳️ 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多源复制

    ✨ 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.27docker 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.27docker 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.27docker 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=mysqlport=3306character_set_server=utf8mb4secure_file_priv=server-id = 802733265log-bin =binlog_format=rowexpire_logs_days = 30max_binlog_size = 100Mbinlog-ignore-db = mysqlbinlog-ignore-db = information_schemabinlog-ignore-db = performance_schemabinlog-ignore-db = sysreplicate_ignore_db=information_schemareplicate_ignore_db=performance_schemareplicate_ignore_db=mysqlreplicate_ignore_db=sysgtid-mode=ONenforce-gtid-consistency=onskip_name_resolvereport_host=172.72.0.10EOFcat > /mysqlmultiple/master2/conf.d/my.cnf << "EOF"[mysqld]user=mysqlport=3306character_set_server=utf8mb4secure_file_priv=server-id = 802733266log-bin =binlog_format=rowexpire_logs_days = 30max_binlog_size = 100Mbinlog-ignore-db = mysqlbinlog-ignore-db = information_schemabinlog-ignore-db = performance_schemabinlog-ignore-db = sysreplicate_ignore_db=information_schemareplicate_ignore_db=performance_schemareplicate_ignore_db=mysqlreplicate_ignore_db=sysgtid-mode=ONenforce-gtid-consistency=ONskip_name_resolvereport_host=172.72.0.11EOFcat > /mysqlmultiple/master3/conf.d/my.cnf << "EOF"[mysqld]user=mysqlport=3306character_set_server=utf8mb4secure_file_priv=server-id = 802733267log-bin =binlog_format=rowexpire_logs_days = 30max_binlog_size = 100Mbinlog-ignore-db = mysqlbinlog-ignore-db = information_schemabinlog-ignore-db = performance_schemabinlog-ignore-db = sysreplicate_ignore_db=information_schemareplicate_ignore_db=performance_schemareplicate_ignore_db=mysqlreplicate_ignore_db=sysgtid-mode=ONenforce-gtid-consistency=ONskip_name_resolvereport_host=172.72.0.12EOFcat > /mysqlmultiple/slave/conf.d/my.cnf << "EOF"[mysqld]user=mysqlport=3306character_set_server=utf8mb4secure_file_priv=''server-id = 802733268log-bin =binlog_format=rowexpire_logs_days = 30max_binlog_size = 100Mbinlog-ignore-db = mysqlbinlog-ignore-db = information_schemabinlog-ignore-db = performance_schemabinlog-ignore-db = sysreplicate_ignore_db=information_schemareplicate_ignore_db=performance_schemareplicate_ignore_db=mysqlreplicate_ignore_db=sysgtid-mode=ONenforce-gtid-consistency=ONskip_name_resolvereport_host=172.72.0.13master-info-repository = tablerelay-log-info-repository = tableEOFdocker restart mysql8027M33265docker restart mysql8027M33266docker restart mysql8027M33267docker restart mysql8027S33268docker ps

     登陆容器,确认数据
    docker ps --format “table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}”

    Docker容器如何实现MySQL多源复制

    ✨ 3.5 登陆MySQL
    docker exec -it mysql8027M33265 mysql -uroot -pjemmysql -uroot -pjem -h292.168.1.54 -P33265 -e "select @@hostname,@@server_id,@@server_uuid"mysql -uroot -pjem -h292.168.1.54 -P33266 -e "select @@hostname,@@server_id,@@server_uuid"mysql -uroot -pjem -h292.168.1.54 -P33267 -e "select @@hostname,@@server_id,@@server_uuid"mysql -uroot -pjem -h292.168.1.54 -P33268 -e "select @@hostname,@@server_id,@@server_uuid"远程登陆需要修改密码docker exec -it mysql8027M33266 mysql -uroot -pjemmysql> 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 -h292.168.1.54 -P33265mysql -uroot -proot -h292.168.1.54 -P33266mysql -uroot -proot -h292.168.1.54 -P33267mysql> 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 -h292.168.1.54 -P33268change master tomaster_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;-- 启动所有 SLAVEmysql> START SLAVE;--主库创建数据测试mysql -uroot -proot -h292.168.1.54 -P33265mysql> create database test;--主库2和3change master tomaster_host='172.72.0.11',master_port=3306,master_user='repl',master_password='root',master_auto_position=1 FOR CHANNEL 'Master2';change master tomaster_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多源复制

    Docker容器如何实现MySQL多源复制

    ⛳️ 5.测试多源复制

    -- mysql -uroot -proot -h292.168.1.54 -P33265create 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 -h292.168.1.54 -P33266create 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 -h292.168.1.54 -P33267create 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 -h292.168.1.54 -P33268show databases;SELECT * FROM master1.test1;SELECT * FROM master2.test2;SELECT * FROM master3.test3;

    ⛳️ 6. 注意的点

    初次配置耗时较长,需要将各个 master 的数据 dump 下来,再 source 到 slave 上。
    2、需要考虑各 master 数据增长频率,slave 的数据增长频率是这些数据的总和。如果太高,会导致大量的磁盘 IO,造成数据更新延迟,最严重的是会影响正常的查询。
    3、如果多个主数据库实例中存在同名的库,则同名库的表都会放到一个库中;
    4、如果同名库中的表名相同且结构相同,则数据会合并到一起;如果结构不同,则先建的有效。

    以上就是“Docker容器如何实现MySQL多源复制”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Docker容器如何实现MySQL多源复制

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Docker容器如何实现MySQL多源复制

    今天小编给大家分享一下Docker容器如何实现MySQL多源复制的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。⛳️ 1.多源
    2023-07-02

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

    目录前言⛳️ 1.多源复制简介⛳️ 2.多源复制使用场景⛳️ 3.多源复制部署✨ 3.1 下载镜像✨ 3.3 创建容器,安装mysql✨ 3.4 参数文件配置✨ 3.5 登陆MySQL⛳️ 4.主从配置✨ 4.1 主库配置✨ 4.2 从库配
    2022-06-13

    Docker如何实现CPU资源限制

    这篇文章主要介绍了Docker如何实现CPU资源限制,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一: 描述 Windows系统使用 --cpu-period int
    2023-06-04

    Docker如何实现Memory资源限制

    这篇文章主要为大家展示了“Docker如何实现Memory资源限制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Docker如何实现Memory资源限制”这篇文章吧。一:简介docker通过cg
    2023-06-04

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

    目录一 主从复制概念二 主从复制的优势三 docker容器实现mysql主从复制3.1 创建主服务器容器3.2 新建主配置文件 my.cnf3.3 重启master容器实例3.4 进入mysql-master容器3.5 在主服务器中创建用户
    2022-11-29

    docker容器热迁移如何实现

    Docker容器热迁移可以通过以下步骤实现:使用Docker Swarm或Kubernetes等容器编排工具来管理容器,以确保容器在不同主机上运行。在需要迁移的容器上运行容器检查点工具,例如CRIU(Checkpoint and Resto
    2023-10-27

    Docker link如何实现容器互联

    小编给大家分享一下Docker link如何实现容器互联,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.1、容器间通过IP进行网络访问新建两个容器tomcat0
    2023-06-22

    docker link容器互联如何实现

    这篇“docker link容器互联如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“docker link容器互联如何
    2023-06-29

    mysql如何实现多主双向和级联复制

    这篇文章主要为大家展示了“mysql如何实现多主双向和级联复制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql如何实现多主双向和级联复制”这篇文章吧。一.解读在离线状态的切换,对于web
    2023-06-26

    Docker容器网络更改如何实现

    这篇文章主要介绍了Docker容器网络更改如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Docker容器网络更改如何实现文章都会有所收获,下面我们一起来看看吧。1.添加自定义网络(默认是桥接模式)doc
    2023-07-05

    如何使用容器化和Docker实现DevOps

    这篇文章主要介绍“如何使用容器化和Docker实现DevOps”,在日常操作中,相信很多人在如何使用容器化和Docker实现DevOps问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用容器化和Docke
    2023-06-19

    docker中如何实现容器虚拟化网络

    这篇文章主要为大家展示了“docker中如何实现容器虚拟化网络”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“docker中如何实现容器虚拟化网络”这篇文章吧。overlay network(叠加
    2023-06-04

    编程热搜

    目录