docker compose实现mysql一主多从

参考了很多博客,死磕了几天,最终跑起来了,不容易,晚上喝瓶82年可乐庆祝下。

1、整体文件结构,这里忽略log、conf、data映射目录
在这里插入图片描述
2、docker-compose.yml文件内容如下:

version: '3.3'
services:mysql-master:image: mysqlcontainer_name: mysql-masterhealthcheck:test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]interval: 5stimeout: 3sretries: 3environment:MYSQL_ROOT_PASSWORD: "123456"MASTER_SYNC_USER: "sync_admin" #设置脚本中定义的用于同步的账号MASTER_SYNC_PASSWORD: "123456" #设置脚本中定义的用于同步的密码ADMIN_USER: "root" #当前容器用于拥有创建账号功能的数据库账号ADMIN_PASSWORD: "123456"ALLOW_HOST: "10.10.%.%" #允许同步账号的host地址TZ: "Asia/Shanghai" #解决时区问题networks:mysql:ipv4_address: "10.10.10.10" #固定ip,因为从库在连接master的时候,需要设置hostvolumes:- /root/mysql/master:/docker-entrypoint-initdb.d #挂载master脚本command:- "--server-id=100"- "--character-set-server=utf8mb4"- "--collation-server=utf8mb4_unicode_ci"- "--log-bin=mysql-bin"- "--sync_binlog=1"mysql-slave1:image: mysqlcontainer_name: mysql-slave1depends_on:mysql-master:condition: service_healthyenvironment:MYSQL_ROOT_PASSWORD: "123456"SLAVE_SYNC_USER: "sync_admin" #用于同步的账号,由master创建SLAVE_SYNC_PASSWORD: "123456"ADMIN_USER: "root"ADMIN_PASSWORD: "123456"MASTER_HOST: "10.10.10.10" #master地址,开启主从同步需要连接masterTZ: "Asia/Shanghai" #设置时区networks:- mysqlvolumes:- /root/mysql/slave1:/docker-entrypoint-initdb.d #挂载slave脚本command:- "--server-id=200"- "--character-set-server=utf8mb4"- "--collation-server=utf8mb4_unicode_ci"mysql-slave2:image: mysqlcontainer_name: mysql-slave2depends_on:mysql-master:condition: service_healthyenvironment:MYSQL_ROOT_PASSWORD: "123456"SLAVE_SYNC_USER: "sync_admin"SLAVE_SYNC_PASSWORD: "123456"ADMIN_USER: "root"ADMIN_PASSWORD: "123456"MASTER_HOST: "10.10.10.10"TZ: "Asia/Shanghai"networks:- mysqlvolumes:- /root/mysql/slave2:/docker-entrypoint-initdb.dcommand: #这里需要修改server-id,保证每个mysql容器的server-id都不一样- "--server-id=300"- "--character-set-server=utf8mb4"- "--collation-server=utf8mb4_unicode_ci"
networks:mysql:driver: bridgeipam:driver: defaultconfig:- subnet: "10.10.0.0/16"

3、create_sync_user.sh文件内容如下:

#!/usr/bin/env bash
#定义用于同步的用户名
MASTER_SYNC_USER=${MASTER_SYNC_USER:-sync_admin}
#定义用于同步的用户密码
MASTER_SYNC_PASSWORD=${MASTER_SYNC_PASSWORD:-123456}
#定义用于登录mysql的用户名
ADMIN_USER=${ADMIN_USER:-root}
#定义用于登录mysql的用户密码
ADMIN_PASSWORD=${ADMIN_PASSWORD:-123456}
#定义运行登录的host地址
ALLOW_HOST=${ALLOW_HOST:-%}
#定义创建账号的sql语句
CREATE_USER_SQL="CREATE USER '$MASTER_SYNC_USER'@'$ALLOW_HOST' IDENTIFIED BY '$MASTER_SYNC_PASSWORD';"
#定义赋予同步账号权限的sql,这里设置两个权限,REPLICATION SLAVE,属于从节点副本的权限,REPLICATION CLIENT是副本客户端的权限,可以执行show master status语句
GRANT_PRIVILEGES_SQL="GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO '$MASTER_SYNC_USER'@'$ALLOW_HOST';"
#定义刷新权限的sql
FLUSH_PRIVILEGES_SQL="FLUSH PRIVILEGES;"
#执行sql
mysql -u"$ADMIN_USER" -p"$ADMIN_PASSWORD" -e "$CREATE_USER_SQL $GRANT_PRIVILEGES_SQL $FLUSH_PRIVILEGES_SQL"

4、slave.sh文件内容如下:

#!/usr/bin/env bash
#定义连接master进行同步的账号
SLAVE_SYNC_USER="${SLAVE_SYNC_USER:-sync_admin}"
#定义连接master进行同步的账号密码
SLAVE_SYNC_PASSWORD="${SLAVE_SYNC_PASSWORD:-123456}"
#定义slave数据库账号
ADMIN_USER="${ADMIN_USER:-root}"
#定义slave数据库密码
ADMIN_PASSWORD="${ADMIN_PASSWORD:-123456}"
#定义连接master数据库host地址
MASTER_HOST="${MASTER_HOST:-%}"
#连接master数据库,查询二进制数据,并解析出logfile和pos,这里同步用户要开启 REPLICATION CLIENT权限,才能使用SHOW MASTER STATUS;
RESULT=`mysql -u"$SLAVE_SYNC_USER" -h$MASTER_HOST -p"$SLAVE_SYNC_PASSWORD" -e "SHOW MASTER STATUS;" | grep -v grep |tail -n +2| awk '{print $1,$2}'`
#解析出logfile
LOG_FILE_NAME=`echo $RESULT | grep -v grep | awk '{print $1}'`
#解析出pos
LOG_FILE_POS=`echo $RESULT | grep -v grep | awk '{print $2}'`
#设置连接master的同步相关信息
SYNC_SQL="change master to master_host='$MASTER_HOST',master_user='$SLAVE_SYNC_USER',master_password='$SLAVE_SYNC_PASSWORD',master_log_file='$LOG_FILE_NAME',master_log_pos=$LOG_FILE_POS;"
#开启同步
START_SYNC_SQL="start slave;"
#查看同步状态
STATUS_SQL="show slave status\G;"
mysql -u"$ADMIN_USER" -p"$ADMIN_PASSWORD" -e "$SYNC_SQL $START_SYNC_SQL $STATUS_SQL"

5、效果如下:
在这里插入图片描述
在这里插入图片描述

小结:
docker版本:25.0.0
docker compose版本:version v2.24.1,新的docker版本自带docker compose,不需要额外安装
MySQL镜像版本:8.3.0,跟老版本有点区别。很多找到的博客是老版本的,有点累。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch中的分词器的基本介绍以及使用

目录 一、分词器的基本概念 二、分词器类别 (1)默认分词器 (2)IK分词器 (3)拼音分词器 (4)自定义分词器 一、分词器的基本概念 在Elasticsearch中,分词器&#xff…

04_前后端交互技术之Ajax异步请求

本课目标 理解什么是同步请求和异步请求理解Ajax的请求原理掌握Ajax的基本用法掌握课堂案例 1. 同步请求与异步请求的区别 1.1 什么是同步请求 同步请求:发送请求后需要等待服务端响应,同步请求阻止代码的执行,这会导致屏幕上出现“冻结”…

Linux exit命令教程:结束当前的登录会话(附案例详解和注意事项)

Linux exit命令介绍 exit命令用于结束当前的登录会话。当你在命令行界面(shell)运行exit命令时,它会终止你当前的shell会话。 在命令行界面或shell脚本中执行exit命令默认会直接退出终端,或者你还可以在exit命令后添加一个参数&…

Linux中断 -- 中断路由、优先级、数据和标识

目录 1.中断路由 2.中断优先级 3.中断平衡 4.Linux内核中重要的数据结构 5.中断标识 承前文,本文从中断路由、优先级、数据结构和标识意义等方面对Linux内核中断进行一步的解析。 1.中断路由 Aset affinity flow GIC文中有提到SPI类型中断的路由控制器寄存器为…

华为HCIP Datacom H12-831 卷14

多选题 1、以下哪些Community属性可以保证BGP路由条目的传播范围只在AS内? A No_Export B No_Export_Subconfed C Interne D No_Advertise 正确答案 A,B 解析:Internet:缺省情况下,所有的路由都属于internet团体。具有此属性的路由…

回归预测 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SSA-SVR麻雀算法优化支持向量机的数据…

ubuntu-base(arm64与riscv64) 根文件系统, 并用qemu启动

ubuntu-base(arm64与riscv64) 根文件系统 有个小需求,是在 arm64 和 riscv64 上都跑起来 speccpu 2017 首先在 Qemu 上跑起来,需要考虑需要的【Linux 内核、根文件系统、Bootloader】,其中 Bootloader 在 Qemu 中可以很…

Kong: Services and Routes 等基本属性

Services 在Kong Gateway中,服务是现有上游应用程序的抽象。服务可以存储插件配置和策略等对象的集合,并且可以与路由相关联。 定义服务时,管理员会提供名称和上游应用程序连接信息。连接详细信息可以在 url 字段中以单个字符串的形式提供…

RCC——使用HSE/HSI配置时钟

RCC 文章目录 前言一、背景二、仿真计算周期 2.1 2.2 三、MCO引脚输出时钟总结 前言 前期疑问:1、RCC是什么意思。 2、最终配好的72M是系统时钟吗? 3、一共有哪些时钟 本文目标:将PLL时钟配置成72M 疑问解答:最终配好的时钟是…

用Flask打造一个大模型智能问答WEB网站

目前已经有很多类似GPT的大模型开源,可以提供类似ChatGPT的智能问答功能。我也基于这些开源模型,用Flask来建立一个智能问答网站,可以方便用户建立自己的ChatGPT系统。 这个网站需要提供用户登录功能,对已登录的用户,可以在网站上提出问题,并由大模型处理后返回答案。演…

C++ 实现多线程的生产者(producer) - 消费者(consumer) 模型

1. 模型介绍: 生产者消费者模型是操作系统中的一种并发编程模型,用于解决生产者和消费者之间的数据共享和同步问题。 在该模型中,生产者负责生成数据,并将数据放入一个有限的缓冲区中,而消费者则从缓冲区中取出数据进…

网上零食销售系统

技术架构: Servlet MySQL JSP 功能描述: 1.浏览商品 (1) 商品详细资料 (2) 商品编号 2.订购商品 3.购物车 4.用户信息维护 (1) 用户注册 (2) 用户…

04-Seata修改通信端口

基于docker环境部署下,可以翻看专栏之前的文章 配置文件 /home/server/seata/resources/application.yml 默认${server.port} 1000 1、修改服务端(TC)配置 seata:server:service-port: 7090 2、修改映射端口 在启动脚本中修改映射端口 docker run -id --nam…

嵌入式——实时时钟(RTC)

目录 一、初识RTC 1.简介 2.特性 3.后备寄存器和RTC寄存器特性 二、RTC组成 1.相关寄存器 (1)控制寄存器高位(RTC_CRH) (2)控制寄存器低位(RTC_CRL) (3&#xf…

『建议收藏』OpenAI官方出的Prompt提示词教程中文版来了!

一些结论 六大策略: 写清晰的指令 提供参考文本 将复杂任务分解为更简单的子任务 给模型时间“思考” 使用外部工具 系统性测试变化 提高结果质量的六大策略 写清晰的指令 这些模型无法读懂你的想法。如果输出过长,要求简短回复;如果输出过于简单…

Redis客户端之Redisson(二)Redisson组件

Redisson的几个常用客户端 一、RedissonClient 1、创建 通过Config对象配置RedissonClient所需要的参数,然后获取RedissonClient对象即可。 Config config new Config(); config.useSingleServer().setAddress("redis://127.0.0.1:6379"); RedissonC…

【python】argparse解析参数的过程

python基础知识 python文件解析if __name__ __main__的作用import到底导入了什么?argparse解析命令行参数的过程 python文件解析 Python和C语言的编译、执行过程有很大区别。我们先回顾一下c语言的执行过程,首先代码文件要编译,编译通过&am…

【C++杂货铺】详解类和对象 [上]

博主:代码菌-CSDN博客 专栏:C杂货铺_代码菌的博客-CSDN博客 目录 🌈前言🌈 📁 面向对象语言的特性 📁 类 📂 概念 📂 定义 📁 访问限定符 📂分类 &#x…

《WebKit 技术内幕》学习之十五(1):Web前端的未来学习

1 趋势 说到Web方面的趋势,特别是HTML5获得的巨大发展,W3C和WHATWG等组织正在不停地推动规范的演进和引入新的规范,这一举动必将极大地推动Web前端的发展。就目前Web前端来说,各种类型的技术非常多,极容易引起大家的误…

CMake 完整入门教程(一)

1 前言 每一次学习新东西都是很有乐趣的,虽然刚开始会花费时间用来学习,但是实践证明,虽然学习新东西可能会花费一些时间,但是它们带来的好处会远远超过这些花费的时间。学习新东西是值得的,也是很有乐趣的。 网络上…