简单演示 通过 虚拟机来模拟两台服务器的搭建 ! ! !

原理篇看:

首先记得开发 端口, 或者这里测试 就直接关闭防火墙了 !! !

systemctl stop firewalld 关闭防火墙

systemctl disable firewalld // 关闭防火墙开机自启

1. 拉取MySQL镜像

docker pull mysql:8.0

2. 创建网络(让容器可以互相通信)

docker network create mysql-replication-net

3. 启动主服务器(Master)

docker run -d --name mysql-master \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=rootpassword \
-e MYSQL_REPLICATION_USER=repl \
-e MYSQL_REPLICATION_PASSWORD=replpassword \
-p 3306:3306 \
-v mysql-master-data:/var/lib/mysql \
mysql:8.0 \
--server-id=1 \
--log-bin=mysql-bin \
--binlog-format=ROW \
--binlog-do-db=testdb \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

这里的 --server-id=1 指定集群服务下 的 id 为1 不能重复 , 同时 没有指定 --read-only=0 默认 0 为读写 这里只记录testdb 库的变更

File

当前正在写入的二进制日志文件名(如 mysql-bin.000004

Position

当前二进制日志文件的位置(偏移量,单位:字节),表示下一个事件将写入的位置

Binlog_Do_DB

仅记录指定数据库的变更(白名单),默认为空表示记录所有数据库

Binlog_Ignore_DB

忽略指定数据库的变更(黑名单),默认为空表示不忽略任何数据库

Executed_Gtid_Set

已执行的 GTID 集合(仅在启用 GTID 复制时有

记得 重启服务器 :docker restart mysql-master

4. 配置主服务器

进入主服务器容器:

下载

docker exec -it mysql-master mysql -uroot -prootpassword

创建远程连接账号 ,并授予主从复制权限:

CREATE DATABASE testdb;
CREATE USER 'repl'@'%' IDENTIFIED BY 'replpassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
  • REPLICATION SLAVE:表示该用户有权限作为从库连接主库并同步数据。

  • *.*:权限作用于所有数据库和表。

  • 'repl'@'%':允许从任何主机(%)使用 repl 用户连接。

注意这里的 MySQL 8.0 的认证插件警告

  • 如果 repl 用户使用 caching_sha2_password 插件,从库可能无法直接连接(需配置 SSL 或改用 mysql_native_password

  1. MySQL 8.0 默认使用了新的安全认证方式,主从复制环境需要额外配置才能兼容,这里测试环境:

当您使用默认的 caching_sha2_password 创建用户时:

  1. 从库尝试连接主库时,会收到认证插件要求

  2. 从库的 MySQL 需要支持与主库相同的认证协议

  3. 默认配置下,从库可能无法完成完整的认证握手

  • 解决方法 : -- 在主库执行

    ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'replpassword';

查看二进制日志的坐标:

-- 记下File和Position值
SHOW MASTER STATUS;

我这里是: 文件 mysql-bin.000003 位置     881| testdb

5. 启动从服务器(Slave)

这里在创建mysql的时候,就指文件的配置,比如这里是服务id 为2 还有当前的库只读 --read-only=1 \

docker run -d --name mysql-slave \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=rootpassword \
-p 3307:3306 \
-v mysql-slave-data:/var/lib/mysql \
mysql:8.0 \
--server-id=2 \
--log-bin=mysql-bin \
--binlog-format=ROW \
--relay-log=mysql-relay-bin \
--log-slave-updates=1 \
--read-only=1 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

6. 配置从服务器

进入从服务器容器:

docker exec -it mysql-slave mysql -uroot -prootpassword

执行SQL命令(替换MASTER_LOG_FILE和MASTER_LOG_POS为之前记下的值):

这里是同一个网络可以指定名称即可,其他可以指定 具体的ip地址

执行sql语句

CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='replpassword',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS= 881;

4. 开启同步操作! ! !

START SLAVE;
-- 检查从服务器状态
SHOW SLAVE STATUS\G

可以看到:

测试: 这里开始 主库有一个testdb库,如何我从库手动创建一个testdb 库,开始dou都没有内容,我主库创建一个表,然后插入内容:

看看从库是否有:

进入从库中查看:

数据同步成功了 !!!