Mysql主从集群搭建——基于docker-compose一键部署

搭建初衷

  • 本身自己就是开发这类应用的工作者,一个私有库还是很有必要的。无论是公司项目还是私人项目都可以用到,不用担心忘记同步导致的数据丢失
  • 统一管理所有docker应用的数据(如果容器可以连接mysql的话)也方便随时修改数据
  • 结构可视化,方便拓展一些容器的功能,比如Halo的代码

注意事项

  • 所有基础应用都会在统一一个docker公用网络中,要先创建这个网络。我们这边就是创建了一个名为basenetwork的网络。后续所有Mysql、Redis、MongoDB、nacos、ES都会连到这个网络中。具体如何创建docker公用网络,百度一下或者GPT一下,很简单的
  • 为了方便容器的排序,我将所有基础服务的名称都加上了zz-前缀,可以自行修改

增加相关配置

目录结构

├── init_db
├── master
│   └── my.conf
├── slave1
│   └── my.conf
├── slave2
│   └── my.conf
└── docker-compose.yml

docker-compose.yml

version: "3"
services:mysql-master:container_name: zz-base-mysql-masterhostname: mysql-masterimage: "mysql:5.7"ports:- 3306:3306volumes:- ./master/etc:/etc/mysql- ./master/var/lib:/var/lib/mysql- ./master/my.cnf:/etc/my.cnf- ./init_db/:/docker-entrypoint-initdb.d/environment:MYSQL_ROOT_PASSWORD: 填入超级管理员密码MYSQL_DATABASE: rule_platformMYSQL_USER: 填入普通用户MYSQL_PASSWORD: 填入普通用户密码TZ: Asia/Shanghaicommand: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_cirestart: alwaysnetworks:basenetwork:ipv4_address: 172.16.0.101mysql-slave-1:container_name: zz-base-mysql-slave-1hostname: mysql-slave-1image: "mysql:5.7"ports:- 3307:3306volumes:- ./slave1/etc:/etc/mysql- ./slave1/var/lib:/var/lib/mysql- ./slave1/my.cnf:/etc/my.cnf- ./slave1/init_db/:/docker-entrypoint-initdb.d/environment:MYSQL_ROOT_PASSWORD: 填入超级管理员密码MYSQL_DATABASE: rule_platformMYSQL_USER: 填入普通用户MYSQL_PASSWORD: 填入普通用户密码TZ: Asia/Shanghaicommand: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_cirestart: alwaysnetworks:basenetwork:ipv4_address: 172.16.0.102mysql-slave-2:container_name: zz-base-mysql-slave-2hostname: mysql-slave-2image: "mysql:5.7"ports:- 3308:3306volumes:- ./slave2/etc:/etc/mysql- ./slave2/var/lib:/var/lib/mysql- ./slave2/my.cnf:/etc/my.cnf- ./slave2/init_db/:/docker-entrypoint-initdb.d/environment:MYSQL_ROOT_PASSWORD: 填入超级管理员密码MYSQL_DATABASE: rule_platformMYSQL_USER: 填入普通用户MYSQL_PASSWORD: 填入普通用户密码TZ: Asia/Shanghaicommand: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_cirestart: alwaysnetworks:basenetwork:ipv4_address: 172.16.0.103networks:basenetwork:external: true

master的my.cnf

[mysqld]
# 主数据库端ID号
server_id = 101
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 将函数复制到slave
log_bin_trust_function_creators = 1
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON# MySQL 8.x,需要如下配置
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

slave-1的my.cnf

[mysqld]
# 从数据库端ID号
server_id = 102
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-slave1-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
relay_log = mysql-relay-bin
read_only=1

slave2的my.cnf

[mysqld]
# 从数据库端ID号
server_id = 103
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-slave2-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
relay_log = mysql-relay-bin
read_only=1

启动容器

填入好docker-compose.yml文件中那些需要手动填入的内容,创建好所有文件文件夹之后,就可以启动容器了。
在docker-compose.yml目录下,运行sudo docker-compose up -d即可

配置主从同步

在服务器(宿主机)上运行以下sh命令即可

# master
docker exec -it zz-base-mysql-master bash
mysql -uroot -p填入root用户密码
create user 'repl'@'%' identified by 'repl';
grant replication client,replication slave on *.* to 'repl'@'%';# slave
docker exec -it zz-base-mysql-slave bash
mysql -uroot -p填入root用户密码
reset master;
CHANGE MASTER TO MASTER_HOST='mysql-master',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;
start slave;

至此,完事!~

如果你某个容器要使用mysql库了,将这个容器设置在basenetwork网络下,然后就可以直接使用172.16.0.101这个地址连接到了。
内网也可以直接使用Navicat或者dataGrip连接。
当然,如果想让外网也访问到可以配置个frp,之后会再出一篇frp的教程,感谢支持!

image

END。

欢迎访问我的blog > https://blog.taotaojs.top/archives/mysql%E4%B8%BB%E4%BB%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA%E5%9F%BA%E4%BA%8Edocker-compose%E4%B8%80%E9%94%AE%E9%83%A8%E7%BD%B2

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

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

相关文章

Python实现广义线性回归模型(statsmodels GLM算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 广义线性模型(Generalized Linear Model,简称GLM)是一种广泛应用于回归分析和分类问题的统…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-4线性时不变系统中的冲激响应与卷积

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-数学基础Ch0-4线性时不变系统中的冲激响应与卷积 1. LIT System:Linear Time Invariant2. 卷积 Convolution3. 单位冲激 Unit Impulse——Dirac Delta 线性时不变系统 : L…

Science | 张锋实验室:聚类算法揭示188种新型CRISPR系统

微生物序列数据库包含大量有关酶和其他可用于生物技术的分子的信息。但近年来,这些数据库已经变得非常庞大,以至于很难有效地搜索到感兴趣的酶。 2023年11月23日,博德研究所张锋及美国国立卫生研究院Eugene V. Koonin共同通讯在Science 在线…

软件测试外包干了2个月,技术进步2年。。。

先说一下自己的情况,本科生,18年通过校招进入北京某软件公司,干了接近2年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

01_W5500简介

目录 W5500简介: 芯片特点: 全硬件TCPIP协议栈: 引脚分布: W5500简介: W5500是一款高性价比的以太网芯片,其全球独一无二的全硬件TCPIP协议栈专利技术,解决了嵌入式以太网的接入问题,简单易用&#xff…

学习Python的未来前景分析

文章目录 前言学python可以干什么如果具备Python编程,能用Python做什么:学Python语言能干什么1.常规软件开发2.科学计算3.自动化运维4.云计算 学python编程对未来的影响关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Py…

外包干了3个月,技术倒退2年。。。

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

SAP 工序委外简介

在SAP系统中,外部加工分为工序委外和标准委外两种,对于工序委外,它存在于很多的模块中,在PP、PM、PS等模块中都有应用。 工序委外中字面理解就是在生产过程中,加工的某道工序需要外发给供应商进行加工,物权没有发生转变,只是支付给供应商相应是加工费用,实际加工成本最终…

matlab 最小二乘拟合空间直线(方法二)

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理

keil软件注释显示中文字符乱码的问题

打开Edit选项,设置Encoding为 UTF-8字符编码即可。

异常(C++)

异常 前言一、程序的错误分类二、异常1. 概念2. 捕获异常的关键字和格式3. 异常的使用异常的原则异常再抛出异常说明注意事项 4. 自定义异常体系5. C标准库的异常体系 三、总结 前言 在程序运行时经常碰到一些错误,例如年龄、身高不能为负,除数为0等&…

sql注入 [GXYCTF2019]BabySQli1

打开题目 多次尝试以后我们发现存在一个admin的账号,但是密码我们不知道 我们尝试一下万能密码 admin or 11 -- q 报错 我们尝试bp抓一下包看看 看着很像编码 先去base32解码 再base64解码 得到 我们从这个sql语句中得到注入点为name 根据报错信息我们知道是…

网络安全(一)--网络环境构成,系统的安全

2. 网络攻防环境 目标 了解攻防环境构成了解入侵检测系统(平台)的部署位置 2.1. 环境构成 2.1.1. 环境框图 一个基本的网络攻防实验环境包括:靶机、攻击机、入侵检测分析系统、网络连接四部分组成。 一个基础的网络攻防实验环境需要如下…

阿里云租赁费用_阿里云服务器多配置报价表

阿里云服务器租用费用,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、轻量应用服务器2核2G3M带宽轻量服务器一年87元,2核4G4M带宽轻量服务器一年165元12个月,ECS云服务器e系列2核2G配置99元一年、2核4G配置365元一年、2核8G配置522元一年…

Git多人协作(一)

个人主页:Lei宝啊 愿所有美好如期而遇 前言 由于博主是一个人,所以博主为完成这篇文章,在Linux下克隆了一个仓库,在windows下克隆了一个仓库,以此来模拟多人协作开发。而实际开发中,每个人都有自己的git…

【CSP】202305-1_重复局面Python实现

文章目录 [toc]试题编号试题名称时间限制内存限制题目背景问题描述输入格式输出格式样例输入样例输出样例说明子任务提示Python实现 试题编号 202305-1 试题名称 重复局面 时间限制 1.0s 内存限制 512.0MB 题目背景 国际象棋在对局时,同一局面连续或间断出现3次或3…

python3安装lifelines

目录 一、环境 二、安装lifelines 出现问题 三、测试导入 一、环境: jupyter notebook中新建ipynb文件 二、安装lifelines pip install --upgrade --no-deps githttps://github.com/CamDavidsonPilon/lifelines.git出现问题: 缺少模块autograd、f…

sqlite3.44.2的编译

文章目录 sqlite3.44.2的编译概述笔记解决shell.c编译报错的方法整理 - 正常可用的编译脚本过程剩下的事情验证编译出的输出是否可以给工程正常使用?END sqlite3.44.2的编译 概述 想从源码编译一份Sqlite3.44.2出来. 编译sqlite3.44.2前置需要的TCL环境已经编译出来到了, 做…

学习Python能给我们带来什么?有什么帮助?

文章目录 前言学习Python能做什么1、抓取各类数据、文本等信息2、批量清洗和处理数据3、提供可视化工具4、进行深度学习 Python的用途有哪些普通人学习python有什么好处关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python…

Linux挂载配置本地yum源

1.vi /etc/yum.repos.d/redhat.repo 2. [baseos] namebaseos baseurlfile:///mnt/BaseOS #enabled:默认为1 enabled1 gpgcheck0 [appstream] nameappstream baseurlfile:///mnt/AppStream enabled1 gpgcheck0 3. mount /dev/sr0 /mnt/ 4.yum clean all 5.yum makecache