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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
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连接主从数据库

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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
47 3
|
1月前
|
消息中间件 分布式计算 关系型数据库
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
40 0
|
23天前
|
关系型数据库 MySQL Linux
Docker安装Mysql5.7,解决无法访问DockerHub问题
当 Docker Hub 无法访问时,可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的问题。本文介绍了如何在 CentOS 上一键配置国内镜像加速,并成功拉取 MySQL 5.7 镜像。
200 2
Docker安装Mysql5.7,解决无法访问DockerHub问题
|
7天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
17 1
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
79 0
|
1天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
12 4
|
25天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
58 3
Mysql(4)—数据库索引
|
10天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
49 2
|
13天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
56 4
|
19天前
|
存储 关系型数据库 MySQL
如何在MySQL中创建数据库?
【10月更文挑战第16天】如何在MySQL中创建数据库?