【MySQL】基于Docker搭建MySQL一主二从集群
本文记录了搭建mysql一主二从集群,这样的一个集群master为可读写,slave为只读。过程中使用了docker,便于快速搭建单体mysql。
1,准备docker
docker的安装可以参考之前基于yum安装docker的文章[1]。
容器相关命令[2]。
查看正在运行的容器
docker ps
查看所有容器(查看正在运行的和已经停止运行的)
docker ps –a
docker ps -all
查看最后一次运行的容器
docker ps –l
查看停止的容器
docker ps -f status=exited
创建容器
docker run 参数 镜像名称:镜像标签 /bin/bash-i:表示运行容器,如果不加该参数那么只是通过镜像创建容器,而不启动。-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端(如果只加it两个参数,创建后就会自动进去容器)。-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。--name :为创建的容器命名。-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射,例如:可以将Docker中Tomcat容器的8080端口映射到宿主机上的某一个端口8080,那么以后访问tomcat只需要:http://宿主机的IP:8080/进入容器之后,初始化执行的命令:/bin/bash;可写可不写
删除指定的容器
#删除容器
docker rm 容器名称(容器ID)
#删除镜像
docker rmi 镜像ID(镜像名称)
2,跑起来3台mysql容器
搜索mysql镜像
docker search mysql
拉取mysql8镜像
docker pull mysql:8.0.29
注意:如果防火墙是开启的,需要关闭防火墙,容器才能启动。
运行3台msyql容器
master
docker run -d \
-p 3311:3306 \
-v /usr/local/docker-mount/mysql-master1/conf:/etc/mysql/conf.d \
-v /usr/local/docker-mount/mysql-master1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-master1 \
mysql:8.0.29
slave1
docker run -d \
-p 3312:3306 \
-v /usr/local/docker-mount/mysql-slave1/conf:/etc/mysql/conf.d \
-v /usr/local/docker-mount/mysql-slave1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-slave1 \
mysql:8.0.29
slave2
docker run -d \
-p 3313:3306 \
-v /usr/local/docker-mount/mysql-slave2/conf:/etc/mysql/conf.d \
-v /usr/local/docker-mount/mysql-slave2/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-slave2 \
mysql:8.0.29
这样,通过docker,我们就快速部署了3台mysql容器。
3,进入容器,搭建集群
进入容器,修改root密码。
下面示例的是master容器
docker exec –it mysql-master1 /bin/bash
进入容器的bash后,通过mysql -uroot -p,即可进入mysql的命令行模式。

修改默认密码校验方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
slave1、slave2同理,修改root密码。
给3台容器配置不同的server-id
我们找到之前容器挂载的conf目录,在其中vim my.cnf
vim /usr/local/docker-mount/master1/conf/my.cnf[mysqld]
# 服务器唯一id,默认值1
server-id=1
# 设置日志格式,默认值ROW
binlog_format=STATEMENT
vim /usr/local/docker-mount/slave1/conf/my.cnf[mysqld]
# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id
server-id=2
vim /usr/local/docker-mount/slave2/conf/my.cnf[mysqld]
server-id=3
重启3台容器
需要配置的配置文件,到此已经结束,所以这里需要重新启动mysql容器,将修改的配置读取。命令如下,最后跟上容器名字或者id即可。
docker restart mysql-master1
在主库上创建从库同步账号
在主数据库上, 创建一个允许从数据库来访问的用户账号
用户: master_slave
密码:123456
主从复制使用 REPLICATION SLAVE 赋予权限
-- 创建slave用户
CREATE USER 'master_slave'@'%';-- 设置密码
ALTER USER 'master_slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'master_slave'@'%';-- 刷新权限
FLUSH PRIVILEGES;
锁住主库,记住master_log_pos
主库的bin log需要同步到从库的中继日志relay log中。(bin log是一种记录了mysql所有DDL DML语句的二进制日志文件,而relay log从bin log接收了DDL DML语句后,在从库上执行,得到与主库相同的数据。)因此在搭建的时候,主库不能再接受数据,以免造成数据的不一致。
锁住主库,在master1上执行如下命令
-- 执行以下命令锁定数据库以防止写入数据。
FLUSH TABLES WITH READ LOCK;
在主机查看mater状态
show master status;

在从库上change master
在2台从库上执行如下命令
CHANGE MASTER TO MASTER_HOST='192.168.184.129',
MASTER_USER='master_slave',MASTER_PASSWORD='123456', MASTER_PORT=3311,
MASTER_LOG_FILE='binlog.000003',MASTER_LOG_POS=1345;
注意,MASTER_HOST、MASTER_PORT为主库的ip和端口(容器映射出来的端口,如我的这个是3311),前面申请的用来同步的用户和密码,以及最重要的,MASTER_LOG_FILE和MASTER_LOG_POS,这2个需要在主库锁住之后执行show master status查看,并填入对应的数值,如果对应不上,就会在SQL线程上出现问题,进而无法主从同步、
开启主从
start slave;
查看从库状态,看看pos和file和主库是否一致
show slave status\G;

如果一切正常,到了这里,已经主从同步了,可以在主库上尝试建表插数据,并且在从库上读,看看能否读到。
如果读不到,看看slave的IO_RUNNING和SQL_RUNNING是否为NO。如果是NO,那就是有问题,可以看接下来的踩坑记录,或者show slave status给出的结果中,有一些信息提示如error或state可以仔细观察下,也许能发现一些线索。
如果正常的话,最后不要忘记,回到主库把锁解掉
unlock tables;
安装过程中的踩坑
在安装的过程中,踩了不少的坑,记录如下。
1,挂载不要挂错。
有一些可能是docker挂载的时候没挂对,导致数据出现混乱,这个我建议大家最好还是在执行复杂命令之前把命令记下来反复核对,没问题再执行。
2,IO为NO
我遇到了这个问题,排查出是这个slave的server-id没有配置,无法识别这个slave,所以无法进行IO.
3,SQL为NO
问题到了这里,就开始比较复杂了。SQL线程跑不起来,可能有很多的原因,一般比较常见的就是pos没对上,解决方法如下
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
或者在slave上手动同步一次。
stop slave; CHANGE MASTER TO MASTER_HOST='192.168.184.129',
MASTER_USER='master_slave',MASTER_PASSWORD='123456', MASTER_PORT=3311,
MASTER_LOG_FILE='binlog.000003',MASTER_LOG_POS=1345;start slave;
如果还是解决不了的话,可以重新开始生成主库的binlog和从库的relay log。
-- 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。
reset slave;-- 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。
-- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;
reset master;
我这里当时忘记了reset master/slave,所以我直接把挂载目录清空并重新做了个容器,解决了问题。
过程中还尝试过直接启动sql线程,失败(因为有问题所以起不来,再次重启当然也起不来,毕竟问题还在那儿)。
start slave sql_thread;
查看error_log,在mysql中执行如下命令
show variables like '%log_error%';
但是发现mysql容器是直接把错误输出在控制台?可是我没有看到error输出啊,于是去slave的挂载目录的my.cnf中指定了一下error_log路径。
[mysqld]
server-id=2
log-error=/var/log/mysqld.log
但是发现error log中还真的是没有error,只有2个无关紧要的warning,于是这条路走失败了。
后来分析很有可能就是relay log的问题,reset slave也许就能直接解决问题。
参考资料:
[1],【Docker】基于yum安装docker
[2],mycat应用与实战教程
相关文章:
【MySQL】基于Docker搭建MySQL一主二从集群
本文记录了搭建mysql一主二从集群,这样的一个集群master为可读写,slave为只读。过程中使用了docker,便于快速搭建单体mysql。 1,准备docker docker的安装可以参考之前基于yum安装docker的文章[1]。 容器相关命令[2]。 查看正在…...
k8s 集群调度,标签,亲和性和反亲和性,污点和容忍,pod启动状态 排错详解
目录 pod启动创建过程 kubelet持续监听的原因 调度概念 调度约束 调度过程 优点 原理 优先级选项 示例 指定调度节点 标签基本操作 获取标签帮助 添加标签(Add Labels): 更新标签(Update Labels) 删除标…...
Idea 启动报错 failed to create jvm:jvm path url
1、情况 针对于在 idea 中,通过界面的形式改了 -Xmx 等类似的参数,并且设置的值过大,导致下次启动 idea 报错 2、解决 找到如图所示的文件 打开编辑该文件,把类似 -Xmx 等参数的值调小,保存文件并关闭࿰…...
20款Visual Studio实用插件推荐
前言 俗话说的好工欲善其事必先利其器,安装一些实用的Visual Studio插件对自己日常的开发和工作效率能够大大的提升,避免996从选一款好的IDE实用插件开始。以下是我认为比较实用的Visual Studio插件,希望对大家有所帮助。 各位小伙伴有更好的…...
基于SpringBoot的在线拍卖系统
目录 1、 前言介绍 2、主要技术 3、系统流程和逻辑 4、系统结构设计 5、数据库设计表 6、运行截图(部分) 6.1管理员功能模块 6.2用户功能模块 6.3前台首页功能模块 7、源码获取 基于SpringBoot的在线拍卖系统录像 1、 前言介绍 随着社会的发展,社会的各行…...
“互动+消费”时代,借助华为云GaussDB重构新零售中消费逻辑
场与人的关系 “人—货—场”是零售中重要的三要素,我们一直在追求,将零售中的人、货、场进行数字化并在云端进行整合,形成属于我们自己的云平台。 随着互联网技术为信息提供的便利,消费者的集体力量正在逐渐形成一股强大的反向…...
AI大全-通往AGI之路
背景 自从AI大模型出来之后,就有很多做资源整理的社区,整理学习资料,整理各种AI工具大全,我也整理过一段时间的最新AI的资讯,也曾尝试去弄一个AI的入口类的东西。但是最近看到一个在飞书上的分享,我觉得他…...
CSS中如何解决 1px 问题?
1px 问题指的是:在一些 Retina屏幕 的机型上,移动端页面的 1px 会变得很粗,呈现出不止 1px 的效果。原因很简单——CSS 中的 1px 并不能和移动设备上的 1px 划等号。它们之间的比例关系有一个专门的属性来描述: window.devicePix…...
IO 与 NIO
优质博文:IT-BLOG-CN 一、阻塞IO / 非阻塞NIO 阻塞IO:当一条线程执行read()或者write()方法时,这条线程会一直阻塞直到读取到了一些数据或者要写出去的数据已经全部写出,在这期间这条线程不能做任何其他的事情。 非阻塞NIO&…...
YOLOv应用开发与实现
一、背景与简介 YOLO(You Only Look Once)是一种流行的实时目标检测系统,其核心思想是将目标检测视为回归问题,从而可以在单个网络中进行端到端的训练。YOLOv作为该系列的最新版本,带来了更高的检测精度和更快的处理速…...
【C语言】熟悉文件基础知识
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 文件 为了数据持久化保存,使用文件,否则数据存储在内存中,程序退出,内存回收,数据就会丢失。 程序设计中&…...
信息系统安全与对抗-作业2
目录 1、使用自己姓名拼音创建一个账户, 并使用命令和图形化查看 2、使用自己拼音打头字母创建一个隐藏账户 ,并使用命令和图形化查看 3、使用命令启动 telnet 服务 4、使用命令打开防火墙 23 端口 5、熟悉LINUX系统,使用命令行创建用户…...
【软考高项】【计算专题】- 5 - 进度类 - 横道图/甘特图
一、知识点 1、基本定义 甘特图(Gantt chart )又称为横道图、条状图(Bar chart),通过条状图来显示项目各活动的进 度情况。以提出者亨利劳伦斯甘特( Henry Laurence Gantt)先生的名字命名。 目前许多文档工具都可以画甘特图。 (1)我的举例 …...
Ubuntu20.04使用XRDP安装原生远程桌面
Ubuntu20.04使用XRDP安装原生远程桌面 1.安装gnome桌面 # 如果没有更新过源缓存,先更新一下 sudo apt update# 安装gnome桌面 # 可选参数 --no-install-recommends,不安装推荐组件,减少安装时间和空间占用 sudo apt install ubuntu-desktop…...
uniapp:启动图 .9png 制作教程
1、工具安装:自行下载Android Studio 2、制作.9png 注意上图3条黑线的位置,意思是:标注黑线的位置可以进行缩放。 对其大多数启动图来说,标注以上3条黑线即可。...
NVMFS5113PLWFT1G汽车级功率MOSFET 60V 10A/64A满足AEC-Q101标准
AEC-Q101认证标准详细解读: AEC-Q101是一种汽车电子元件可靠性标准,由汽车电子委员会(Automotive Electronics Council,简称AEC)制定。该标准旨在确保在汽车环境中使用的电子元件具有足够的可靠性和耐久性。 AEC-Q10…...
设计表时,如何选择正确的数据类型
前言 假设现在有一个需求,需要创建一张orders表来存储客户的订单信息。假设表结构如下: CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY, -- 订单ID,主键,自增customer_id INT NOT NULL, -- 客户ID…...
iZotope RX 7 Advanced:音频修复与编辑的巅峰之作
在音频处理领域,iZotope RX 7 Advanced无疑是一款强大的软件,它集合了众多先进的音频修复和编辑功能,为用户提供了全方位的音频处理解决方案。 首先,iZotope RX 7 Advanced具备强大的噪声削减功能。无论是环境噪音、背景杂音还是…...
Mac 制作可引导安装器
Mac 使用U盘或移动固态硬盘制作可引导安装器(以 Monterey 为例) 本教程参考 Apple 官网相关教程 创建可引导 Mac OS 安装器 重新安装 Mac OS 相关名词解释 磁盘分区会将其划分为多个单独的部分,称为分区。分区也称为容器,不同容器…...
深入了解 JavaScript 混淆加密和环境检测
JavaScript混淆加密是一种通过修改代码结构和命名约定来增加代码的复杂性,使其难以被理解和逆向工程的技术。在这篇文章中,我们将深入探讨JS混淆加密的一些逻辑,并介绍如何通过环境检测来提高代码的安全性。我们将使用案例代码演示这些概念。…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
