主从复制的搭建
简单演示 通过 虚拟机来模拟两台服务器的搭建 ! ! !
原理篇看:
首先记得开发 端口, 或者这里测试 就直接关闭防火墙了 !! !
systemctl stop firewalld 关闭防火墙
systemctl disable firewalld // 关闭防火墙开机自启
1. 拉取MySQL镜像
docker pull mysql:8.0
2. 创建网络(让容器可以互相通信)
docker network create mysql-replication-net3. 启动主服务器(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 库的变更

记得 重启服务器 :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)
MySQL 8.0 默认使用了新的安全认证方式,主从复制环境需要额外配置才能兼容,这里测试环境:
当您使用默认的
caching_sha2_password创建用户时:
从库尝试连接主库时,会收到认证插件要求
从库的 MySQL 需要支持与主库相同的认证协议
默认配置下,从库可能无法完成完整的认证握手
解决方法 : -- 在主库执行
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都没有内容,我主库创建一个表,然后插入内容:
看看从库是否有:

进入从库中查看:

数据同步成功了 !!!