docker-compose部署MySQL主从复制集群

MySQL是一款开源的关系型数据库管理系统,它利用结构化查询语言(SQL)来存储、检索和管理数据。本文主要介绍使用docker-compose部署MySQL主从复制集群。

一、为什么搭建MySQL主从复制?

1)实时灾备:主库挂了,从库可以立刻顶上,业务不掉线。

2)读写分离:80% 的业务都是"读"(查询)。让主库专门负责"写"(增删改),从库专门负责"读",性能直接起飞。

3)数据分析:从库执行耗时 10 分钟的大报表,完全不影响主库的线上业务。

二、docker-compose部署MySQL主从复制

2.1 环境准备

Docker:v20.10.24

docker-compose:v2.1.0

宿主机IP:192.168.10.131

2.2 创建目录

bash 复制代码
mkdir -p /data/mysql/{mysql-master,mysql-slave}
mkdir -p /data/mysql/mysql-master/{conf,data,log}
mkdir -p /data/mysql/mysql-slave/{conf,data,log}

2.3 创建配置文件

mysql-master主库

bash 复制代码
vim /data/mysql/mysql-master/conf/my.cnf
============================================================
[mysqld]
#保证主库和从库的server_id不同
server-id=1
#开启二进制日志
log-bin=master-bin
#设置二进制日志格式(mixed,statement,row)
binlog_format=row
#二进制日志文件过期时间
expire_logs_days=30
#跳过所有的错误,继续执行复制操作
slave-skip-errors=all
#确保binlog日志写入后与硬盘同步
sync_binlog=1

mysql-slave从库

bash 复制代码
vim /data/mysql/mysql-slave/conf/my.cnf
============================================================
[mysqld]
#服务器唯一ID,必须和master主库不一致
server-id=2
#开启二进制日志
log-bin=slave-bin
#设置二进制日志格式(mixed,statement,row)
binlog_format=row
#二进制日志文件过期时间
expire_logs_days=30
#设置中继日志
relay_log=relay-log-bin
#表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
#从库设置为只读
read_only=1

2.4 编写 docker-compose.yml

bash 复制代码
cd /data/mysql

vim docker-compose.yml
============================================================
version: '3'
services:
   # 服务名, 主节点
  mysql-master:
    # 容器名
    container_name: mysql-master
    # mysql镜像
    image: mysql:8.0.37
    restart: always
    # 暴露端口号,宿主机端口:容器内端口号
    ports:
      - 3306:3306
    privileged: true
    # 按照路径挂载目录:日志、配置文件、数据
    volumes:
      - $PWD/mysql-master/log:/var/log/mysql
      - $PWD/mysql-master/conf/my.cnf:/etc/mysql/conf.d/my.cnf
      - $PWD/mysql-master/data:/var/lib/mysql
    # 环境变量:数据库root密码
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      TZ: Asia/Shanghai
    # 指定数据库默认字符集和排序规则
    command: [
        '--character-set-server=utf8mb4',           
        '--collation-server=utf8mb4_general_ci',  
        '--max_connections=3000',
        '--lower_case_table_names=1'
    ]
    # 使用的网卡
    networks:
      - myweb

  # 从节点
  mysql-slave:
    container_name: mysql-slave
    image: mysql:8.0.37
    restart: always
    ports:
      - 3307:3306
    privileged: true
    volumes:
      - $PWD/mysql-slave/log:/var/log/mysql
      - $PWD/mysql-slave/conf/my.cnf:/etc/mysql/conf.d/my.cnf
      - $PWD/mysql-slave/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      TZ: Asia/Shanghai
    command: [
        '--character-set-server=utf8mb4',
        '--collation-server=utf8mb4_general_ci',
        '--max_connections=3000',
        '--lower_case_table_names=1'
    ]
    networks:
      - myweb

# 配置网络
networks:
# 使用桥接模式
  myweb:
    driver: bridge
    
    
# 检查配置文件语法
docker-compose -f docker-compose.yml config

2.5 启动容器

bash 复制代码
docker-compose up -d

2.6 查看容器状态

bash 复制代码
docker-compose ps
============================================================
NAME                COMMAND                  SERVICE             STATUS              PORTS
mysql-master        "docker-entrypoint.s..."   mysql-master        running             0.0.0.0:3306->3306/tcp, :::3306->3306/tcp
mysql-slave         "docker-entrypoint.s..."   mysql-slave         running             0.0.0.0:3307->3306/tcp, :::3307->3306/tcp

2.7 登录mysql-master

bash 复制代码
docker exec -it mysql-master mysql -u root -p
Enter password:                    #输入123456

# 创建同步用户并授权
mysql> create user 'rep'@'%' identified with mysql_native_password by '123456';
mysql> grant replication slave on *.* to 'rep'@'%';
mysql> flush privileges;

# 查看二进制日志
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
|master-bin.000002 |     825  |              | 			            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

其中,File列是二进制日志文件,Position列显示位置偏移量,Binlog_Ignore_DB指定不同步的数据库

2.8 登录mysql-slave

bash 复制代码
docker exec -it mysql-slave mysql -u root -p
Enter password:                 #输入123456

#连接master主库
mysql> change master to master_host='192.168.10.131',
master_port=3306,
master_user='rep',master_password='123456',
master_log_file='master-bin.000002',
master_log_pos=825;

2.9 mysql-slave启动同步

bash 复制代码
#启动同步
mysql> start slave;

#查看同步状态
mysql> show slave status\G;

#结果中Slave_IO_Running和Slave_SQL_Running都为yes,则表示同步成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

2.10 验证MySQL主从复制

bash 复制代码
#mysql-master主库创建数据
mysql> create database school;

#mysql-slave从库查看数据
mysql> show databases;

从上图看出,mysql-slave从库已经查看到mysql-master主库创建的数据,证明MySQL主从复制已经成功。

相关推荐
且去填词10 小时前
DeepSeek-R1 实战:数据分析
人工智能·python·mysql·语言模型·deepseek·structured data
周杰伦的稻香10 小时前
MySQL【bug】- spatial key
mysql
悄悄敲敲敲10 小时前
MySQL表的内外连接
数据库·mysql
kaico201810 小时前
MYSQL的各版本对比
数据库·mysql
WongLeer10 小时前
Go + GORM 多级分类实现方案对比:内存建树、循环查询与 Preload
开发语言·后端·mysql·golang·gorm
青云交10 小时前
Java 大视界 -- Java+Flink CDC 构建实时数据同步系统:从 MySQL 到 Hive 全增量同步(443)
java·mysql·flink·实时数据同步·java+flink cdc·mysql→hive·全增量同步
亮子AI10 小时前
【MySQL】node.js 如何判断连接池是否正确连接上了?
数据库·mysql·node.js
ruleslol19 小时前
MySQL的段、区、页、行 详解
数据库·mysql
天若有情67319 小时前
校园二手交易系统实战开发全记录(vue+SpringBoot+MySQL)
vue.js·spring boot·mysql