【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应用与实战教程

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

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

相关文章

Pod和容器设计模式

为什么需要 Pod; Pod 的实现机制; 详解容器设计模式。 一、为什么需要 Pod 容器的基本概念 现在来看第一个问题:为什么需要 Pod?我们知道 Pod 是 Kubernetes 项目里面一个非常重要的概念,也是非常重要的一个原子调…

144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[]示例 3: 输入:root [1] 输出&am…

SpringCloud(18)之Sleuth +Zipkin链路追踪

一、Zipkin介绍 Zipkin是一个开放源代码分布式的跟踪系统,它可以帮助收集服务的时间数据,以解决微服务架构中的延迟问 题,包括数据的收集、存储、查找和展现。每个服务向zipkin报告计时数据,zipkin会根据调用关系通 过Zipkin UI…

1.2 在卷积神经网络中,如何计算各层感受野的大小

1.2 在卷积神经网络中,如何计算各层感受野的大小 分析与解答: 在卷积神经网络中,由于卷积的局部连接性,输出特征图上的每个节点的取值,是由卷积核在输入特征图对应位置的局部区域内进行卷积而得到的,因此这…

【笔试强训错题选择题】Day5.习题(错题)解析

文章目录 前言 错题题目 错题解析 总结 前言 错题题目 1. ​ ​ 2. 3. ​ 4. ​ 5. ​ 错题解析 1. 移位运算符的使用 2. 3. 4. 5. 总结

如何用TCC实现分布式事务?

TCC事务介绍 TCC(Try-Confirm-Cancel)是除可靠消息队列以外的另一种常见的分布式事务机制,它是由数据库专家帕特 赫兰德(Pat Helland)在2007年撰写的论文《Life beyond Distributed Transactions: An Apostate’s Op…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的体育赛事目标检测系统(Python+PySide6界面+训练代码)

摘要:开发和研究体育赛事目标检测系统对于增强体育分析和观赏体验至关重要。本篇博客详细讲述了如何运用深度学习技术构建一个体育赛事目标检测系统,并提供了完整的实现代码。系统基于先进的YOLOv8算法,对比了YOLOv7、YOLOv6、YOLOv5的性能&a…

爬虫入门到精通_实战篇7(Requests+正则表达式爬取猫眼电影)_ 抓取单页内容,正则表达式分析,保存至文件,开启循环及多线程

1 目标 猫眼榜单TOP100:https://www.maoyan.com/board 2 流程框架 抓取单页内容:利用requests请求目标站点,得到单个网页HTML代码,返回结果。正则表达式分析:根据HTML代码分析得到电影名称,主演,上映时间,评分,图片…

C语言中的分支和循环语句:从入门到精通

分支和循环语句 1. 前言2. 预备知识2.1 getchar函数2.2 putchar函数2.3 计算数组的元素个数2.4 清屏2.5 程序的暂停2.6 字符串的比较 3. 结构化3.1 顺序结构3.2 分支结构3.3 循环结构 4. 真假性5. 分支语句(选择结构)5.1 if语句5.1.1 语法形式5.1.2 else…

Java网络通信UDP

目录 网络通信基础 UDP通信 服务器 1.想要使用UDP通信 要先打开DatagramSocket文件 端口号可以手动指定或系统随机分配 2.阻塞等待接收客户端数据;创建DatagramPacket接收客户端传来的数据 3.处理客户端传来的数据,并进行业务处理(这里…

MySQL 教程 2.4

MySQL UNION 操作符 本教程为大家介绍 MySQL UNION 操作符的语法和实例。 描述 MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合,并去除重复的行。 UNION 操作符必须由两个或多个 SELECT 语句组成,每个 SELECT 语句的列数…

Python降维数据库之umap使用详解

概要 在数据科学和机器学习领域,数据通常是高维度的,而高维度数据不仅难以可视化,还会增加建模的复杂性。降维是一种处理高维数据的关键技术,而Python UMAP(Uniform Manifold Approximation and Projection)是一种强大的降维工具,它在保留数据结构的同时,将高维数据映…

【IDEA+通义灵码插件】实现属于你的大模型编程助手

目录 1.前言 2.下载安装 3.解释代码 4.生成单元测试 5.生成注释 6.智能补全 1.前言 大模型到底该以一种什么方式落地,从而嵌入我们的工作当中,助力我们工作效率的提升,其实最好的方式也许就是虚拟助手的方式,就像钢铁侠的&…

【OpenCV基础(三)】Ubuntu系统下EasyPR环境配置

环境配置 1、资源下载2、环境配置2.1、1、将EasyPR压缩包拷贝到Ubuntu 三种方法任选一种2.2、解压得到EasyPR文件夹(文件夹一层进入后EasyPR资源内容)2.3、终端命令修改权限**chmod -R 777 ./ EasyPR**2.4、查找EasyPR/include/easypr/config.h,使用gedit方式打开2.…

vue2本地开发环境正常,生产环境下this.$router.push({ name: ‘login‘ })不跳转

如果在Vue.js 2中在本地开发环境下正常运行,但在生产环境下使用​​this.$router.push({ name: login })​​不起作用,可能有几个原因需要检查和解决: 路由配置问题: 确保你的路由配置正确,特别是确保在生产环境中,路由的配置和本地开发环境一致。检查是否正确设置了name…

基于springboot+vue的智能学习平台系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

SAP PP学习笔记 - 豆知识07 - 如何查看BOM一览

SAP标准提供了CS03,只能查询单个的BOM,如果想查看一览,只能自己写SQVI 查询。 有其他高招的童鞋,请赐教啊。 1,SQVI 工具 SAP MM学习笔记18- SQVI 工具_sap sqvi-CSDN博客 输入查询名,然后点击 登录 2&a…

#QT(DEMO2-登录界面)

1.IDE:QTCreator 2.实验:DEMO登录 3.记录 Line Edit输入不换行 密码框输入如下设置: 运行效果 4.代码

Vue.js+SpringBoot开发在线课程教学系统

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

五、西瓜书——集成学习

1.个体与集成 集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能,这对“弱学习器”(weak learner)尤为明显因此集成学习的很多理论研究都是针对弱学习器进行的而基学习器有时也被直接称为弱学习器。 要获得好的集成个体学习器应“好而不同”…