Docker Compose部署SpringBoot2+Vue3+redis项目(Rockylinux9.6):MySQL 主从复制实战

概述

主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。

MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。

原理

搭建

我的两台服务器:master:192.168.92.13 ,slave:192.168.92.12

从库的docker安装Mysql语句

复制代码
[root@localhost ~]# docker run -d \
  --name mysql-slave \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /opt/mysql-slave/data:/var/lib/mysql \
  -v /opt/mysql-slave/conf:/etc/mysql/conf.d \
  mysql:8.0  

这里视频博主是 Linux 宿主机上用 yum/apt 安装的 MySQL,我是docker安装的,要修改一些配置

复制代码
[root@localhost ~]# sudo vi /etc/my.cnf
[root@localhost docker-compose]# cat /etc/my.cnf
[mysqld]
server-id = 1 #为 MySQL 实例指定一个唯一的标识符,用于主从复制环境中区分不同的服务器。
log-bin = mysql-bin #开启二进制日志(binary log),并指定日志文件的基础名称。
bind-address = 0.0.0.0 #指定 MySQL 服务监听的网络地址。0.0.0.0 表示监听所有可用的网络接口(IPv4)
read-only=0
[root@localhost ~]# cd /data/docker-compose/
[root@localhost docker-compose]# vi docker-compose.yml
  # MySQL 数据库服务
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: always
    environment:
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_DATABASE: big_event  # ✅ 已正确添加
    command:
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --lower-case-table-names=1
      - --performance-schema=1
      - --slow-query-log=ON           # 开启慢查询日志
      - --long-query-time=1.0         # 慢查询阈值(秒)
      - --log-output=FILE             # 将日志输出到文件
      - --slow-query-log-file=/var/log/mysql/slow.log   # 慢查询日志文件名
    volumes:
      - /data/mysql/data:/var/lib/mysql
      - /data/mysql/init:/docker-entrypoint-initdb.d:ro  #SQL 初始化
      - /data/mysql/logs:/var/log/mysql   # 新增:挂载日志目录,以便宿主机读取 slow.log
      - /etc/my.cnf:/etc/my.cnf:ro
    networks:
      - app-network
    ports:
      - "3306:3306"  # 保留,方便本地数据库工具连接  

#验证配置是否生效
[root@localhost docker-compose]# docker exec mysql mysql -uroot -p123456 -e "SHOW VARIABLES LIKE 'server_id';"
mysql: [Warning] Using a password on the command line interface can be insecure.
Variable_name   Value
server_id       1

我的是docker安装,从库配置:

复制代码
#1. 创建从库配置文件 /etc/my.cnf
[root@localhost ~]# vi /etc/my.cnf
[mysqld]
server-id = 2
read_only = 1
#2. 启动从库容器并挂载 /etc/my.cnf
docker run -d \
  --name mysql-slave \
  -p 3306:3306 \
  -v /etc/my.cnf:/etc/my.cnf:ro \
  -v /opt/mysql-slave/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:8.0
复制代码
#从库当中执行,登录到mysql:docker exec -it mysql-slave mysql -uroot -p123456
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='192.168.92.13',
  SOURCE_USER='itcast',
  SOURCE_PASSWORD='123456',
  SOURCE_LOG_FILE='mysql-bin.000001',
  SOURCE_LOG_POS=157;

是按照192.168.92.13的mysql内运行结果来填写的

测试

主库:

复制代码
mysql> create database db01;
)engine=innodb default charset=utf8mb4;
insert into tb_user(id,name,sex) values(null, 'Tom', '1'),(null, 'Trigger','0'),(null,'Dawn','1');Query OK, 1 row affected (0.02 sec)

mysql> use db01;
Database changed
mysql> create table tb_user(
    -> id int(11) primary key not null auto_increment,
    -> name varchar(50) not null,
    -> sex varchar(1)
    -> )engine=innodb default charset=utf8mb4;
Query OK, 0 rows affected, 1 warning (0.04 sec)

mysql> insert into tb_user(id,name,sex) values(null, 'Tom', '1'),(null, 'Trigger','0'),(null,'Dawn','1');
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> show tables
    -> ;
+----------------+
| Tables_in_db01 |
+----------------+
| tb_user        |
+----------------+
1 row in set (0.01 sec)

mysql> select * from tb_user
    -> ;
+----+---------+------+
| id | name    | sex  |
+----+---------+------+
|  1 | Tom     | 1    |
|  2 | Trigger | 0    |
|  3 | Dawn    | 1    |
+----+---------+------+
3 rows in set (0.00 sec)

mysql>

从库为自动刷新:

复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.04 sec)

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

总结

相关推荐
梦想的颜色1 小时前
Dockerfile 深度实战:从指令底层原理到生产级镜像构建的艺术
docker·容器·镜像·dockerfile·dockerfile解析
不吃土豆的马铃薯1 小时前
高并发服务器数据库连接池设计详解
服务器·网络·数据库·c++·mysql
Nontee2 小时前
新手数据库进阶:大白话图解MySQL的“官方档案”——Binlog
数据库·mysql
基德爆肝c语言2 小时前
MySQL:数据库基础
数据库·mysql
heimeiyingwang2 小时前
【架构实战】Docker容器化:从镜像到部署的完整实践
docker·容器·架构
遇见火星11 小时前
Docker Compose 完全入门:一键启动所有容器
运维·docker·容器·docker compose
syt_biancheng13 小时前
Redis初识
数据库·redis·缓存
杨运交14 小时前
[032][缓存模块]基于Redis Bitmap的用户行为统计实战:签到与日活分析
数据库·redis·缓存
云原生指北15 小时前
Apple Container Machine:把 Linux 搬进 Mac
macos·docker