基于docker的mysql主从同步搭建

环境

1、macbook
2、docker 20.10.17
3、docker desktop

开始搭建

* 第一步:准备容器文件存放的物理文件地址目录(/Users/qeek/mydata 可以按需定义)

主库

mkdir -pv /Users/qeek/mydata/mysql-master/log
mkdir -pv /Users/qeek/mydata/mysql-master/data
mkdir -pv /Users/qeek/mydata/mysql-master/conf.d
mkdir -pv /Users/qeek/mydata/mysql-master/conf

从库

mkdir -pv /Users/qeek/mydata/mysql-slave/log
mkdir -pv /Users/qeek/mydata/mysql-slave/data
mkdir -pv /Users/qeek/mydata/mysql-slave/conf.d
mkdir -pv /Users/qeek/mydata/mysql-slave/conf

* 第二步:docker desktop(docker桌面管理工具)-> Preferences -> Resources -> File sharding

把上面新创建的目录添加进去后重启docker(绑定宿主机目录到docker容器中),否则会报目录权限问题。

* 第三步:设置主从服务配置

主库

新增 /Users/qeek/mydata/mysql-master/conf/my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

从库

新增 /Users/qeek/mydata/mysql-slave/conf/my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1

* 第四步:启动docker mysql服务

主库

* docker run --name mysql-master -p 3307:3306 -v /Users/qeek/mydata/mysql-master/log:/var/log/mysql -v /Users/qeek/mydata/mysql-master/data:/var/lib/mysql -v /Users/qeek/mydata/mysql-master/conf.d:/etc/mysql/conf.d/ -v /Users/qeek/mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.31

从库

* docker run --name mysql-slave -p 3308:3306 -v /Users/qeek/mydata/mysql-slave/log:/var/log/mysql -v /Users/qeek/mydata/mysql-slave/data:/var/lib/mysql -v /Users/qeek/mydata/mysql-slave/conf.d:/etc/mysql/conf.d/ -v /Users/qeek/mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.31

查看docker镜像清单
docker container ls -a

图片描述

进入docker 主库镜像内
docker exec -it mysql-master bash

进入docker 主库mysql内
mysql -u root -p

主库内设置从库读取数据账号
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
主库内授权账号复制权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';
主库内设置密码加密方法(mysql8.0.4之前使用的“ mysql_native_password”认证,之后用的“ caching_sha2_password”,修改成老的加密认证方式)
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES; //刷新配置
查看mysql master主库状态,记住“File”和“Position”值

"exit;"退出主库mysql,再"exit;"退出mysql主库镜像

查看mysql主库docker镜像内ip地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-master

进入mysql从库镜像内
docker exec -it mysql-slave bash

进入从库mysql内
mysql -uroot -p

设置从库的主库地址及日志文件、当前数据位置“master_log_file = 上面 File ”、“master_log_pos = 上面 Position”
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mall-mysql-bin.000005', master_log_pos=157, master_connect_retry=30;

启动从库同步
start slave;

查看从库同步状态,如果“Slave_IO_State = Waiting for source to send event”,那么恭喜你mysql主从配置完成,去主库操作会自动同步从库了。
show slave status;

* 第五步:最终效果

* 第六步:mysql binlog 日志查看,日志以二进制存储,所以需要先转码,利用mysql安装包内的mysqlbinlog工具可以转码。

主从复制本质还是通过监听binlog日志来达到数据同步效果

posted @ 2022-12-02 10:39  纵观  阅读(81)  评论(0)    收藏  举报