04_MySQL 通过 Docker 在同一个服务器上搭建主从集群(一主一从)

发布于:2025-07-01 ⋅ 阅读:(24) ⋅ 点赞:(0)

04_MySQL 通过 Docker 在同一个服务器上搭建主从集群(一主一从)


🧰 准备工作

1. 拉取 MySQL 镜像

bash


复制编辑
docker pull mysql:8.0.26

2. 创建主从配置目录

bash复制编辑mkdir -p /root/mysql/master/conf
mkdir -p /root/mysql/master/data
mkdir -p /root/mysql/master/mysql-files

mkdir -p /root/mysql/slave/conf
mkdir -p /root/mysql/slave/data
mkdir -p /root/mysql/slave/mysql-files

3. 编写 docker-compose.yml 文件

yaml复制编辑version: '3.8'

services:
  mysql-master:
    image: mysql:8.0.26
    container_name: mysql-master
    restart: always
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - /root/mysql/master/conf/:/etc/mysql/
      - /root/mysql/master/mysql-files:/var/lib/mysql-files
      - master-data:/var/lib/mysql
    networks:
      - mysql-net

  mysql-slave:
    image: mysql:8.0.26
    container_name: mysql-slave
    restart: always
    ports:
      - "3308:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    depends_on:
      - mysql-master
    volumes:
      - /root/mysql/slave/conf/:/etc/mysql/
      - /root/mysql/slave/mysql-files:/var/lib/mysql-files
      - slave-data:/var/lib/mysql
    networks:
      - mysql-net

volumes:
  master-data:
  slave-data:

networks:
  mysql-net:
    driver: bridge

4. 编写主从数据库配置文件

4.1 主库配置(放到 /root/mysql/master/conf/my.cnf
ini复制编辑[mysqld]
# 唯一的server_id
server-id=1

# 开启二进制日志功能
log-bin=mysql-bin

# 二进制日志缓存大小
binlog_cache_size=1M

# 二进制日志过期天数
expire_logs_days=7

# 二进制日志格式(mixed/statement/row)
binlog_format=STATEMENT

# 忽略复制以下数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema

# 只复制指定数据库
binlog-do-db=testdb

# 允许 LOAD DATA / SELECT INTO OUTFILE 操作的目录(必须存在)
secure_file_priv=/var/lib/mysql-files
4.2 从库配置(放到 /root/mysql/slave/conf/my.cnf
ini复制编辑[mysqld]
# 唯一的server_id,不能和主库相同
server-id=2

# 中继日志文件名
relay-log=relay-log

# 设置只读,防止手动写入破坏复制
read_only=1

# 允许 LOAD DATA / SELECT INTO OUTFILE 操作的目录(必须存在)
secure_file_priv=/var/lib/mysql-files

5. 启动容器

bash


复制编辑
docker compose up -d

6. 容器内操作及权限配置

6.1 进入主库容器及 MySQL
bash复制编辑docker exec -it mysql-master bash
mysql -uroot -p123456
  • 查看 server_id
sql


复制编辑
SHOW VARIABLES LIKE 'server_id';
  • 授权 root 用户远程登录权限:
sql复制编辑GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;

6.2 进入从库容器及 MySQL
bash复制编辑docker exec -it mysql-slave bash
mysql -uroot -p123456
  • 同样授权 root 用户远程登录权限:
sql复制编辑GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;

7. 主从复制配置

7.1 主库授权复制账户
bash复制编辑docker exec -it mysql-master bash
mysql -uroot -p123456
sql复制编辑-- 创建复制用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

-- 授权复制权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';

FLUSH PRIVILEGES;
7.2 查询主库状态,记录 FilePosition
sql


复制编辑
SHOW MASTER STATUS;

示例输出:

File Position
mysql-bin.000004 156

7.3 在从库配置主库信息
bash复制编辑docker exec -it mysql-slave bash
mysql -uroot -p123456
sql复制编辑CHANGE MASTER TO 
  MASTER_HOST='172.17.180.75',
  MASTER_USER='slave',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3307,
  MASTER_LOG_FILE='mysql-bin.000004',
  MASTER_LOG_POS=156;

注意:

如果遇到错误,先执行:

sql复制编辑STOP SLAVE;
RESET SLAVE;

然后重新执行 CHANGE MASTER TO 命令。


7.4 启动从库复制线程
sql


复制编辑
START SLAVE;
7.5 查看从库复制状态
sql


复制编辑
SHOW SLAVE STATUS\G;

确认 Slave_IO_RunningSlave_SQL_Running 都为 Yes


8. 连接测试

  • 使用 Navicat 或其他数据库客户端分别连接主库(端口 3307)和从库(端口 3308)测试。

9. 测试主从复制效果

  • 在主库创建数据库和表:
sql复制编辑CREATE DATABASE testdb;
USE testdb;

CREATE TABLE test_table (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50)
);

INSERT INTO test_table (name) VALUES ('test1'), ('test2');
  • 查看从库是否同步了 testdb 数据库和数据。

网站公告

今日签到

点亮在社区的每一天
去签到