使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤

一、前提

安装了VMware Workstation

安装并创建docker虚拟机

XShell工具

二、MySQL 生产安装

为了保证数据的安全性,在生产环境下安装的 mysql 容器,在启动时都会使用数据卷来持久化数据。

1,拉取mysql
docker pull mysql:5.7

2,查看mysql镜像
docker images

3, 启动 mysql 容器
docker run --name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/log:/var/log/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-dp 3306:3306 \
mysql:5.7

这里指定了三个数据卷:

  • /root/mysql/log:/var/log/mysql
  • /root/mysql/data:/var/lib/mysql
  • /root/mysql/conf:/etc/mysql/conf.d
4,修改mysql的中文编码

在宿主机的/root/mysql/conf 目录(数据卷目录)中新建 my.cnf 文件,并在其中键入如下内容:

[client]

default_character_set=utf8

[mysql]

default_character_set=utf8

[mysqld]

character_set_server=utf8

5,查看验证mysql的中文编码

修改配置文件后,重启mysql镜像:

docker restart mysql

进入mysql:

docker exec -it mysql /bin/bash
mysql -uroot -p

查看数据库中字符串支持的格式:

show variables like 'character%';

三、Mysql主机 mysql_master 的安装与配置

1, 拷贝master容器

从上一步创建mysql生产镜像中copy一份,作为mysql-master容器:

复制 :

cp -r mysql mysql_master

删除data和log目录:

rm -rf data/ log/
2, 启动 master 容器
docker run --name mysql_master \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /root/mysql_master/data:/var/lib/mysql \
-v /root/mysql_master/log:/var/log/mysql \
-v /root/mysql_master/conf:/etc/mysql/conf.d \
-dp 3316:3306 \
mysql:5.7
3,新建 my.cnf

在宿主机的/root/mysql_master/conf 目录中新建 my.cnf 文件,并在其中键入如下内容:

[client]
default_character_set=utf8
[mysql]
default_character_set=utf8
[mysqld]
character_set_server=utf8
server_id=01
binlog-ignore-db=mysql
log-bin=master-log-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
3,重启 master 容器

由于修改了 mysql 配置,所以需要重启 master 容器,以使新配置生效。

docker restart mysql_master

4,进入容器连接 mysql

进入容器并连接上 mysql 后,查看其字符编码,可以看到其是支持中文的。

5,创建用户

为当前 MySQL 创建一个用户:

create user 'slave'@'%' identified by '123456';

6,授权用户

为新创建的用户授权:

grant replication slave,replication client on *.* to 'slave'@'%';

四、Mysql从机 mysql_slave 的安装与配置

再打开一个会话窗口

1, 拷贝slave容器

从上一步创建mysql生产镜像中copy一份,作为mysql-slave容器:

复制 :

cp -r mysql mysql_slave

删除data和log目录:

rm -rf data/ log/
2, 启动 slave 容器
docker run --name mysql_slave \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /root/mysql_slave/data:/var/lib/mysql \
-v /root/mysql_slave/log:/var/log/mysql \
-v /root/mysql_slave/conf:/etc/mysql/conf.d \
-dp 3326:3306 \
mysql:5.7
3,新建 my.cnf

在宿主机的/root/mysql_slave/conf 目录中新建 my.cnf 文件,并在其中键入如下内容:

[client]
default_character_set=utf8
[mysql]
default_character_set=utf8
[mysqld]
character_set_server=utf8
server_id=02
binlog-ignore-db=mysql
log-bin=slave-log-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=relay-log-bin
log_slave_updates=1
read_only=1
3,重启 slave容器

由于修改了 mysql 配置,所以需要重启 slave容器,以使新配置生效。

docker restart mysql_slave
4,进入容器连接 mysql

进入容器并连接上 mysql 后,查看其字符编码,可以看到其是支持中文的。

show grants for 'slave'@'%';
docker exec -it mysql /bin/bash
mysql -uroot -p

五、配置主从复制

1,查看 master 状态

在 master 中运行 show master status 命令,查看二进制日志文件名及要开始的位置。

show master status;

2,slave 指定 master

在 slave 中通过运行 change master to 命令来指定其要连接的 master 相关信息。

首先查看一下ip:

ifconfig

然后,输入一下命令进行配置:

change master to master_host='192.168.162.105' , master_user='slave' ,master_password='123456' ,master_port=3316 ,master_log_file='master-log-bin.000002' ,master_log_pos=154 ,master_connect_retry=30 ,master_retry_count=3;
3,查看 slave 状态

在 slave 中查看 slave 状态发现,当前 slave 与 master 的同步复制还没有开始。

show slave status \G;

4,slave 开启同步

在 slave 中使用 start slave 命令开启 slave 的数据同步。

start slave

此时再次查看 slave 的状态,发现同步已经开始。

注意

如果发现 Slave_SQL_Running: No

原因:

1.程序可能在slave上进行了写操作

2.也可能是slave机器重起后,事务回滚造成的.

一般是事务回滚造成的:

解决办法:

mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;

六、测试

到这里,一主一从的读写分离集群就搭建完毕了。下面在 master 中创建一个数据库与表,在 slave 中如果可以查看到,则说明搭建成功。

1,在 master 中写入

2,在 slave 中读取

在 slave 中可以查看到在 master 中写入的数据,说明集群搭建成功。

3,用navicat连接主从数据库

主从数据同步发生变化!!!搞定!!!!

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
37
分享
相关文章
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
120 82
如何实现 MySQL 的读写分离?
本文介绍了 MySQL 读写分离的实现方式及其主从复制原理,解释了如何通过主从架构提升读并发能力。重点分析了主从同步延时问题及解决方案,如半同步复制、并行复制等技术手段,并结合实际案例探讨了高并发场景下的优化策略。文章还提醒开发者在编写代码时需谨慎处理插入后立即查询的情况,避免因主从延时导致的数据不一致问题。
245 44
如何实现 MySQL 的读写分离?
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
208 42
Docker下Mysql8数据备份与恢复
通过以上步骤,您可以在Docker环境下高效地备份和恢复MySQL 8数据库。备份数据时,使用 `mysqldump`工具生成逻辑备份文件,并存储到指定目录;恢复数据时,使用 `mysql`工具从备份文件中读取数据并恢复到数据库。自动化脚本和定时任务的配置可以进一步简化备份和恢复的管理过程。
150 41
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
90 30
揭秘 Microsoft.Docker.SDK:让容器开发更轻松的强大工具揭秘
随着云计算和容器技术的快速发展,`Docker` 已经成为容器化技术的事实标准。`Microsoft` 作为 `Docker` 的主要支持者和参与者,推出了 `Microsoft.Docker.SDK`,旨在帮助开发者更轻松地进行容器开发。本文将深入揭秘 Microsoft.Docker.SDK 的功能、使用方法以及它在容器开发中的应用。
36 12
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
325 93
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等