使用Docker 实现 MySQL 循环复制(二)

系列文章

使用Docker 实现 MySQL 循环复制(一)


目录

  • 系列文章
  • [1. 创建三个 mysql 容器](#1. 创建三个 mysql 容器)
    • [1.1 准备三个 mysql 容器的挂载卷](#1.1 准备三个 mysql 容器的挂载卷)
    • [1.2 为三个mysql实例创建配置文件](#1.2 为三个mysql实例创建配置文件)
    • [1.3 修改各目录的权限以满足 mysql 容器的要求](#1.3 修改各目录的权限以满足 mysql 容器的要求)
    • [1.4 创建 docker-compose.yaml 文件](#1.4 创建 docker-compose.yaml 文件)
    • [1.5 创建容器](#1.5 创建容器)

1. 创建三个 mysql 容器

1.1 准备三个 mysql 容器的挂载卷

由于容器是运行时的,因此 mysql 容器的数据文件就必须映射到主机的磁盘以确保数据的持久化。

bash 复制代码
mkdir mysql-3 && cd mysql-3;
mkdir -p mysql1/{conf,data,log};
for i in {2..3}; do cp -R mysql1 mysql$i; done
  • 准备三个 mysql 容器的挂载卷,其中 conf 保存配置文件,data 是数据目录,log 保存日志文件。
  • 大括号扩展用于生成任意字符串
  • 双句点语法 (..) 可扩展成一个序列,例如:使得 {m..p} 扩展为 m n o p

1.2 为三个mysql实例创建配置文件

bash 复制代码
for i in {1..3}; do 
cat > mysql$i/conf/mysql.cnf <<EOF
[mysqld]
server-id=$i
user=mysql 
datadir=/var/lib/mysql
log-bin=mysql-bin 
relay-log=mysql-relay-bin 
gtid-mode=ON 
enforce-gtid-consistency=ON 

[mysql]
default-character-set=utf8 
EOF
done

这些配置文件都是MySQL服务器的主配置文件,用于指定服务器的行为和特性。

  • [mysqld]:这是MySQL服务器的主要配置块。
    • server-id=$i:这个参数定义了MySQL服务器的唯一ID。在复制环境中,每个服务器必须有一个唯一的ID。这里使用变量i来动态生成ID,从1到3。
    • user=mysql:这个参数指定了MySQL服务器运行时使用的用户。在这个例子中,用户是mysql。
    • datadir=/var/lib/mysql:这个参数指定了MySQL服务器的数据目录。所有的数据库文件都将保存在这里。
    • log-bin=mysql-bin:这个参数启用了二进制日志记录。二进制日志记录了对数据库的所有更改,对于复制非常重要。
    • relay-log=mysql-relay-bin:这个参数指定了中继日志的位置。中继日志用于记录从主服务器接收到的事件,以便在从服务器上重放。
    • gtid-mode=ON:这个参数启用了全局事务标识符(GTID)。GTID是一种自动分配给每个事务的唯一标识符,使得跟踪和管理复制变得更加容易。
    • enforce-gtid-consistency=0N:这个参数强制要求所有操作都保持GTID一致性。如果设置为ON,则所有操作都必须具有有效的GTID集,否则将被拒绝。
  • [mysql]:这是MySQL客户端的配置块。
    • default-character-set=utf8:这个参数设置了默认字符集为UTF-8。

1.3 修改各目录的权限以满足 mysql 容器的要求

bash 复制代码
chmod 0444 ./mysql{1..3}/conf/mysql.cnf 
chmod 0777 ./mysql{1..3}/data
chmod 0777 ./mysql{1..3}/log

检查目录结构是否创建成功以及权限是否正确:

bash 复制代码
ls -ld mysql{1..3}/{conf/mysql.cnf,data,log}

1.4 创建 docker-compose.yaml 文件

使用 docker compose 编排三个 mysql 容器,docker compose 是在独立服务器上的容器资源编排工
,对于大型分布式集群进行容器编排时就要使用 Kubernetes。docker compose 可以让我们通过一个 YAML 文件来定义和运行多个容器应用。

bash 复制代码
cat > docker-compose.yaml <<EOF
version: "3"
services:
  mysql1:
    image: mysql:8.0.18
    ports:
      - "3306:3306"
    deploy:
      replicas: 1
    restart: always
    volumes:
      - ./mysql1/conf:/etc/mysql/conf.d
      - ./mysql1/data:/var/lib/mysql
      - ./mysql1/log:/var/log
    networks:
      - dbNetwork
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=oracle
  mysql2:
    image: mysql:8.0.18
    ports:
      - "3307:3306"
    deploy:
      replicas: 1
    restart: always
    volumes:
      - ./mysql2/conf:/etc/mysql/conf.d
      - ./mysql2/data:/var/lib/mysql
      - ./mysql2/log:/var/log
    networks:
      - dbNetwork
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=oracle
  mysql3:
    image: mysql:8.0.18
    ports:
      - "3308:3306"
    deploy:
      replicas: 1
    restart: always
    volumes:
      - ./mysql3/conf:/etc/mysql/conf.d
      - ./mysql3/data:/var/lib/mysql
      - ./mysql3/log:/var/log
    networks:
      - dbNetwork
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=oracle
networks:
  dbNetwork:
EOF
  • services:定义了三个服务,每个服务代表一个 MySQL 容器
  • ports::映射容器端口到主机端口,3307:3306 表示将容器内的 3306 端口映射到主机上的 3307 端口。这种映射方式可以让外部主机通过宿主机的 3307 端口访问到容器内的 MySQL 服务。避免了多个容器在同一台宿主机上使用相同的端口冲突
  • replicas: 1:设置副本数为 1,意味着只有一个实例。
  • volumes::挂载本地目录到容器内路径
  • networks::定义网络,dbNetwork 是自定义的网络名称


1.5 创建容器

执行 docker compose up -d 命令创建三个 mysql 容器。

bash 复制代码
docker compose up -d

检查容器的运行时状态,注意容器名称与端口:

bash 复制代码
docker ps
  • CONTAINER ID:容器的唯一标识符
  • IMAGE:容器所基于的镜像
  • COMMAND:容器启动时执行的命令
  • CREATED:容器创建的时间
  • STATUS:容器的状态,如是否正在运行
  • PORTS:容器暴露的端口
  • NAMES:容器的名字
相关推荐
我叫黑大帅16 小时前
MySQL 并发插入竞态问题:原子写入实践指南
后端·mysql·面试
我会尽全力 乐观而坚强17 小时前
MySQL零基础入门(二)
数据库·mysql·adb
蜀道山老天师19 小时前
K8s Secret 与 ConfigMap 配置管理及动态更新实战详解
云原生·容器·kubernetes
梦想的颜色19 小时前
【Docker部署插件】:使用 Docker 部署生产级 Kafka 完整版教程
安全·docker·中间件·kafka·消息队列·docker-compose·后端开发
↘"LYong19 小时前
旧版 CentOS 安装 Docker 完整指南(附国内镜像加速)
linux·运维·docker
龙石数据20 小时前
MySQL 全量同步到 Hive 怎么做?三步配置教程
数据库·hive·mysql·数据治理·数据中台
满意的星月21 小时前
基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
docker·微服务·架构
bukeyiwanshui1 天前
20260624 k8s pod命令
云原生·容器·kubernetes
网络研究院1 天前
Brave浏览器放大招引入容器功能,实现多账户安全隔离
网络·安全·容器·浏览器·数据·隐私
sukioe1 天前
【无标题】
后端·docker·centos