docker搭建mysql8.0.32,实现主从复制(一主两从)
安装docker的步骤、使用命令就不写了,本文章是基于会使用docker、linux基本命令的基础上来写的。
开始步骤:
1. 拉取 mysql 镜像
docker pull mysql:8.0.32
2. 启动容器并运行mysql
a. 准备mysql的配置文件(该配置文件是:mysql:8.0.32直接启动后的翻译过后的原始配置文件)
# 关于如何更改设置的建议,请参考
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html[mysqld]
#
# 去掉前导的 #,并设置用于 MySQL 中最重要的数据缓存的内存量。
# 对于专用服务器,从总内存开始设置为 70%,否则为 10%。
# innodb_buffer_pool_size = 128M
#
# 去掉前导的 # 以启用一个非常重要的数据完整性选项:在备份之间记录
# 二进制日志中的更改。
# log_bin
#
# 去掉前导的 # 以设置主要用于报告服务器的选项。
# 对于事务和快速 SELECT,默认值更快。
# 根据需要调整大小,尝试找到最佳值。
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M# 去掉前导的 # 以恢复到先前的 default_authentication_plugin 值,
# 这将提高与旧客户端的兼容性。有关背景信息,请参阅:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysqlpid-file=/var/run/mysqld/mysqld.pid[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
重点:将配置文件在计算机本地创建好,后面会用来挂载到docker里的mysql的my.cnf 文件
只需要在本地创建 3个 my.cnf 文件,复制上面的内容 ,再分别在文中任意位置,最好放当中 添加 server_id=100、server_id=101、server_id=102 属性即可(没有顺序,值也可以是1、2、3任意的,不同就行,作用只是标记启动的不同数据库拥有不同的id,如果3个数据库不在一个服务器上就不需要添加这个配置了)。
下面是挂载的内容解释:-- 启动一个mysql将数据挂载到本地目录:/Users/wangqinmin/docker/mysql/master_slave/master_data
-- 配置文件挂载到,mysql8.0.32的my.cnf文件位置在/etc/my.cnf:/Users/wangqinmin/docker/mysql/master_slave/conf/master_conf/my.cnf:/etc/my.cnf
-- 日志文件挂载到:/Users/wangqinmin/docker/mysql/master_slave/log/master_log:/var/log/mysql
-- SELECT ... INTO OUTFILE 操作导出的文件挂载到:/Users/wangqinmin/docker/mysql/master_slave/file/mysql-files
b. 写好命令,开始执行
docker run --name mysql_master_33066 -v /Users/wangqinmin/docker/mysql/master_slave/data/master_data:/var/lib/mysql -v /Users/wangqinmin/docker/mysql/master_slave/conf/master_conf/my.cnf:/etc/my.cnf -v /Users/wangqinmin/docker/mysql/master_slave/log/master_log:/var/log/mysql -v /Users/wangqinmin/docker/mysql/master_slave/file/mysql-files:/var/lib/mysql-files -p 33066:3306 -e MYSQL_ROOT_PASSWORD=wangqinmin -d mysql:8.0.32docker run --name mysql_slave_33067 -v /Users/wangqinmin/docker/mysql/master_slave/data/slave1_data:/var/lib/mysql -v /Users/wangqinmin/docker/mysql/master_slave/conf/slave1_conf/my.cnf:/etc/my.cnf -v /Users/wangqinmin/docker/mysql/master_slave/log/slave1_log:/var/log/mysql -v /Users/wangqinmin/docker/mysql/master_slave/file/mysql_files_slave1:/var/lib/mysql-files -p 33067:3306 -e MYSQL_ROOT_PASSWORD=wangqinmin -d mysql:8.0.32docker run --name mysql_slave_33068 -v /Users/wangqinmin/docker/mysql/master_slave/data/slave2_data:/var/lib/mysql -v /Users/wangqinmin/docker/mysql/master_slave/conf/slave2_conf/my.cnf:/etc/my.cnf -v /Users/wangqinmin/docker/mysql/master_slave/log/slave2_log:/var/log/mysql -v /Users/wangqinmin/docker/mysql/master_slave/file/mysql_files_slave2:/var/lib/mysql-files -p 33068:3306 -e MYSQL_ROOT_PASSWORD=wangqinmin -d mysql:8.0.32
3. 从上面的挂载目录命名就可以看出,我准备将 33066 作为主数据库,33067和33068做为从数据库
4. 主从复制就是在数据库上做配置的设置(重点在这里,但是很简单,就几条命令)
1. 进入33066主库 docker容器中
docker exec -it mysql_master_33066 /bin/bash
a. 首先 mysql -uroot -p 进入mysql ,或者用 Navicat 工具连接
b. 执行以下两条命令:
-- 创建名字为:copy_file_wangqinmin ,密码为:wangqinmin ,访问ip为任意ip的用户
CREATE USER 'copy_file_wangqinmin'@'%' IDENTIFIED BY 'wangqinmin';-- 为名字是 copy_file_wangqinmin 的用户,只设置 REPLICATION SLAVE (复制数据的权限)
GRANT REPLICATION SLAVE ON *.* TO 'copy_file_wangqinmin'@'%';-- mysql8.0.32 需要执行这个命令(搭建完成后,发现没有连接成功,看错误日志后添加的这一段命令)
-- 否则会有错误日志:
-- error connecting to master 'copy_file_wangqinmin@192.168.1.3:33066' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
ALTER USER 'copy_file_wangqinmin'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'wangqinmin';-- 刷新权限
FLUSH PRIVILEGES;
c. 重启主库和从库
docker restart mysql_master_33066 mysql_slave_33067 mysql_slave_33068
d. 在主库上执行以下命令,并记下 "File" 和 "Position" 的值:
SHOW MASTER STATUS;
我这里获取到的数据为:
因为mysql都在docker内部安装,所以容器的本地ip是127.0.0.1,但是本机外部的本地ip也是127.0.0.1,所以需要查询外部电脑的ip地址:
我的ip地址是: 192.168.1.3
2. 进入33067从库 docker容器中
docker exec -it mysql_slave_33067 /bin/bash
进入mysql中 或者 用 Navicat 工具连接后,分别执行以下3条命令:
-- 停止从库的复制进程。这是为了确保在修改主从配置时,不会有正在运行的复制进程。
STOP SLAVE;-- 指定从库要去主库的哪个位置开始复制数据。
CHANGE MASTER TOMASTER_HOST='192.168.1.3',MASTER_PORT=33066,MASTER_USER='copy_file_wangqinmin',MASTER_PASSWORD='wangqinmin',MASTER_LOG_FILE='binlog.000002',MASTER_LOG_POS=721;-- 启动从库的复制进程,开始从主库复制数据。
START SLAVE;
3. 进入33068从库 docker容器中
docker exec -it mysql_slave_33068 /bin/bash
进入mysql中 或者 用 Navicat 工具连接后,分别执行以下3条命令:
-- 停止从库的复制进程。这是为了确保在修改主从配置时,不会有正在运行的复制进程。
STOP SLAVE;-- 指定从库要去主库的哪个位置开始复制数据。
CHANGE MASTER TOMASTER_HOST='192.168.1.3',MASTER_PORT=33066,MASTER_USER='copy_file_wangqinmin',MASTER_PASSWORD='wangqinmin',MASTER_LOG_FILE='binlog.000002',MASTER_LOG_POS=721;-- 启动从库的复制进程,开始从主库复制数据。
START SLAVE;
解释:
MASTER_HOST='192.168.1.3': 指定主库的 IP 地址。MASTER_PORT=33066: 指定主库的端口号。MASTER_USER='copy_file_wangqinmin': 指定用于连接主库的用户。MASTER_PASSWORD='wangqinmin': 指定主库用户的登录密码。MASTER_LOG_FILE='binlog.000002': 指定主库的二进制日志文件。MASTER_LOG_POS=721: 指定从主库的从哪个二进制日志位置开始复制数据。
最后一步:查看从库的状态,确定从库是否已经连接到主库,是否能够复制文件和sql:
在从库上执行以下命令:
SHOW SLAVE STATUS;
确保 "Slave_IO_Running" 和 "Slave_SQL_Running" 均为 "Yes"
如果一直没有连接上,可以尝试先重启主库,再重启从库。如果还不行,就看看是不是ip或者是参数填写错误。
或者查看错误日志:
执行命令查看错误日志(这里是我不断调试过程中发现的错误日志):SHOW SLAVE STATUS; 
给大家看一下成功的结果:
这时候向主库 【创建数据库,添加数据,修改数据等等】,导致数据变化的操作。从库都会实时的进行数据变更。
有一点要注意的是,虽然实现了主从复制,但是依然会有延迟,并且可能由于:网络、IO、CPU等因素的影响,最终会导致数据的不一致问题,这个问题不能被完全解决,只能优化,同时某些业务如果要求数据一致的情况下,还是需要直接去读主库。
注意!!!!!!!,还没有完 。
上面只是搭建,还有关闭、启动数据库,也是有步骤的。
思想很简单:
1. 先关闭从库,再关闭主库;
2. 先启动主库,再启动从库。
关闭:
我们需要:
1. 先关闭从库的复制功能 (这个是有顺序的,必须先执行)STOP SLAVE;
2. 然后关闭主库systemctl stop mysql 我这里是docker ,就直接: docker stop 容器ID
3. 再关闭多个从库(我这里是两个)systemctl stop mysql 我这里是docker ,就直接: docker stop 容器ID
启动:
1. 先启动主库systemctl start mysql
2. 再启动多个从库systemctl start mysql
3. 从库执行 (每个从库都执行)START SLAVE;
4. 然后看一下状态是否正确 (正确就可以了)SHOW SLAVE STATUS;
5. 要完成读写分离的话,我使用 sharding jdbc来完成。让主库完成 (增、删、改的操作),让从库的轮询访问来完成读的操作。
~~未完待续
相关文章:
docker搭建mysql8.0.32,实现主从复制(一主两从)
安装docker的步骤、使用命令就不写了,本文章是基于会使用docker、linux基本命令的基础上来写的。 开始步骤: 1. 拉取 mysql 镜像 docker pull mysql:8.0.32 2. 启动容器并运行mysql a. 准备mysql的配置文件(该配置文件是:mysq…...
AOP springboot
1. 2. Around(“execution(* com.example.demo.controller..(…))”) 代表所有的类下面所有的方法任意参数 3....
Python Flask 基础入门第六课: Flask 全局变量 current_app, g 以及 session各自如何使用 有什么差异
全局变量 current_app, g 以及 session 全局变量差异汇总表current_app章节1 current_app - 当前应用实例current_app的基本概念current_app的作用current_app的使用 章节2:current_app的上下文什么是应用上下文?current_app与应用上下文的关系current_a…...
第33节: Vue3 方法与在线检测
UniApp 使用 Vue3 框架时,您可以使用方法和在线检测来处理应用程序中的逻辑和数据。下面是一个示例,演示了如何在 UniApp 中使用 Vue3 框架使用方法和在线检测: <template> <view> <button click"handleClick"&g…...
React学习计划-React16--React基础(二)组件与组件的3大核心属性state、props、ref和事件处理
1. 组件 函数式组件(适用于【简单组件】的定义) 示例: 执行了ReactDOM.render(<MyComponent/>, ...)之后执行了什么? React解析组件标签,找到了MyComponent组件发现组件是使用函数定义的,随后调用该…...
flink yarn-session 启动失败retrying connect to server 0.0.0.0/0.0.0.0:8032
原因分析,启动yarn-session.sh,会向resourcemanager的端口8032发起请求: 但是一直无法请求到8032端口,触发重试机制会不断尝试 备注:此问题出现时,我的环境ambari部署的HA 高可用hadoop,三个节点…...
.NET面试题(二)
1.c# 中new关键字的作用 实例化对象和调用构造函数:当使用 new 关键字创建一个类的实例时,它会为对象分配内存,并调用相应的构造函数来初始化该对象。 隐藏基类成员(方法、属性、事件等):当在派生类中…...
ffplay工具
在编译ffmpeg时,如果系统中包含了SDL库,则会默认编译生成ffplay工具,否则无法生成ffplay工具。 ffplay即可以作为播放器,也可以作为很多图像化音视频数据的分析工具,通过它可以看到视频图像的运动估计方向、音频数据的…...
第36节: Vue3 事件修饰符
在UniApp中使用Vue3框架时,你可以使用事件修饰符来更方便地处理用户交互事件。以下是一个示例,演示了如何在UniApp中使用Vue3框架使用事件修饰符: <template> <view> <button click.prevent"handleClick">Cli…...
如何在本地安装Flask并将其web界面发布到公网上远程访问协同开发
目录 前言 1. 安装部署Flask 2. 安装Cpolar内网穿透 3. 配置Flask的web界面公网访问地址 4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask,以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架,…...
八:爬虫-MySQL基础
一:MySQL数据库基础 1.MySQL数据库介绍 MySQL是一个[关系型数据库管理系统],由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Rela…...
Android定制ROM简介
Android定制ROM简介 这篇文章是为对自定义ROM、AOSP等词汇不太熟悉的技术爱好者和好奇的人写的。我希望通过向您介绍这个世界来开始博客写作。 在我们将注意力转向定制ROM之前,让我们先了解一些基础知识。 什么是操作系统? 维基百科对此的定义简洁而…...
百模大战中的AI行业:新趋势与未来发展
文章目录 每日一句正能量前言技术进步应用拓展行业变革人才竞争后记 每日一句正能量 人生最重要的价值是心灵的幸福,而不是任何身外之物。 前言 随着科技的迅猛发展,人工智能(AI)已经成为引领技术革命的重要驱动力之一。在当前的…...
VScode安装C/C++编译器步骤
一、安装C/C插件 二、安装 MinGW-w64 工具链 使用国内源 git clone https://gitee.com/cuihongxi/ubuntu2-mac.git 下载后进入到VScode文件夹下,点击msys2-x86_64-20231026.exe进行安装 完成后,确保选中“立即运行 MSYS2”框,然后选择“完…...
【Date对象】js中的日期类型Date对象的使用详情
😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:JavaScript小贴士 👐学习格言:成功不是终点,失败也并非末日,最重要的是继续…...
【PyTorch】代码学习
文章目录 直接定义nn.Sequential(), 然后append(),最后直接net(),少写很多forward,适合直连式网络 直接定义nn.Sequential(), 然后append(),最后直接net(),少写很多forward,适合直连式网络 代码来源:https://github.com/zshhans/MSD-Mixer/b…...
ElasticSeach--springboot中使用
目录 一.引入依赖 二.配置链接信息 三.索引库测试 1.创建索引库 2.查询索引库 3.删除索引库 四.文档测试 1.添加文档 2.修改文档 3.删除文档 4.查询具体文档 5.批量添加文档 五.查询测试 1.查询所有 2.根据属性term匹配查询 3.分页查询 4.排序 5.过滤属性 6.boo…...
(1)(1.9) MSP (version 4.2)
文章目录 前言 1 协议概述 2 配置 3 参数说明 前言 ArduPilot 支持 MSP 协议,可通过任何串行端口进行遥测、OSD 和传感器。这样,ArduPilot 就能将遥测数据发送到 MSP 兼容设备(如大疆护目镜),用于屏幕显示&#x…...
mysql 表锁 行锁
目录 表锁(Table Lock) 行锁(Row Lock) 进一步通过举例解释 update操作走的是什么锁 表锁示例: 行锁示例: MySQL 中常见的锁类型包括: 表锁(Table Lock) 是针对整个…...
Google 提示:切忌滥用 DORA 指标
谷歌的 DevOps 研究与评估团队从事指标交易,即 DevOps 指标。但其最新的相关报告也警告不要过度使用这些指标。 DevOps 研究与评估小组(DORA)建议 IT 专业人员根据四个关键指标来评估团队绩效:部署频率,变更准备时间&a…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
