开始

一、准备工作
- 环境: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
四、主从复制配置
- 进入主库容器:
Shell
docker exec -it mysql-master mysql -uroot -p
- 创建复制用户:
SQL
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
- 查看主库 binlog 信息:
SQL
SHOW MASTER STATUS;
会看到类似:
plain
File: mysql-bin.000001
Position: 1286
- 登录从库,配置复制:
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;
- 启动复制:
SQL
START REPLICA;
- 查看复制状态:
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