基于 docker 搭建 mysql5.7 主从复制
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
安装 docker 的教程可以看我的另一篇文章拉取 mysql 镜像的步骤也在里面在这不再重复
https://blog.csdn.net/wanzijy/article/details/128695674
1. 主机搭建
因为本人虚拟机中已经存在了 mysql 所以在使用镜像创建容器的时候就不使用 3306 端口以防有影响
1.1 创建容器
docker run --name mysql-master -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
- --name mysql-master 指定容器的名字为 mysql-master
- -p 3307:3306 对外暴露的 3307 接口对应的映射到内部的 3306 接口
- -e MYSQL_ROOT_PASSWORD=root 指定 mysql 中 root 用户的密码为 root
创建完后进入容器
docker exec -it mysql-master /bin/bash
1.2 安装 vim 与 net-tools
apt-get install net-tools
apt-get install vim
如果正常安装成功的话本章节就不用继续往下看了
1.2.1 安装 vim 与 net-tools 报错解决
如果这个时候出现以下信息不要慌往下看
出现上面的信息的话其实只要更新一下 apt-get 就好输入以下命令
apt-get update
如果正常更新成功的话就像刚刚一样安装 net-tools 和 vim 就好本章节也不用继续往下看了
1.2.2 更新 apt-get 报错解决
此时可能会如下出现报错信息
在容器内进入 /etc/apt/ 目录
因为要改配置文件保险起见还是复制一份备份的较好
# 备份 source.list
cp sources.list sources.list.bak
然后执行下面命令添加 apt 镜像源
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
然后再执行apt-get update
成功后再安装vim 和 net-tools
出现下面的警告可以忽略
1.3 修改配置
打开 mysql 的配置文件
vim /etc/mysql/my.cnf
配置如下
server-id=100
log-bin=mysql-bin
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=mixed
- server-id 同一局域网内注意要唯一
- log-bin 开启二进制日志功能
- binlog-ignore-db 复制过滤不需要备份的数据库mysql库一般不同步
- binlog_cache_size 为每个 session 分配的内存在事务过程中用来存储二进制日志的缓存
- binlog_format 主从复制的格式mixed, statement, row默认格式是 statement
配置好后ctrl + d 退出容器
然后重启容器
docker restart mysql-master
2. 从机搭建
2.1 创建容器
docker run --name mysql-slave -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
像上述一样安装 vim 与 net-tools
2.2 修改配置
配置如下
server-id=102
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin
binlog-ignore-db=mysql
log_bin_trust_function_creators=true
binlog_cache_size=1M
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误避免slave端复制中断
## 如1062错误是指一些主键重复1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
- relay_log 配置中继日志
- log_bin_trust_function_creators 如果需要同步函数或者存储过程设置为 true
- slave_skip_errors 跳过主从复制中遇到的所有错误或指定类型的错误避免 slave 端复制中断如 1062 错误是指一些主键重复1032 错误是因为主从数据库数据不一致
3. 配置
3.1 主机操作
进入主机所在容器登录 mysql
创建数据同步用户 slave并授予 REPLICATION SLAVE 权限和 REPLICATION CLIENT 权限用于在主从库之间同步数据然后刷新
# 创建用户 slave密码为 123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
# 授权
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 刷新
flush privileges;
查看 File(日志文件) 和 Position(复制开始的位置) 的值
show master status;
3.2 从机操作
3.2.1 绑定主机
进入从机所在容器登录 mysql
change master to master_host='192.168.56.130', master_user='slave', master_password='123456', master_port=3307 , master_log_file='mysql-bin.000002',master_log_pos=761, master_connect_retry=30;
- master_host 主机的地址指的是容器的独立 IP
- master_port主机的端口号指的是容器的端口号要和 docker 启动时, 3306 端口向外暴露的端口号一致
- master_user用于数据同步的用户
- master_password用于同步的用户的密码
- master_log_file指定从机从哪个日志文件开始复制数据即上面中提到的 File 字段的值
- master_log_pos从哪个位置开始读即上面中提到的 Position 字段的值
- master_connect_retry如果连接失败重试的时间间隔单位是秒默认是60秒
3.2.2 启动
# 启动主从复制
start slave;
# 查看主从同步状态
show slave status\G;
当看到上面图片出现的两个值时即为搭建成功