docker mysql主从复制 docker-compose版本

本文详细介绍了如何在Docker环境下配置MySQL主从复制,包括配置文件准备、主机与从机的操作步骤,以及如何测试主从复制功能。通过创建用户、设置连接参数和启动复制,确保数据在主从节点间同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 配置文件准备

文件整体框架如下
在这里插入图片描述

1.1 主机(master)配置文件

vim master/conf/my.cnf
[mysqld]
## 同一局域网内注意要唯一
server-id=100  
## 开启二进制日志功能,可以随便取(关键)
log-bin=master-bin
binlog-format=ROW     // 二级制日志格式,有三种 row,statement,mixed
## binlog-do-db=数据库名  //同步的数据库名称,如果不配置,表示同步所有的库

1.2 从机(slave)配置文件

vim slave/conf/my.cnf
[mysqld]
## 设置server_id,注意要唯一
server-id=101  
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin

1.3 docker-compose.yml文件

ps : docker需要下载mysql:8.0.25的镜像文件

# yaml 配置
version: "3.7"
services:
  mysql-master:
    image: "mysql:8.0.25"
    ports:
      - "33000:3306"
    command: "--default-authentication-plugin=mysql_native_password "
    container_name: mysql-master
    environment:
      MYSQL_ROOT_PASSWORD: "1314"
    volumes:
      - ./master/mysql_data:/var/lib/mysql
      - ./master/conf:/etc/mysql/conf.d
  mysql-slaver:
    image: "mysql:8.0.25"
    ports:
      - "33001:3306"
    command: "--default-authentication-plugin=mysql_native_password "
    container_name: mysql-slaver
    environment:
      MYSQL_ROOT_PASSWORD: "1314"
    volumes:
      - ./slave/mysql_data:/var/lib/mysql
      - ./slave/conf:/etc/mysql/conf.d

注释版本

# yaml 配置
version: "3.7"
services:
  mysql-master:   //主机
    image: "mysql:8.0.25"
    ports:
      - "33000:3306"   //外端口为33000
    command: "--default-authentication-plugin=mysql_native_password "
    container_name: mysql-master    //容器名字
    environment:
      MYSQL_ROOT_PASSWORD: "1314"
    volumes:     //数据卷本地持久化
      - ./master/mysql_data:/var/lib/mysql
      //容器内数据库数据存储路径为master/mysql_data,如果不存在会自动创建
      - ./master/conf:/etc/mysql/conf.d
      //容器内配置文件路径为master/conf下的my.cnf
  mysql-slaver:     //从机设置,同上
    image: "mysql:8.0.25"
    ports:
      - "33001:3306"
    command: "--default-authentication-plugin=mysql_native_password "
    container_name: mysql-slaver
    environment:
      MYSQL_ROOT_PASSWORD: "1314"
    volumes:
      - ./slave/mysql_data:/var/lib/mysql
      - ./slave/conf:/etc/mysql/conf.d

1.4 启动mysql

docker-compose up -d

在这里插入图片描述

2. 主机操作

2.1 进入容器

//进去容器终端
docker exec -it mysql-master /bin/bash
//登陆数据库
mysql -uroot -p1314

2.2 创建slave用户

mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
Query OK, 0 rows affected (0.00 sec)

在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。

2.3 获取master status

show master status

在这里插入图片描述

这里的file和position值会在从机中用到。

如果下面从机连接有问题,可以输入下面指令刷新日志,获取新状态

flush logs;

2.4 获取主机ip

docker inspect mysql-master |grep IPAddress

在这里插入图片描述
ip地址同样也是从机需要的

3. 从机操作

3.1 进入容器

//进去容器终端
docker exec -it mysql-slaver /bin/bash
//登陆数据库
mysql -uroot -p1314

3.2 设置连接主机参数

change master to master_host='172.23.0.2', 
master_user='slave', 
master_password='123456', 
master_port=3306, 
master_log_file='master-bin.000001', 
master_log_pos= 156, 
master_connect_retretry=30;

命令参数说明:

master_host :Master的地址,指的是容器的独立ip.

master_port:Master的端口号,指的是容器的端口号

master_user:用于数据同步的用户

master_password:用于同步的用户的密码

master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值

master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值

master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

3.3 开启主从复制

//开启主从模式
start slave;
//查看从机连接状态
show slave status \G;

连接成功如图所示:
在这里插入图片描述
如果Slave_IO_Running显示no或者connecting,检查:

1.file文件和position位置是否准确写入,可以尝试刷新日志操作

2.主机网络ip地址和端口是否正确

3.检查主机设置的slaver密码是否正确

4.检查Last_IO_Error_Timestamp字段报错信息

在这里插入图片描述

4. 测试主从复制

主机新建数据库

新建表并插入数据

mysql> create database test;
Query OK, 1 row affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.03 sec)

新建表并插入数据

mysql> use test;
Database changed
mysql> create table mytbl(
    -> id varchar(16),
    -> name varchar(32));
Query OK, 0 rows affected (0.08 sec)

mysql> insert into mytbl value(1,"jack");
Query OK, 1 row affected (0.02 sec)

mysql> select* from mytbl;
+------+------+
| id   | name |
+------+------+
| 1    | jack |
+------+------+
1 row in set (0.00 sec)

mysql> 

检查从机

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| mytbl          |
+----------------+
1 row in set (0.00 sec)

mysql> select* from mytbl;
+------+------+
| id   | name |
+------+------+
| 1    | jack |
+------+------+
1 row in set (0.00 sec)

mysql> 

如图所示结果,主从复制设置成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值