【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,一经查实,立即删除!

相关文章

如何系统的学习Python——Python的基本语法

学习Python的基本语法是入门的第一步,以下是一些常见的基本语法概念: 注释: 用#符号来添加单行注释,或使用三引号(或""")来添加多行注释。 # 这是一个单行注释 这是 多行 注释 变量和数据类型: 变量用…

Pod和容器设计模式

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

144. 二叉树的前序遍历

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

java方法

目录 方法的定义 方法的命名规则 方法的调用与重载 方法调用实例 方法的重载 变量的作用域 算法中常见的方法 1:gcd(求两个整数中的最大公约数) 2:lcm(求两个整数的最小公倍数) 3:判断一个整数是否…

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

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

LeetCode: 数组中的第K个最大元素

问题描述 在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。 解题思路 解决这个问题有多种方法,下面是几种常见的解题策略: 排序后选择: 将数组排序&#xff0c…

ProChat 如何接入 WebSocket

WebSocket是一种在单个TCP连接上进行全双工通信的协议,允许客户端和服务器之间进行双向实时通信。与Server-Sent Events (SSE)类似,WebSocket也能实现实时数据推送,但其功能更为强大且灵活。 全双工通信:WebSocket不仅允许服务器向…

【TestNG】(4) 重试机制与监听器的使用

在UI自动化测试用例执行过程中,经常会有很多不确定的因素导致用例执行失败,比如网络原因、环境问题等,所以我们有必要引入重试机制(失败重跑),来提高测试用例成功率。 在不写代码的情况没有提供可配置方式…

Mysql 慢查询日志

查询是否开启慢SQL日志 show variables like %slow_query_log; 开启慢查询日志 set global slow_query_logON; 可以通过修改MySQL的配置my.cfg或者my.ini永久生效 slow_query_logON # 开启慢查询日志开关 slow_query_log_file/var/lib/mysql/alvin-slow.log # 慢查询日志…

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

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

COM - IWbemClassObject对象属性的遍历

文章目录 COM - IWbemClassObject对象属性的遍历概述笔记场景封装好的函数bool CWmiBase::enumObjVaule(IWbemClassObject* obj, std::wstring& val)bool CWmiBase::appendVarToString(BSTR& strName, VARIANT& var, std::wstring& val)bool CWmiBase::get_var…

【笔试强训错题选择题】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…

【webrtc】p2p_transport_channel 中忽略Hyper-V

【win11】更改网络适配器设置 删掉了hype-v,这时候wsl2 打不开了,但是重启后,还是存在hyper-v那么,让webrtc自己不适用hyper-v的网络Hyper-V 的全程:Hyper-V Virtual Ethernet Adapter https://github.com/SophistSolutions/Stroika/blob/2cd5e8bf4ee01cb5c423367b4df628f…

MFC 模态对话框退出机制的探究

一位读者问了这样一个问题: ” 如果我创建了一个可见的模态对话框,却对用户来说不可用。举个例子,假设我在程序中的其他位置收到一个事件,并且我从事件中调用模态 CDialog 上的 DestroyWindow。我注意到 OnDestroy 是在 CDialog 上调用的,但在将 WM_QUIT 消息发送到模态对…

在MyBatis中自定义JsonTypeHandler

在MyBatis中使用自定义的JsonTypeHandler 在处理数据库中的JSON字段时,我们经常需要将JSON字符串映射到Java对象,或者将Java对象序列化为JSON字符串以存储在数据库中。MyBatis作为一个流行的Java持久层框架,允许我们通过自定义类型处理器&am…

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

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

跨域问题与解决方法

跨域问题与解决方法 同源策略 浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议域名端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。 同源策略限制以下几种行为: Cookie、LocalStorage 和 IndexDB 无法读取 DO…

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…