基于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  纵观  阅读(29)  评论(0编辑  收藏  举报