mysql主从复制绕WAF
2023-10-26 09:45:06

MySQL Replication

主从复制,简单来讲就是将一台MySQL服务器的数据库文件同步到其他MySQL服务上,使得被同步的MySQL服务也能读取到我们的数据

为什么要有主从复制?主要是为了缓解MySQL服务的压力。在用户访问量大的情况下,若所有读和写操作都在一台服务器上,就容易导致服务崩溃。主从复制模式中,将写操作给主服务器(Master),读操作给从服务器(Slave),从服务器(Slave)可以部署多台,分摊压力,以解决数据库单点故障。大部分情况下,读的操作肯定是大于写的操作。

image-20231024174743554

  • master将SQL的写操作记录(update、delete、insert)写入binary log中,并通知slave更新数据
  • slave向master请求binary log,master根据偏移量将新的binary log发给slave
  • slave接收到新的binary log后,写入自身的relay log中继日志中
  • slave检测到中继日志更新,将更新的内容同步到自身数据库中

接下来用docker来搭建MySQL主从复制的环境

docker pull mysql:5.7 拉取mysql 5.7的镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: "3.3"

services:
master:
image: mysql:5.7
ports:
- "3301:3306"
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- "./master/my.cnf:/etc/mysql/my.cnf"
# - "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- mysql-net
slave:
image: mysql:5.7
ports:
- "3302:3306"
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- "./slave/my.cnf:/etc/mysql/my.cnf"
networks:
- mysql-net
networks:
mysql-net:
name: mmysql

master和slave都要有自身的server-id,并且每一个server-id不能相同

master的配置./master/my.cnf

1
2
3
4
5
6
7
8
[mysqld]

server-id=100

secure_file_priv=
log-bin=master-bin
binlog-format=ROW
binlog-do-db=test

slave的配置./slave/my.cnf

1
2
3
4
5
6
[mysqld]

server-id=101
secure_file_priv=
log-bin=slave-bin
relay_log=relay-bin

docker-compose up -d启动主从两台服务

  • 主服务器
1
2
3
docker exec -it master mysql -uroot -p123456
reset master;
show master status;

查看master的binary log文件名和position,下面slave的change master要用到

image-20231024194724414

binary log/var/lib/mysql/master-bin.000001

  • 从服务器
1
2
3
4
5
docker exec -it slave mysql -uroot -p123456
change master to master_host='master', master_user='root', master_password='123456', master_port=3306, master_log_file='master-bin.000001', master_log_pos=154
start slave;
show slave statue\G;
# stop slave;

image-20231024194037032

打印出这些内容就说明连接成功了。接下来在master上的写操作都会被同步到slave上。