1 Docker 安装MySQL主从复制
1.1 主从复制原理
- MySQL 主从复制的核心就是二进制日志,过程如下
- 如上图所示,过程分为三步
-
1、master 主库在事务提交时,会把数据变更记录在二进制日志文件 binlog 中;
2、从库读取主库的二进制日志文件 binlog,写入到从库的中继日志 relay log;
3、slave 从库执行中继日志中的事件。
1.2 主从搭建步骤
1.2.1 新建主服务器容器实例3307
docker run -p 3307:3306 \
--privileged=true \
-v /app/mysql-master/log:/var/log/mysql \
-v /app/mysql-master/data:/var/lib/mysql \
-v /app/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql-master \
-d mysql:5.7
1.2.2 进入/app/mysql-master/conf,新建my.cnf 配置文件
my.cnf 配置文件内容
[mysqld]
## 设置server_id, 同一个局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed, statement, row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
1.2.3 重启mysql-master
容器实例
docker restart mysql-master
- 1
1.2.4 进入mysql-master
容器实例
docker exec -it mysql-master /bin/bash
1.2.5 登录mysql,创建数据同步用户 # 登录mysql mysql -uroot -p # 创建数据同步用户 mysql> create user 'slave'@'%' identified by '123456'; # 授权 mysql> grant replication slave, replication client on *.* to 'slave'@'%'; mysql> flush privileges; 1.2.6 新建从服务器容器实例3308 docker run -p 3308:3306 \ --privileged=true \ -v /app/mysql-slave/log:/var/log/mysql \ -v /app/mysql-slave/data:/var/lib/mysql \ -v /app/mysql-slave/conf:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=root \ --name mysql-slave \ -d mysql:5.7 1.2.7 进入/app/mysql-slave/conf,新建my.cnf 配置文件 my.cnf 配置文件内容 [mysqld] ## 设置server_id, 同一个局域网内需要唯一 server_id=102 ## 指定不需要同步的数据库名称 binlog-ignore-db=mysql ## 开启二进制日志功能,以备slave作为其它数据库实例的Master时使用 log-bin=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=mysql-relay-bin ## log_slave_updates表示slave将复制事件写进自己的二进制日志 log_slave_updates=1 ## slave设置只读(具有super权限的用户除外) read_only=1 1.2.8 重启mysql-slave容器实例 docker restart mysql-slave 1 1.2.9 进入主数据库查看主从同步状态 # 进入主数据库容器实例 docker exec -it mysql-master /bin/bash # 登录mysql mysql -uroot -p # 查看主从同步状态 mysql> show master status; 1.2.10 在从数据库中配置主从复制 # 进入从数据库容器实例 docker exec -it mysql-slave /bin/bash # 登录mysql mysql -uroot -p # 在从数据库中配置主从复制 mysql> change master to master_host='192.168.198.131', master_user='slave', master_password='123456', master_port=3307, master_log_file='mysql-bin.000004', master_log_pos=154, master_connect_retry=30; # 在从数据库中查看主从同步状态(注:加 \G 可以以键值对格式竖排展示) mysql> show slave status \G;
1.2.11 在从数据库中开启主从同步
- 如图所示,红框中参数值为No,表示还未开始同步
1.2.12 主从复制测试
# 主数据库建库建表加数据
create database testdb;
use testdb;
create table tb01 (id int,name varchar(20));
insert into tb01 (id,name) values (1,'jack');
select * from tb01;
# 从数据库查看记录
use testdb;
select * from tb01;