在此之前需要提前安装好Docker和 Docker Compose 。

Docker搭建MySQL双主复制详细教程_docker

一、创建目录

首先创建一个本地数据挂载目录。

mkdir -p master1-data master2-data
  • 1.

二、编写docker-compose.yml

version: '3.7'

services:
  mysql-master1:
    image: mysql:5.7.36
    container_name: mysql-master1
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
    volumes:
      - ./master1-data:/var/lib/mysql
    ports:
      - "3306:3306"
    command: --server-id=1 --log-bin=mysql-bin --gtid-mode=ON --enforce-gtid-consistency=ON

  mysql-master2:
    image: mysql:5.7.36
    container_name: mysql-master2
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
    volumes:
      - ./master2-data:/var/lib/mysql
    ports:
      - "3307:3306"
    command: --server-id=2 --log-bin=mysql-bin --gtid-mode=ON --enforce-gtid-consistency=ON

volumes:
  master1-data:
  master2-data:
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.

三、拉取镜像

我是使用的mysql5.7.36版本的,如果不同,需要自行修改

docker pull mysql:5.7.36
  • 1.

Docker搭建MySQL双主复制详细教程_docker_02

四、启动 Docker Compose

docker-compose up -d
  • 1.

Docker搭建MySQL双主复制详细教程_容器_03

五、初始化双主复制

1、在第一个主数据库上配置复制用户

进入 mysql-master1 容器

docker exec -it mysql-master1 bash
  • 1.

登录 MySQL

mysql -u root -p
  • 1.

执行以下 SQL 命令

CREATE USER 'replica'@'%' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;

SHOW MASTER STATUS;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

记下 File 和 Position 的值。

2、在第二个主数据库上配置复制用户

进入 mysql-master2 容器

docker exec -it mysql-master2 bash
  • 1.

登录 MySQL

mysql -u root -p
  • 1.

执行以下 SQL 命令

CREATE USER 'replica'@'%' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;

SHOW MASTER STATUS;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

记下 File 和 Position 的值。

3、在第一个主数据库上配置从第二个主数据库同步

进入 mysql-master1 容器

docker exec -it mysql-master1 bash
  • 1.

登录 MySQL

mysql -u root -p
  • 1.

执行以下 SQL 命令

CHANGE MASTER TO
  MASTER_HOST='mysql-master2',
  MASTER_USER='replica',
  MASTER_PASSWORD='replica_password',
  MASTER_LOG_FILE='mysql-bin.000001', -- 使用第二个主数据库的File值
  MASTER_LOG_POS=154; -- 使用第二个主数据库的Position值

START SLAVE;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

4、在第二个主数据库上配置从第一个主数据库同步:

进入 mysql-master2 容器

docker exec -it mysql-master2 bash
  • 1.

登录 MySQL:

mysql -u root -p
  • 1.

执行以下 SQL 命令

CHANGE MASTER TO
  MASTER_HOST='mysql-master1',
  MASTER_USER='replica',
  MASTER_PASSWORD='replica_password',
  MASTER_LOG_FILE='mysql-bin.000001', -- 使用第一个主数据库的File值
  MASTER_LOG_POS=154; -- 使用第一个主数据库的Position值

START SLAVE;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

六、验证主从复制

,到这里,L双主复制就配置完成了,你可以尝试在一个主数据库上插入数据,并在另一个主数据库上检查数据,确定双主复制配置成功。正确的结果是,在一个数据库进行了新增、删除、修改等操作后的结果,在第二个数据库中会进行同步。