一:概述
在Docker环境下部署Mysql8 一个主库多个从库,实现主从复制。
二:详细操作
创建mysql容器,不知道如何创建的可以查看[该播客]
docker run -d -i --name mysql -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 mysql
docker run -d -i --name mysqlslave -e MYSQL_ROOT_PASSWORD=password -p 3307:3306 mysql
docker run -d -i --name mysqlslave2 -e MYSQL_ROOT_PASSWORD=password -p 3308:3306 mysql
使用Navicate测试是否成功
配置Master数据库
docker exec -it mysql bash
vim /etc/mysql/my.cnf
#如果vim不能使用执行下面命令
apt-get update apt-get install vim
##在my.cnf中添加如下配置
[mysqld]
server-id=100 ## 同一局域网内要唯一
log-bin=master-bin ##二进制文件名称 【mysql8默认开启binlong】
binlog-format=ROW ##二进制日志格式 row,statement,mixed
重启master数据库
docker restart mysql
配置Slave数据库
docker exec -it mysqlslave bash
vim /etc/mysql/my.cnf
[mysqld]
server-id=101
log-bin=mysql-slave-bin
## 配置中继日志
relay_log=mysql-relay-bin
read_only=1 ## 设置为只读
重启slave数据库
docker restart mysqlslave
配置slave2数据库和slave配置一样
docker exec -it mysqlslave2 bash
vim /etc/mysql/my.cnf
[mysqld]
server-id=102
log-bin=mysql-slave-bin
## 配置中继日志
relay_log=mysql-relay-bin
read_only=1 ## 设置为只读
进入master数据库开启主从复制
docker exec -it mysql bash
mysql -uroot -p
show master status ##记住File和Position
查看master在docker容器中的通信地址
在cmd中执行 记住IP
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql
进入Slave客户端
docker exec -it mysqlslave bash
mysql -uroot -p
change master to master_host='172.17.0.3', master_user='root', master_password='password', master_port=3306, master_log_file='master-bin.000001', master_log_pos=339, master_connect_retry=30;
开启Slave
start slave;
查看是否开启成功
show slave status;
##保证下面两个Yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
使用Navicat进行测试
三:涉及知识
二进制日志的三种格式详解
Statement
每一条修改数据的sql都会记录到master的bin_log中,slave在复制的时候sql进程会解析成master端执行过的相同的sql在slave库上再次执行,只记录sql语句执行的细节不需要记录每一行变化的细节。
Row
日志中会记录成每一行数据修改的形式以及数据的变化,然后在slave端再对相同的数据进行修改。
Mixed模式(混合模式)
实际上就是前两种模式的结合,在mixed模式下,mysql会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也是在statement和row之间选择一种。
Slave_IO_Running: Yes
Slave的IO进程:用来读取Master数据库的binlog日志,然后写入Slave本地的中继日志。
Slave_SQL_Running: Yes
Slave的处理进程:将中继日志数据分析成sql一行一行的执行,同步主库的数据
主从复制是单进程的所以主从数据会存在延时,后期会出一篇文章单独讲解原理