用 Docker 构建 MySQL 主从环境

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

用 Docker 构建 MySQL 主从环境

前言

本篇文章记录我使用 docker-compose 以及 dockerfile 来构建基于 binlog 的 MySQL 主从环境。

如果你严格按照文中的步骤进行配置,相信很快就可以搭建好一个基础的 MySQL 主从环境。

介绍

用 Docker 构建 MySQL 主从环境
MySQL 主从同步分为 5 个步骤:

  1. master 节点将数据的更新记录写到 binary log 中。

  2. slave 节点开启 IO 线程连接 master 节点,请求获取指定 binary log 文件的指定位置之后的日志。

  3. master 节点的 binary log dump 线程将指定的 binary log 信息推送给 slave 节点。

  4. slave 节点的 IO 线程接收到消息后,将日志内容写入 relay log 文件。

  5. slave 节点的 SQL 线程检测到 relay log 新增了内容,马上解析 relay log 文件生成相应的 SQL 语句,并将这些 SQL 语句重放到数据库,保证主从数据一致性。

配置

创建目录结构

首先先搞定目录结构,我的目录结构如下,如果想按照自己的想法来组建目录,在下文中的 docker-compose.yaml 文件与 Dockerfile 文件要注意修改文件路径。

用 Docker 构建 MySQL 主从环境

配置 docker-compose 模版文件

version: "3"
services:
  mysql-master:
    build:
      context: ./
      dockerfile: mysql/master/Dockerfile
    container_name: mysql-master
    volumes:
      - ./mysql/master/data:/var/lib/mysql
    restart: always
    ports:
      - 3305:3306
    links:
      - mysql-slave

  mysql-slave:
    build:
      context: ./
      dockerfile: mysql/slave/Dockerfile
    container_name: mysql-slave
    volumes:
      - ./mysql/slave/data:/var/lib/mysql
    restart: always
    ports:
      - 3306:3306

配置 master 节点的 cluster.cnf 文件以及 Dockerfile 文件

[mysqld]
server_id=100
binlog-ignore-db=mysql
log-bin=replicas-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
slave_skip_errors=1062

# 我的 MySQL 为 8.x,需要如下配置
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

~

FROM mysql:latest
ADD ./mysql/master/cluster.cnf /etc/mysql/conf.d/cluster.cnf
ENV MYSQL_ROOT_PASSWORD=password

配置 slave 节点的 cluster.cnf 文件以及 Dockerfile 文件

[mysqld]
server_id=101
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=mixed
slave_skip_errors=1062
relay_log=replicas-mysql-relay-bin
log_slave_updates=1
read_only=1

# 我的 MySQL 为 8.x,需要如下配置
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

~

FROM mysql:latest
ADD ./mysql/slave/cluster.cnf /etc/mysql/conf.d/cluster.cnf
ENV MYSQL_ROOT_PASSWORD=password

创建容器

docker-compose up -d mysql-master mysql-slave

运行上述命令进行容器创建,如果构建时间过长,可以考虑更换镜像源,例如下面几个国内优质镜像源:

  1. 网易:http://hub-mirror.c.163.com

  2. 阿里云:http://你的ID.mirror.aliyuncs...

  3. 中国科学技术大学:http://docker.mirrors.ustc.ed...

构建完成之后,使用 docker ps 命令查看一下容器是否正常运行,出现如下情形则可以认为已经构建成功。

用 Docker 构建 MySQL 主从环境

配置 slave 节点

用 Docker 构建 MySQL 主从环境

首先使用 docker 命令进入到 mysql-master 容器中,再登录到 mysql 输入 show master status 命令获取主库状态,这里我们要关心两个参数 File 以及 Position,之后配置从库会用到这两个参数。

用 Docker 构建 MySQL 主从环境

接下来使用 docker 命令进入 mysql-slave 容器,再登录到 mysql 输入以下语句进行与 mysql-master 连接。

CHANGE MASTER TO
    MASTER_HOST='mysql-master',
    MASTER_USER='root',
    MASTER_PASSWORD=你设置的密码,
    MASTER_LOG_FILE=上一步得到的 File 参数,
    MASTER_LOG_POS=上一步得到的 Position 参数;

输入完成后再键入 start slave 命令启动 slave 服务。启动之后输入 show slave status G 命令查看 slave 节点状态,出现如下情形可认为配置成功。

用 Docker 构建 MySQL 主从环境

测试主从节点同步状态

用 Docker 构建 MySQL 主从环境

登录到 mysql-master 节点,创建一个全新的库,创建成功之后,切换到 mysql-slave 节点,输入 show databases; 命令,查看是否成功同步,出现如下情形则配置成功。其他操作可以自己尝试,这里不再做演示。

用 Docker 构建 MySQL 主从环境

总结

这是我自己尝试搭建 MySQL 主从架构所记录的步骤,如果有卡在哪一步,可以留言与我交流。😊😊😊

来源:https://segmentfault.com/a/1190000023336513

END

推荐好文

强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

为什么MySQL不推荐使用uuid或者雪花id作为主键?

为什么建议大家使用 Linux 开发?爽(外加七个感叹号)

IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)

炫酷,SpringBoot+Echarts实现用户访问地图可视化(附源码)

记一次由Redis分布式锁造成的重大事故,避免以后踩坑!

十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统(附源码)

用 Docker 构建 MySQL 主从环境

原文始发于微信公众号(Java笔记虾):用 Docker 构建 MySQL 主从环境