当前位置: 首页 > news >正文

基于Docker搭建MySQL Cluster

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.gsyq.cn/news/19665.html

相关文章:

  • 某中心与华盛顿大学公布机器人研究奖项与学者名单
  • 占位符
  • 什么是IO多路复用?
  • 进程、线程和协程之间的区别和联系
  • 挣点小钱的副业(附带新手教程)0元的快乐
  • 软考~高效的系统规划与管理师考试—知识篇—V2.0—第四章 IT 服务规划设计 — 2017 年 2018 年 2020 年 2022 年 2023 年
  • 应用安全 --- 安卓安全 之 文件校验
  • 2.1 函数逼近(Function Approximation)
  • VSCode code-snippets Note
  • Elasticsearch 备份:snapshot 镜像使用篇
  • 2025 年 10 月金属门窗厂家加盟代理品牌推荐排行榜,行业权威盘点与品质红榜发布
  • 五、指令集架构深入分析
  • ARC 208 Div.2
  • 机器学习学术研讨会柏林举办
  • PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像疑问深度学习优化技术
  • SimAM注意力机制
  • python容器-字符串
  • 氛围编程陷阱:为什么AI生成代码正在制造大量伪开发者
  • 记一次的AI Agent开发的思维误区
  • 3_Linux 文件管理三部曲:操作、结构与权限控制
  • 1_从 0 到 1 入门 Linux:认知、选型、安装
  • python的流程控制
  • 卖萌求 AccessKey
  • 初识pytorch:关于数据展示的组件tensorboard
  • win11家庭版升级到专业版教程,专业版改为家庭版教程
  • 一生一芯学习:多道程序 yield-os.c
  • 速通ACM省铜第十六天 赋源码(Sigma Cubes和Find Permutation 2和Rotate and Sum Query) - 教程
  • ABC round 427
  • 卸载驱动模块,内核崩溃排查调试记录
  • 详细介绍:游戏引擎以及游戏开发