1. 关闭服务器防火墙

  1. #开始前需要先把linux的防火墙关掉
  2. #查看防火墙状态
  3. systemctl status firewalld
  4. #关闭防火墙
  5. systemctl stop firewalld

2. 启动两台 Mysql

#拉取mysql5.7镜像
docker pull mysql:5.7

#启动第一个mysql(主)(暴露33060端口)
docker run -p 33060:3306 --name mysql5.7_33060_m -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
#启动第二个mysql(从)(暴露33061端口)
docker run -p 33061:3306 --name mysql5.7_33061_s1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

# 查看运行的mysql容器
docker ps

说明:
-p 33060 :外部端口为 33060 内部端口为 3306
—name : 容器名称
-e : 运行参数,设置ROOT 密码为 123456
-d : 后台运行

3. 修改主库配置文件

#进入主mysql
docker exec -it mysql5.7_33060_m /bin/bash

#然后需要更新apt-get
apt-get update
#安装vim
apt-get install vim -y
#打开配置文件
vim /etc/mysql/my.cnf
#然后复制下面的配置,黏贴到[mysqld]下


#设置主mysql的id
server-id = 1
#启用二进制日志
log-bin=mysql-bin
#设置logbin格式
binlog_format = STATEMENT

#然后按esc键,输入 :wq 退出
#退出容器
exit

3.1 docker 容器内安装 vim

apt-get update 先更新 再安装 apt-get install vim -y

如果还是不行,更新镜像地址

mv /etc/apt/sources.list /etc/apt/sources.list.bak

echo  "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free" >/etc/apt/sources.list
echo  "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free" >>/etc/apt/sources.list
echo  "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free" >>/etc/apt/sources.list
echo  "deb http://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free" >>/etc/apt/sources.list

apt-get update

再下载 VIM:apt-get install vim -y

4. 修改从库配置文件

#然后进入从mysql
docker exec -it mysql5.7_33061_s1 /bin/bash


#设置从mysql的id
server-id = 2
#启用中继日志
relay-log = mysql-relay

# :wq 退出
#退出容器
exit

修改完成后重启两个容器

#重启两个mysql容器
docker restart mysql5.7_33060_m
docker restart mysql5.7_33061_s1

5. 配置主从

5.1 创建主从复制账号,并查询使用的是哪个日志和当前日志的 offset

#进入主mysql容器
docker exec -it mysql5.7_33060_m /bin/bash

#登录主mysql
mysql -uroot -p123456 -h10.211.55.26 -P33060

#创建用于主从复制的账号db_sync,密码db_sync
create user 'db_sync'@'%' identified with mysql_native_password by 'db_sync';
#授权
grant replication slave on *.* to 'db_sync'@'%';

#刷新权限
FLUSH PRIVILEGES;

#确认位点 记录下文件名以及位点(重启或者刷新都会改变)
show master status;

# mysql-bin.000001
# 823

#退出主mysql
exit

5.2 从数据库 开启同步

#登录从mysql
mysql -uroot -p123456 -h124.222.10.22 -P33061

#先停止同步
STOP SLAVE;

#修改从库指向到主库,使用上一步记录的文件名以及位点
# master_host docker容器linux的ip地址
# master_port 主mysql暴露的端口
# master_user 主mysql的用户名
# master_password 主mysql的密码
#(最后两项修改成刚刚从主mysql查到的,主mysql每次刷新权限或者重启时,这两个值都会改变,所以每次都需要查看是否相同)
CHANGE MASTER TO
master_host = '124.222.10.22',
master_port = 33060,
master_user = 'db_sync',
master_password = 'db_sync',
master_log_file = 'mysql-bin.000003',
master_log_pos = 316;

#启动同步
START SLAVE;

#查看Slave_IO_Runing和Slave_SQL_Runing字段值都为Yes,表示同步配置成功。
show slave status \G;

#退出mysql
exit
#退出容器
exit

当从库显示IO_Running 和 SQL_Runing 为 yes 时则配置成功image.png

6. 测试

创建数据库,创建表并插入数据

create database zq;

use zq;

create table t_user1(
    `t_id` int primary key,
    `t_name` varchar(20) not null
);

insert into t_user1 values(1, 'angenin');

image.png

7. 问题点

  1. slave_SQL_running : NO

运行 show slave status 发现有个报错日志,提示从库无法创建 test 数据库。这个是因为从库存在 Test 而主库没有,在主库运行了 creata Databse test 后导致从库 sql 复制关闭
在从库执行写操作也会导致
从库所在的数据库重启也会导致

  1. slave_IO_running : connect

从库指向主机的地址是公网IP,被服务防火墙拦截,在服务器防火墙规则中配置,允许自己IP访问自己即可。