💜 想真正擅长编程? 从一门课程开始,100% 免费

mysql主从搭建

开始

img

一、准备工作

  • 环境:Docker 已安装
  • 镜像:mysql:8.0
  • 网络:建议创建一个独立的 Docker 网络,方便主从容器通信
Shell
# 创建 docker 网络
docker network create mysql_net

二、启动主库(Master)

Shell
docker run -d \
  --name mysql-master \
  --network mysql_net \
  -p 3307:3306 \
  -e MYSQL_ROOT_PASSWORD=root \
  -e MYSQL_DATABASE=online_car \  
  -v /home/docker/mydata/mysql/master/conf:/etc/mysql/conf.d \
  -v /home/docker/mydata/mysql/master/data:/var/lib/mysql \  
  mysql:8.0

主库配置(my.cnf)

在 /mydata/mysql/master/conf/my.cnf 增加以下内容:

plain
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=testdb   # 指定要复制的数据库

修改完成后重启主库:

Shell
docker restart mysql-master

三、启动从库(Slave)

Shell
docker run -d \
  --name mysql-slave \
  --network mysql_net \
  -p 3308:3306 \
  -e MYSQL_ROOT_PASSWORD=root \
  -e MYSQL_DATABASE=testdb \  
  -v /home/docker/mydata/mysql/slave/conf:/etc/mysql/conf.d \
  -v /home/docker/mydata/mysql/slave/data:/var/lib/mysql \
  mysql:8.0

从库配置(my.cnf)

在 /mydata/mysql/slave/conf/my.cnf 增加以下内容:

plain
[mysqld]
server-id=2
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index

修改完成后重启从库:

Shell
docker restart mysql-slave

四、主从复制配置

  1. 进入主库容器:
Shell
docker exec -it mysql-master mysql -uroot -p
  1. 创建复制用户:
SQL
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
  1. 查看主库 binlog 信息:
SQL
SHOW MASTER STATUS;

会看到类似:

plain
File: mysql-bin.000001
Position:  1286
  1. 登录从库,配置复制:
Shell
docker exec -it mysql-slave mysql -uroot -p
CHANGE REPLICATION SOURCE TO
    SOURCE_HOST='mysql-master',
    SOURCE_PORT=3306,
    SOURCE_USER='repl',
    SOURCE_PASSWORD='123456',
    SOURCE_LOG_FILE='mysql-bin.000001',
    SOURCE_LOG_POS=1286;
  1. 启动复制:
SQL
START REPLICA;
  1. 查看复制状态:
SQL
SHOW REPLICA STATUS\G

只要 Replica_IO_Running 和 Replica_SQL_Running 都为 Yes,说明主从配置成功。


五、验证

在主库执行:

SQL
use testdb;
CREATE TABLE user(id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO user VALUES(1, 'Alice');

在从库查询:

SQL
SELECT * FROM user;

能查到数据说明主从同步正常。

防火墙放行

Java
firewall-cmd --add-port=3307/tcp --permanent

六、在若依框架中使用

配置:主从数据库链接

使用以下注解

plain
// 以下注解指定这个方法的数据库查询查询的是从库
@Slave
// 以下注解指定这个方法的数据库查询查询的是从库
@Master