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 小时前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql
梦梦代码精1 小时前
电商系统不是技术堆叠:LikeShop如何用分层Hold住复杂业务?
java·docker·代码规范
YOU OU3 小时前
Redis初识
数据库·redis·缓存
zhoupenghui1683 小时前
【AI大模型应用开发】【项目实战】13.RAG智慧问答项目-(一)项目介绍&项目架构&项目环境配置
人工智能·docker·ai·milvus·rag·attu·rag智慧问答项目
峥无4 小时前
深入理解MySQL事务与MVCC机制
数据库·mysql
江畔柳前堤5 小时前
第13章:docker生产环境部署实战
运维·git·docker·容器·代码复审
livemetee6 小时前
【关于redis高性能,高可用处理】
数据库·redis·缓存
Omics Pro7 小时前
首个针对生物医药LLM智能体的全流程过程级评测框架
数据库·人工智能·windows·redis·量子计算
要开心吖ZSH7 小时前
MVCC 进阶:快照读 vs 当前读、幻读与 Next-Key Lock
java·数据库·sql·mysql·mvcc
万亿少女的梦1688 小时前
基于Spring Boot的天空影院电影网站系统设计与实现
java·spring boot·mysql·vue·系统设计