Docker-Compose实现MySQL之主从复制

1. 主服务器(IP:192.168.186.77)

1.1 docker-compose.yml 

services:
  mysql-master:
    image: mysql:latest  # 使用最新版本的 MySQL 镜像
    container_name: mysql-master  # 容器的名称
    environment:
      MYSQL_ROOT_PASSWORD: 123456  # MySQL root 用户的密码
      MYSQL_DATABASE: masterdb  # 初始化时创建的数据库
      MYSQL_USER: master  # 初始化时创建的用户
      MYSQL_PASSWORD: 123456  # 初始化时创建的用户密码
    ports:
      - "3306:3306"  # 端口映射,将容器内的 3306 端口映射到主机的 3306 端口
    volumes:
      - mysql-master-data:/var/lib/mysql  # 数据卷映射,用于数据持久化
    command: --server-id=1 --log-bin=mysql-bin --binlog-format=ROW  # MySQL 的启动命令,配置二进制日志和服务器 ID
    
volumes:
  mysql-master-data:  # 定义数据卷,用于存储 MySQL 数据文件,保证数据库数据的持久性

1.2. 启动命令

docker-compose up -d

 1.3 测试连接

 ​​​​​​

注:可以使用初始化用户进行测试连接,本文为了方便演示直接连接root用户。 

2. 从服务器(IP:192.168.186.216)

2.1 docker-compose.yml

services:
  mysql-slave:
    image: mysql:latest  # 使用最新版本的 MySQL 镜像
    container_name: mysql-slave  # 容器的名称
    environment:
      MYSQL_ROOT_PASSWORD: 123456  # MySQL root 用户的密码
      MYSQL_DATABASE: slavedb  # 初始化时创建的数据库
      MYSQL_USER: slave  # 初始化时创建的用户
      MYSQL_PASSWORD: 123456  # 初始化时创建的用户密码
    ports:
      - "3306:3306"  # 端口映射,将容器内的 3306 端口映射到主机的 3306 端口
    volumes:
      - mysql-slave-data:/var/lib/mysql  # 数据卷映射,用于数据持久化
    command: --server-id=2 --log-bin=mysql-bin --binlog-format=ROW  # MySQL 的启动命令,配置二进制日志和服务器 ID

volumes:
  mysql-slave-data:  # 定义数据卷,用于存储 MySQL 数据文件,保证数据库数据的持久性

2.2 启动命令 

docker-compose up -d

2.3 测试连接 

 3. 配置主从复制

  3.1 在主服务器上,为从服务器创建一个具有复制权限的用户

CREATE USER 'master_slave'@'%' IDENTIFIED BY '123456' REQUIRE SSL;
GRANT REPLICATION SLAVE ON *.* TO 'master_slave'@'%';
FLUSH PRIVILEGES;

运行结果:

 > CREATE USER 'master_slave'@'%' IDENTIFIED BY '123456' REQUIRE SSL
[2024-07-23 17:34:23] 在 20 ms 内完成
> GRANT REPLICATION SLAVE ON *.* TO 'master_slave'@'%'
[2024-07-23 17:34:23] 在 26 ms 内完成
> FLUSH PRIVILEGES
[2024-07-23 17:34:23] 在 21 ms 内完成

3.2 获取主服务器的二进制日志位置信息

SHOW MASTER STATUS;

注:记下FilePosition的值,从服务器需要配置。

3.3 在从服务器上,配置复制指向主服务器 

CHANGE MASTER TO
    MASTER_HOST ='192.168.186.77', # 主服务器的 IP 地址
    MASTER_USER ='master_slave', # 主服务器上配置的复制用户
    MASTER_PASSWORD ='123456', # 复制用户的密码
    MASTER_LOG_FILE ='mysql-bin.000004', # 主服务器的日志文件名
    MASTER_LOG_POS =4494, # 日志文件的位置
    MASTER_SSL=1;

运行结果:
> CHANGE MASTER TO
      MASTER_HOST ='192.168.186.77', # 主服务器的 IP 地址
      MASTER_USER ='master_slave', # 主服务器上配置的复制用户
      MASTER_PASSWORD ='123456', # 复制用户的密码
      MASTER_LOG_FILE ='mysql-bin.000004', # 主服务器的日志文件名
      MASTER_LOG_POS =4494, # 日志文件的位置
      MASTER_SSL=1
[2024-07-23 17:38:19] [HY000][1287] 'CHANGE MASTER' is deprecated and will be removed in a future release. Please use CHANGE REPLICATION SOURCE instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_HOST' is deprecated and will be removed in a future release. Please use SOURCE_HOST instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_USER' is deprecated and will be removed in a future release. Please use SOURCE_USER instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_PASSWORD' is deprecated and will be removed in a future release. Please use SOURCE_PASSWORD instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_LOG_FILE' is deprecated and will be removed in a future release. Please use SOURCE_LOG_FILE instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_LOG_POS' is deprecated and will be removed in a future release. Please use SOURCE_LOG_POS instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_SSL' is deprecated and will be removed in a future release. Please use SOURCE_SSL instead
[2024-07-23 17:38:19] [HY000][1760] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
[2024-07-23 17:38:19] 在 73 ms 内完成

3.4 启动从服务器上的复制过程 

START SLAVE;

运行结果:

> START SLAVE
[2024-07-23 17:39:28] [HY000][1287] 'START SLAVE' is deprecated and will be removed in a future release. Please use START REPLICA instead
[2024-07-23 17:39:28] 在 71 ms 内完成

3.5 检查从服务器的复制状态 

SHOW SLAVE STATUS;

注:查看Slave_IO_RunningSlave_SQL_Running都应为Yes,说明配置成功。

4. 进行验证 

4.1 主服务器执行语句

-- 创建数据库
CREATE DATABASE IF NOT EXISTS replication_test;

-- 使用新创建的数据库
USE replication_test;

-- 创建表
CREATE TABLE replication_table
(
    id         INT AUTO_INCREMENT PRIMARY KEY,
    message    VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 插入数据
INSERT INTO replication_table (message)
VALUES ('你好,这是一条测试消息。');

运行结果: 

> CREATE DATABASE IF NOT EXISTS replication_test
[2024-07-23 17:48:19] 33 ms 中有 1 行受到影响
> USE replication_test
[2024-07-23 17:48:19] 在 6 ms 内完成
replication_test> CREATE TABLE replication_table
                  (
                      id         INT AUTO_INCREMENT PRIMARY KEY,
                      message    VARCHAR(255) NOT NULL,
                      created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                  )
[2024-07-23 17:48:19] 在 69 ms 内完成
replication_test> INSERT INTO replication_table (message)
                  VALUES ('你好,这是一条测试消息。')
[2024-07-23 17:48:19] 53 ms 中有 1 行受到影响

4.2 从服务器执行语句

-- 使用数据库
USE replication_test;

-- 查询表以验证复制
SELECT * FROM replication_table;

5. 总结 

         基于IDEA和Docker-Compose简化操作过程,仅供学习参考,欢迎评论交流。

  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值