1. 关闭服务器防火墙
#开始前需要先把linux的防火墙关掉
#查看防火墙状态
systemctl status firewalld
#关闭防火墙
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 时则配置成功
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');
7. 问题点
- slave_SQL_running : NO
运行 show slave status 发现有个报错日志,提示从库无法创建 test 数据库。这个是因为从库存在 Test 而主库没有,在主库运行了 creata Databse test 后导致从库 sql 复制关闭
在从库执行写操作也会导致
从库所在的数据库重启也会导致
- slave_IO_running : connect
从库指向主机的地址是公网IP,被服务防火墙拦截,在服务器防火墙规则中配置,允许自己IP访问自己即可。