MySQL是一款开源的关系型数据库管理系统,它利用结构化查询语言(SQL)来存储、检索和管理数据。本文主要介绍使用docker-compose部署MySQL主从复制集群。
一、为什么搭建MySQL主从复制?
1)实时灾备:主库挂了,从库可以立刻顶上,业务不掉线。
2)读写分离:80% 的业务都是"读"(查询)。让主库专门负责"写"(增删改),从库专门负责"读",性能直接起飞。
3)数据分析:从库执行耗时 10 分钟的大报表,完全不影响主库的线上业务。
二、docker-compose部署MySQL主从复制
2.1 环境准备
Docker:v20.10.24
docker-compose:v2.1.0
宿主机IP:192.168.10.131
2.2 创建目录
bash
mkdir -p /data/mysql/{mysql-master,mysql-slave}
mkdir -p /data/mysql/mysql-master/{conf,data,log}
mkdir -p /data/mysql/mysql-slave/{conf,data,log}
2.3 创建配置文件
mysql-master主库
bash
vim /data/mysql/mysql-master/conf/my.cnf
============================================================
[mysqld]
#保证主库和从库的server_id不同
server-id=1
#开启二进制日志
log-bin=master-bin
#设置二进制日志格式(mixed,statement,row)
binlog_format=row
#二进制日志文件过期时间
expire_logs_days=30
#跳过所有的错误,继续执行复制操作
slave-skip-errors=all
#确保binlog日志写入后与硬盘同步
sync_binlog=1
mysql-slave从库
bash
vim /data/mysql/mysql-slave/conf/my.cnf
============================================================
[mysqld]
#服务器唯一ID,必须和master主库不一致
server-id=2
#开启二进制日志
log-bin=slave-bin
#设置二进制日志格式(mixed,statement,row)
binlog_format=row
#二进制日志文件过期时间
expire_logs_days=30
#设置中继日志
relay_log=relay-log-bin
#表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
#从库设置为只读
read_only=1
2.4 编写 docker-compose.yml
bash
cd /data/mysql
vim docker-compose.yml
============================================================
version: '3'
services:
# 服务名, 主节点
mysql-master:
# 容器名
container_name: mysql-master
# mysql镜像
image: mysql:8.0.37
restart: always
# 暴露端口号,宿主机端口:容器内端口号
ports:
- 3306:3306
privileged: true
# 按照路径挂载目录:日志、配置文件、数据
volumes:
- $PWD/mysql-master/log:/var/log/mysql
- $PWD/mysql-master/conf/my.cnf:/etc/mysql/conf.d/my.cnf
- $PWD/mysql-master/data:/var/lib/mysql
# 环境变量:数据库root密码
environment:
MYSQL_ROOT_PASSWORD: "123456"
TZ: Asia/Shanghai
# 指定数据库默认字符集和排序规则
command: [
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_general_ci',
'--max_connections=3000',
'--lower_case_table_names=1'
]
# 使用的网卡
networks:
- myweb
# 从节点
mysql-slave:
container_name: mysql-slave
image: mysql:8.0.37
restart: always
ports:
- 3307:3306
privileged: true
volumes:
- $PWD/mysql-slave/log:/var/log/mysql
- $PWD/mysql-slave/conf/my.cnf:/etc/mysql/conf.d/my.cnf
- $PWD/mysql-slave/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: "123456"
TZ: Asia/Shanghai
command: [
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_general_ci',
'--max_connections=3000',
'--lower_case_table_names=1'
]
networks:
- myweb
# 配置网络
networks:
# 使用桥接模式
myweb:
driver: bridge
# 检查配置文件语法
docker-compose -f docker-compose.yml config
2.5 启动容器
bash
docker-compose up -d
2.6 查看容器状态
bash
docker-compose ps
============================================================
NAME COMMAND SERVICE STATUS PORTS
mysql-master "docker-entrypoint.s..." mysql-master running 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp
mysql-slave "docker-entrypoint.s..." mysql-slave running 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp
2.7 登录mysql-master
bash
docker exec -it mysql-master mysql -u root -p
Enter password: #输入123456
# 创建同步用户并授权
mysql> create user 'rep'@'%' identified with mysql_native_password by '123456';
mysql> grant replication slave on *.* to 'rep'@'%';
mysql> flush privileges;
# 查看二进制日志
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
|master-bin.000002 | 825 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
其中,File列是二进制日志文件,Position列显示位置偏移量,Binlog_Ignore_DB指定不同步的数据库
2.8 登录mysql-slave
bash
docker exec -it mysql-slave mysql -u root -p
Enter password: #输入123456
#连接master主库
mysql> change master to master_host='192.168.10.131',
master_port=3306,
master_user='rep',master_password='123456',
master_log_file='master-bin.000002',
master_log_pos=825;
2.9 mysql-slave启动同步
bash
#启动同步
mysql> start slave;
#查看同步状态
mysql> show slave status\G;
#结果中Slave_IO_Running和Slave_SQL_Running都为yes,则表示同步成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2.10 验证MySQL主从复制
bash
#mysql-master主库创建数据
mysql> create database school;
#mysql-slave从库查看数据
mysql> show databases;

从上图看出,mysql-slave从库已经查看到mysql-master主库创建的数据,证明MySQL主从复制已经成功。