在Linux上使用Docker实现MySQL读写分离和主从复制
在使用读写分离之前,我们所有对数据库的操作都是针对一个数据库进行的,而在实际使用场景往往是读大于写。在应对高并发的时候,数据库的读性能就会成为瓶颈,如果在不上数据库集群的情况下,一般会采用读写分离和加入缓存来应对高并发。
使用Docker部署MySQL
我使用的系统是ArchLinux,需要先安装Docker和Docker-Compose。
1
|
sudo pacman -S docker docker-compose
|
添加当前用户到Docker用户组并启动Docker
1
2
3
4
|
sudo gpasswd -a $USER docker
sudo systemctl start docker
# 验证一下Docker是否启动
docker -v
|
编写docker-compose.yml文件
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
28
29
30
31
32
|
version: '3'
services:
mysql-main:
restart: always
image: mysql
container_name: mysql-main
volumes:
# 主库的数据库路径 路径自己创建
- $HOME/docker/mysql/main/data:/var/lib/mysql
# 主库的配置文件路径
- $HOME/docker/mysql/main/conf/my.cnf:/etc/mysql/my.cnf
environment:
# root用户密码和时区
- MYSQL_ROOT_PASSWORD=admin
- TZ=Asia/Shanghai
ports:
# 映射到本地的3307端口
- 3307:3306
mysql-slave:
restart: always
image: mysql
container_name: mysql-slave
volumes:
# 从库的数据库路径
- $HOME/docker/mysql/slave/data:/var/lib/mysql
# 从库的配置文件路径
- $HOME/docker/mysql/slave/conf/my.cnf:/etc/mysql/my.cnf
environment:
- MYSQL_ROOT_PASSWORD=admin
- TZ=Asia/Shanghai
ports:
- 3308:3306
|
编写主库和从库的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 主库配置
vim $HOME/docker/mysql/main/conf/my.cnf
[mysqld]
# 服务ID 在局域网内需要是唯一的
server-id=100
# 开启二进制日志
log-bin=mysql-bin
# 从库配置
vim $HOME/docker/mysql/slave/conf/my.cnf
[mysqld]
server-id=101
# 开启二进制日志
log-bin=mysql-slave-bin
# 配置中继日志
relay_log=edu-mysql-relay-bin
|
启动MySQL
1
2
3
4
5
6
7
8
|
# 使用docker compose
docker compose up -d
# 销毁容器使用 docker compose down
# 使用docker
docker run --name mysql-main -e MYSQL_ROOT_PASSWORD=admin -e TZ=Asia/Shanghai -v $HOME/docker/mysql/main/data:/var/lib/mysql -v $HOME/docker/mysql/main/conf/my.cnf:/etc/mysql/my.cnf -p 3307:3306 -d mysql
docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=admin -e TZ=Asia/Shanghai -v $HOME/docker/mysql/slave/data:/var/lib/mysql -v $HOME/docker/mysql/slave/conf/my.cnf:/etc/mysql/my.cnf -p 3308:3306 -d mysql
|
配置MySQL
配置主库
1
2
3
4
5
6
7
8
9
10
11
12
|
# 进入容器
docker exec -it mysql-main /bin/bash
# 输出容器的ip地址
cat /etc/hosts
# 连接mysql
mysql -u root -p
# 新建用于slave同步的用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 查看主服务状态
show master status;
# 执行后记下File和Position,并且在从库配置完之前不要有任何crud操作。
|
配置从库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 进入容器
docker exec -it mysql-slave /bin/bash
# 连接mysql
mysql -u root -p
# host、port、user、password是主库的ip地址、端口、刚才新建用户的用户名和密码
# log_file、log_pos是主库 show master status 后的File、Position
change master to
master_host='172.19.0.2',
master_port=3306,
master_user='slave',
master_password='123456',
master_log_file='mysql-bin.000003',
master_log_pos=857;
# 开始同步
start slave;
# 查看同步状态
show slave status \G;
# 这两个是yes就说明同步成功了
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
|
开启读写分离后,主库负责数据的写操作,从库负责数据的读操作。