环境信息

操作系统:WIndows11
mysql版本: mysql8.0

开始搭建

文件目录如下:

C:\mysql-cluster
├── docker-compose.yml
├── master
│   ├── data
│   └── my.cnf
└── slave
    ├── data
    └── my.cnf

主节点

创建数据文件夹

mkdir master/data

创建mysql配置文件

主节点

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW

从节点

创建数据文件夹

mkdir slave/data

创建mysql配置文件

主节点

[mysqld]
server-id=2
read-only=1

docker-compose文件

注意:在windows环境下,需要添加command: bash -c "chmod 644 /etc/mysql/conf.d/my.cnf && docker-entrypoint.sh mysqld" ,避免出现权限问题,导致mysql不识别配置文件

version: '3.8'

services:
  mysql-master:
    image: mysql:8.0
    container_name: mysql-master
    ports:
      - '4306:3306'
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - ./master/data:/var/lib/mysql
      - ./master/my.cnf:/etc/mysql/my.cnf
    command: bash -c "chmod 644 /etc/mysql/conf.d/my.cnf && docker-entrypoint.sh mysqld"  
    networks:
      - mysql-network
    healthcheck:
      test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost']
      interval: 10s
      retries: 5

  mysql-slave:
    image: mysql:8.0
    container_name: mysql-slave
    ports:
      - '4307:3306'
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - ./slave/data:/var/lib/mysql
      - ./slave/my.cnf:/etc/mysql/my.cnf
    command: bash -c "chmod 644 /etc/mysql/conf.d/my.cnf && docker-entrypoint.sh mysqld"  
    networks:
      - mysql-network
    depends_on:
      - mysql-master
    healthcheck:
      test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost']
      interval: 10s
      retries: 5

networks:
  mysql-network:
    driver: bridge

启动数据库

在当前目录下执行命令:

docker-compose up -d

如需关闭执行命令: docker-compose down

连接数据库

为了避免冲突,对端口做了改动
主库:127.0.0.1:4306 root/123456
从库: 127.0.0.1:4307 root/123456

开启数据库主从复制

开始前请确保数据库启动正常,查看docker容器状态是否running

主库

登录数据库

mysql -uroot -p123456

创建复制用户
用户名:repl
密码:repl123

CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

查看主库binlog位置,以下两个参数从库会用到
File: mysql-bin.000001
Position: 156

SHOW MASTER STATUS;

从库

进入容器后,登录数据库

mysql -uroot -p123456

创建主库连接,这里用到了前面查看主库binlog的两个参数,请根据实际进行修改

CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_USER='repl',
  MASTER_PASSWORD='repl123',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=156;

启动主从复制

START SLAVE;

查看主从复制状态

SHOW SLAVE STATUS\G;

确认以下两项为 Yes:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
    如果有错误,检查 Last_Error 字段,可能需要调整配置。

至此,mysql主从配置完成,进行测试

测试

在主节点创建数据库,表并插入数据

CREATE DATABASE test_db;
USE test_db;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50));
INSERT INTO users (name) VALUES ('Alice'), ('Bob');

登录从库检查是否进行数据复制

USE test_db;
SELECT * FROM users;

如果主从复制正常,从节点应该显示 Alice 和 Bob

生产环境建议

  1. 使用更复杂的密码。
  2. 配置防火墙,限制端口访问。
  3. 启用 SSL 加密主从通信。