基于Docker搭建MySQL Cluster

news/2025/10/12 20:08:06/文章来源:https://www.cnblogs.com/huang-changfan/p/19136788

1.整体介绍

1.1整体结构

image

1.2搭建步骤

  • 搭建3个MySQL实例.
  • 将3个MySQL实例组建集群.
  • 搭建MySQL Router.

2.搭建MySQL

2.1 MySQL配置文件及数据文件目录结构

/data
└── mysql├── 3301 #存放数据目录├── 3302├── 3303└── config  # mysql配置文件存储目录├── 3301│   └── my.cnf├── 3302│   └── my.cnf└── 3303└── my.cnf
# 日志目录
/var/log/mysql/├── 3301├── 3302├── 3303

上述目录是宿主机目录,docker中对应数据,配置文件,日志会挂载到宿主机。

2.2 MySQL docker-compose.yml

version: '3'
services:mysql-server-1:env_file:- mysql-server.envimage: mysql/mysql-server:8.0.32# 将配置文件,数据文件,日志文件挂载到宿主机。volumes:- /data/mysql/config/3301:/etc/mysql- /data/mysql/3301:/var/lib/mysql- /var/log/mysql/3301:/var/log/mysqlrestart: unless-stopped#指定网络networks:- install_mysql_defaultports:- "3301:3306"mysql-server-2:env_file:- mysql-server.envimage: mysql/mysql-server:8.0.32volumes:- /data/mysql/config/3302:/etc/mysql- /data/mysql/3302:/var/lib/mysql- /var/log/mysql/3302:/var/log/mysqlrestart: unless-stoppednetworks:- install_mysql_defaultports:- "3302:3306"mysql-server-3:env_file:- mysql-server.envimage: mysql/mysql-server:8.0.32volumes:- /data/mysql/config/3303:/etc/mysql- /data/mysql/3303:/var/lib/mysql- /var/log/mysql/3303:/var/log/mysqlrestart: unless-stoppednetworks:- install_mysql_defaultports:- "3303:3306"# 该网络需要创建,后续安装过程中会创建      
networks:install_mysql_default:external: true      

2.3 MySQL配置文件

3301/my.cnf

[mysqld]
server-id=1
port=3306datadir=/var/lib/mysqlgtid_mode=ON
binlog_checksum=NONE
enforce_gtid_consistency=ON
log_bin
log_slave_updates=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64user=mysql
skip-host-cache
skip-name-resolvecharacter-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password

3302/my.cnf

[mysqld]
server_id=2
port=3306datadir=/var/lib/mysqlgtid_mode=ON
binlog_checksum=NONE
enforce_gtid_consistency=ON
log_bin
log_slave_updates=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64user=mysql
skip-host-cache
skip-name-resolvecharacter-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password

3303/my.cnf

[mysqld]
server_id=3
port=3306datadir=/var/lib/mysqlgtid_mode=ON
binlog_checksum=NONE
enforce_gtid_consistency=ON
log_bin
log_slave_updates=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64user=mysql
skip-host-cache
skip-name-resolvecharacter-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password

2.4 安装MySQL

将MySQL docker-compose.yml放置在指定目录下。同时添加mysql-server.env文件。

/script/innodb-cluster/install_mysql/├── docker-compose.yml└── mysql-server.env

mysql-server.env文件

MYSQL_ROOT_PASSWORD=my123456
MYSQL_ROOT_HOST=%

进入/script/innodb-cluster/install_mysql/目录下。

创建网络install_mysql_default,之前docker-compose.yml中使用了install_mysql_default网络。

docker network create install_mysql_default

执行docker compose up -d
image
执行docker ps三个mysql 实例都启动了。
image

3.创建集群

3.1 安装mysql shell

mysql shell文件结构如下。

/script/innodb-cluster/creater_cluster/
├── docker-compose.yml
├── mysql-shell.env

进入/script/innodb-cluster/creater_cluster/目录,执行docker compose up -d

3.2使用MySQL Shell创建集群。

3.2.1 使用mysql shell脚本。

先执行docker exec -it install_mysql-mysql-server-1-1 mysqlsh
image

3.2.2 创建集群

执行下列语句,定义集群名称和密码。

  var dbPass = "my123456"var clusterName = "devCluster"

image

连接mysql

shell.connect('root@mysql-server-1:3306', dbPass)

image

检查mysql配置,是否满足集群创建条件。

dba.checkInstanceConfiguration()

如果不满足创建条件,会提示具体哪些配置不满足,显示当前的配置值和期望的配置值,根据提示修改配置。
MySQL的配置文件中已经添加了指定的配置和选项,没有错误会显示OK
image

创建集群

var cluster =   dba.createCluster(clusterName);

image
显示创建集群成功,但需要添加实例。

可以到mysql中查看,多了一个集群的元信息数据库。
image

添加实例到集群中
image
恢复方式根据具体需要选择即可,此处选择克隆。
可以看到当前节点已经被加入集群,元数据信息表中实例已经显示有2个了。
image

继续添加剩下的实例到集群中。

cluster.addInstance({user: "root", host: "mysql-server-3", password: dbPass})

image
集群创建完毕使用\q退出mysql shell。

现在3301,3302,3303三个mysql中都有了集群元数据信息表,同时实例表中实例有三个。
image

现在集群搭建完毕,我们登录3301端口的数据库,创建一个test库,创建一个表,会发现在3302,3303中也同步自动创建了。

4.创建路由

集群搭建完毕,为什么需要路由,MySQL集群中如果节点出现故障,会自动进行故障转移,将其中一个节点升级为主节点,此时写服务器地址发生了变化,那么此时代码中对应连接的地址也需要改变。此时如果有路由这个中间件,如果发生了切换,路由可以知道那个是新的主服务器,将写请求转发到主服务器。这样一来,路由屏蔽了切换过程,对代码来说始终是连接路由,集群内部发生切换路由会自行处理好,对于使用者来说是无感的。

当前配置中使用两个路由连接MySQL集群,但其中一个路由宕机,另一个路由还可以正常工程。jdbc连接中同时配置两个路由的地址,以实现高可用。

4.1 MySQL Router安装文件及结构

/script/innodb-cluster/install_router/
├── docker-compose.yml
└── mysql-router.env

docker-compose.yml

version: '3'
services:mysql-router-1:env_file:- mysql-router.envimage: mysql/mysql-router:8.0.32ports:- "6446:6446" #读写端口- "6447:6447" #只读端口networks:- install_mysql_default restart: on-failuremysql-router-2:env_file:- mysql-router.envimage: mysql/mysql-router:8.0.32ports:- "6448:6446"- "6449:6447"networks:- install_mysql_default  restart: on-failure# 保证路由及mysql在同一个网络
networks:install_mysql_default:external: true

mysql-router.env

MYSQL_USER=root
MYSQL_HOST=mysql-server-1
MYSQL_PORT=3306
MYSQL_PASSWORD=my123456
MYSQL_INNODB_NUM_MEMBERS=3

进入/script/innodb-cluster/install_router/目录下,
执行 docker compose up -d
image

通过dokcer ps查看启动的路由。
image

image
现在我们就有了
router1 读写端口6446,只读端口6447.
router2 读写端口6448,只读端口6449.

至此集群搭建完毕。

参考资料:
Docker Compose Setup for InnoDB Cluster

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

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

相关文章

某中心与华盛顿大学公布机器人研究奖项与学者名单

某中心与华盛顿大学联合公布科学中心第二届学者名单及五项机器人研究奖项,涵盖机器人安全控制、深度强化学习、多机器人系统等前沿技术领域,并宣布加入云基础设施未来研究中心推动下一代云计算创新。某中心与华盛顿大…

会话跟踪方案

Cookie 什么是Cookie?概念:存储在用户浏览器端的一个小型数据文件,用于跟踪和保存用户的状态信息 用处:主要用于保持用户登录状态、跟踪用户行为、存储用户偏好等 存储在浏览器端优点: HTTP协议中支持的技术 缺点:…

阻塞、非阻塞、同步、异步的区别是什么?

同步异步描述的是被调用方。阻塞非阻塞描述的是调用方。二者没有必然联系。阻塞是调用方A发出命令后,必须等待B返回结果。非阻塞是调用方A发出命令后,A不需要等待B,可以做自己的事情。 同步是B收到A的指令之后会立即…

如何防范员工泄露数据给 AI?2025年选型与落地实战版

结论:面向已经开展 AI 办公、又担心把客户隐私与业务机密“喂给”第三方模型的企业,优先选用 AI-FOCUS 团队的「滤海 AI DLP」。通过流式网关把“检测—策略—处置—留痕”前置到数据进入 LLM 之前,统一覆盖文本、文…

Linux文本编辑三剑客之grep

Linux 文本编辑三剑客之 grepLinux 文本处理三剑客是面试和后端工作中较为常见的。需要掌握:grep:文本过滤、筛选 sed:文本编辑加工 awk:文本格式化输出本节内容基于正则表达式: 正则表达式 借助正则表达式可以快…

Linux文本编辑三剑客之sed

Linux 文本编辑三剑客之 sedLinux 文本处理三剑客是面试和后端工作中较为常见的。需要掌握:grep:文本过滤、筛选 sed:文本编辑加工 awk:文本格式化输出本节内容基于正则表达式: 正则表达式 借助正则表达式可以快速…

做了项目经理才发现:上台发言,其实都有套路

在项目推进过程中,总有不少场合需要你上台发言:项目启动会、阶段汇报、庆功宴……这时,你得站在众人面前,清晰表达自己的想法。 有的人发言平淡无奇,内容枯燥,让人听得昏昏欲睡。而有的人一开口,就能吸引大家的…

占位符

a a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\ a\

什么是IO多路复用?

什么是IO多路复用? 多路复用也是面试比较常见的,尤其对于后端,因为很多中间件例如Redis、Nginx、Netty 以及jdk的 NIO 实现都用到了多路复用技术,作为实现高性能的重要底层手段是需要掌握的,下面总--分--总梳理一…

进程、线程和协程之间的区别和联系

进程、线程和协程之间的区别和联系 一、进程 进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以…

挣点小钱的副业(附带新手教程)0元的快乐

老话说得好,钱难挣,那啥难吃。一到发薪日,小花就得给花呗、抖付、美团月付、支付宝、余额宝“翻牌子”,生怕哪个逾期。最怕的就是月月光,还倒欠一屁股债。 双十一即将来临,你不知道的优惠券内部价格,还在傻傻用…

Linux文本编辑三剑客之awk

Linux 文本编辑三剑客之 awkLinux 文本处理三剑客是面试和后端工作中较为常见的。需要掌握:grep:文本过滤、筛选 sed:文本编辑加工 awk:文本格式化输出文章只列举常用的,不会完全把手册复述一遍本节内容基于正则表…

软考~高效的系统规划与管理师考试—知识篇—V2.0—第四章 IT 服务规划设计 — 2017 年 2018 年 2020 年 2022 年 2023 年

软考~高效的系统规划与管理师考试—知识篇—V2.0—第四章 IT 服务规划设计 — 2017 年 & 2018 年 & 2020 年 & 2022 年 & 2023 年pre { white-space: pre !important; word-wrap: normal !important; …

应用安全 --- 安卓安全 之 文件校验

应用安全 --- 安卓安全 之 文件校验文件校验就是在dex或so中使用代码验证文件的唯一性指纹比如md5,sha1 验证方法 修改文件的不重要的比特位打开验证如果app闪退表示存在校验

详细介绍:GitOps实战:ArgoCD+Tekton打造云原生CI/CD流水线

详细介绍:GitOps实战:ArgoCD+Tekton打造云原生CI/CD流水线pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

从“优化工具”到“价值生态”:多价值主体系统如何重塑AI价值对齐范式

从“优化工具”到“价值生态”:多价值主体系统如何重塑AI价值对齐范式 长期以来,人工智能价值对齐的讨论被禁锢在一个既定框架内:如何让AI的行为精准“符合”人类预设的单一或有限价值目标。从基于规则的硬编码到基…

2.2 深度学习(Deep Learning)

深度学习(Deep Learning) 深度强化学习(Deep RL)使用深度神经网络作为函数逼近器,从而能够学习状态–动作对的复杂表示。本节对深度学习进行简要概述,更多细节可参考 @Goodfellow2016。前馈神经网络(Feedforwar…

第十二篇

今天是10月12日,今天睡了个好觉,中午送了外卖,下午背了单词。

详细介绍:【ROS2学习笔记】节点篇:节点概述

详细介绍:【ROS2学习笔记】节点篇:节点概述2025-10-12 19:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

2.1 函数逼近(Function Approximation)

函数逼近(Function Approximation) 此前介绍的所有方法都是表格方法(tabular methods),即为每个状态–动作对存储一个值:要么是该动作的 Q 值,要么是该动作的偏好值。在大多数实际应用中,这样存储的值数量会迅…