docker-compose mysql8主从同步配置

使用 docker-compose 配置一主两的mysql8

一、配置文件

1.添加 .env 文件

是一个隐藏文件,可以通过 ls -a 查看。非必要可以在docker-compose.yml 中写死

TAG=8

MASTER0_SERVER_ID=1
MASTER0_NODE_1_SERVER_ID=10
MASTER0_NODE_2_SERVER_ID=20


MASTER_MYSQL_ROOT_PASSWORD=root
NODE_MYSQL_ROOT_PASSWORD=root

SERVER_ID 不能重复
MASTER_MYSQL_ROOT_PASSWORD 主库root 的密码
NODE_MYSQL_ROOT_PASSWORD 从库root 的密码

在这里插入图片描述

2.添加 docker-compose.yml

2.1 建立容器网络

// 查看已有网络
docker network ls

// 删除网络
docker network rm [network id]

// 查看网络详细
dokcer network inspect [network name]

// 新建网络
docker network create [network name]
docker network create learn_shop

version: "3"

services:
  
  mysql-master0: &mysql-master0
    image: mysql:8
    container_name: mysql-master0
    security_opt:
      - seccomp:unconfined
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - TZ=Asia/Shanghai
    ports:
      - 36005:3306
    expose:
      - "3306"
    volumes:
      - ./mysql-master0/data:/var/lib/mysql
      - ./mysql-master0/conf:/etc/mysql/conf.d
      - ./mysql-master0/logs:/logs
    command: 
        --server-id=1
        --default-authentication-plugin=mysql_native_password
        --log-bin=mysql-bin
        --character-set-server=utf8mb4
        --collation-server=utf8mb4_unicode_ci
        --innodb_flush_log_at_trx_commit=1
        --sync_binlog=1
      
  mysql-master0-node1: &mysql-master0-node1
    <<: *mysql-master0
    container_name: mysql-master0-node1
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MASTER_MYSQL_ROOT_PASSWORD=root
      - TZ=Asia/Shanghai
    ports:
      - 36006:3306
    depends_on:
      - mysql-master0
    volumes:
      - ./mysql-master0-node1/data:/var/lib/mysql
      - ./mysql-master0-node1/conf:/etc/mysql/conf.d
      - ./mysql-master0-node1/logs:/logs
    command:
        --server-id=11
        --default-authentication-plugin=mysql_native_password
        --log-bin=mysql-bin
        --character-set-server=utf8mb4
        --collation-server=utf8mb4_unicode_ci
        --innodb_flush_log_at_trx_commit=1

  mysql-master0-node2:
    <<: *mysql-master0-node1
    container_name: mysql-master0-node2
    ports:
      - 36007:3306
    volumes: 
      - ./mysql-master0-node2/data:/var/lib/mysql
      - ./mysql-master0-node2/conf:/etc/mysql/conf.d
      - ./mysql-master0-node2/logs:/logs
    command:
        --server-id=12
        --default-authentication-plugin=mysql_native_password
        --log-bin=mysql-bin
        --character-set-server=utf8mb4
        --collation-server=utf8mb4_unicode_ci
        --innodb_flush_log_at_trx_commit=1
networks: # 添加已有网络
    default:
        external:
            name: learn_shop

二、目录结构

在对应的文件夹下新建目录
在这里插入图片描述
在这里插入图片描述

三、安装

在 /home/docker/mysql-master 目录下执行 docker-compose up -d 命令,开始安装mysql。使用 docker-compose logs -f 查看安装的日志。

在这里插入图片描述
安装完成后这个时候还不可以数据同步。

四、新建用户、同步数据

mysql -uroot -proot

1.在主库中执行以下

-- 添加用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';

-- 修改密码加密方式
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl';

-- 添加所有权限
-- GRANT all PRIVILEGES on *.* to 'repl'@'%';

-- 添加同步权限
grant replication slave on *.* to 'repl'@'%';

-- 刷新权限
flush privileges;

-- 查询主库同步状态
SHOW MASTER STATUS;

记住以下两个数据,在后面会有用
在这里插入图片描述

2.在两个从库中执行

-- 更新从库两步的主库,使用 SHOW MASTER STATUS 查询,
-- MASTER_LOG_FILE = "File", MASTER_LOG_POS = "Position", 
-- MASTER_PASSWORD = "上面新的同步用户"
-- MASTER_HOST 主库的 ip 地址(如果同一网络,可以使用容器名称)
CHANGE 
MASTER TO MASTER_HOST='mysql-master0', 
MASTER_PORT=3306,
MASTER_USER='repl', 
MASTER_PASSWORD='repl', 
MASTER_LOG_FILE='mysql-bin.000010', 
MASTER_LOG_POS=156;

-- 重新启动 slave 服务
stop slave;
start slave;

3.查看从库的同步状态

SHOW slave STATUS \G

在这里插入图片描述

五、强制数据同步

1、查询主数据库的信息

SHOW MASTER STATUS ;

在这里插入图片描述
2、停止从数据库同步,修改同步文件、重启同步

STOP SLAVE;

CHANGE 
MASTER TO
MASTER_HOST='mysql-master0',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_LOG_FILE='mysql-bin.000042',
MASTER_LOG_POS=72825;

START SLAVE;

注意: test.sql为测试数据

drop database IF EXISTS `test`;
CREATE DATABASE `test` CHARACTER SET 'utf8mb4';

use test;

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_test
-- ----------------------------
DROP TABLE IF EXISTS `t_test`;
CREATE TABLE `t_test`  (
  `id` int NOT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_test
-- ----------------------------

SET FOREIGN_KEY_CHECKS = 1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值