Featured image of post 在Linux上使用Docker实现MySQL读写分离

在Linux上使用Docker实现MySQL读写分离

Docker单机部署MySQL并实现读写分离和主从同步

在Linux上使用Docker实现MySQL读写分离和主从复制

在使用读写分离之前,我们所有对数据库的操作都是针对一个数据库进行的,而在实际使用场景往往是读大于写。在应对高并发的时候,数据库的读性能就会成为瓶颈,如果在不上数据库集群的情况下,一般会采用读写分离和加入缓存来应对高并发。

使用Docker部署MySQL

我使用的系统是ArchLinux,需要先安装DockerDocker-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

开启读写分离后,主库负责数据的写操作,从库负责数据的读操作。

苟利国家生死以 岂因福祸避趋之
Built with Hugo
主题 StackJimmy 设计