提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、简介
本文介绍的是在 docker 中部署 mysql 主从集群,实现读写分离。
数据文件和配置文件均进行外部映射
二、原理
- master 更新数据被写到 binlog
- slave 发起连接,连接到 master
- master 创建 binlog dump 线程,并把 binlog 发送到 slave
- slave 启动,创建 I/O 线程,用于读取 master 发送的 binlog,并写到 relay log内
- slave 创建 sql 线程,从 relay log 中读取,从 ExecMasterLog_Pos 位置开始执行读取到的事务,并写入 slave
三、搭建
2.1 master 配置
master 配置文件 master-cnf
[mysqld]
# 设置同一局域网内server-id必须具有唯一性
server-id=1
# 指定复制哪些数据库
binlog-do-db=test
# 指定不复制哪些数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 开启二进制日志功能, 并设置日志文件名, 文件名可随意起名
log-bin=mysql-bin
# 设置 binlog 日志格式, 其值可谓 row(默认)、statement、mixed
binlog_format=statement
# 设置每隔多少次事务提交操作才会将这些操作写入二进制日志文件
sync_binlog=1
# 默认使用 “mysql_native_password” 插件认证
default_authentication_plugin=mysql_native_password
2.2 slave 数据库配置
slave 配置文件 slave-cnf
[mysqld]
# 设置同一局域网内server-id必须具有唯一性
server-id=2
# 开启二进制日志功能, 并设置日志文件名, 文件名可随意起名
# log-bin=mysql-slave-bin
# 指定中继日志
relay-log=slave-relay-bin
# 默认使用 “mysql_native_password” 插件认证
default_authentication_plugin=mysql_native_password
2.3 创建master 和 slave 数据库
version: '3.7'
services:
master: # 主数据库
image: mysql:latest
container_name: mysql-master
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_TCP_PORT=3336
ports:
- "3336:3336"
networks:
- backend
volumes:
- ./mysql-master.cnf:/etc/mysql/my.cnf # 配置文件映射
- ./data/master:/var/lib/mysql # 数据文件映射
slave01: # 从数据库
image: mysql:latest
container_name: mysql-slave01
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_TCP_PORT=3337
ports:
- "3337:3337"
networks:
- backend
volumes:
- ./mysql-slave.cnf:/etc/mysql/my.cnf # 配置文件映射
- ./data/slave01:/var/lib/mysql # 数据文件映射
networks:
backend:
name: master_slave
-
启动 docker 镜像
# 切换到数据库配置文件目录根下 cmd 执行 docker compose up -d
-
master 中创建 slave 连接账号
# 可以使用 navicat 连接 master 数据库 执行 sql create user 'master'@'%' identified by '123456'; grant replication slave, replication client on *.* to 'master'@'%';
-
查看 master 主节点状态并记录状态
# 可以使用 navicat 连接 master 数据库 执行 sql show master status;
ps:下图 file 名称要与 .cnf 文件中配置的 log-bin 的名称一致
-
如果不一致查看 docker 内镜像启动日志,如果有以下,则代表我们映射的配置文件未生效
mysql: [Warning] World-writable config file ‘/etc/mysql/my.cnf‘ is ignored.
-
在 docker 容器内 执行
cd /etc/mysql # 切换到配置文件目录 ls -l # 查看配置文件的权限信息
-
将更改配置文件权限
chmod 644 my.cnf
-
删除 docker 容器的对外映射的 data 信息和镜像,重新部署
-
2.4 主从同步设置
同步操作都在子节点进行
-
关闭同步
stop slave;
-
设置同步信息
如果 master 和 slave 在不在同一个机器或者不在同一个docker容器内:change master to master_host="xxx.xxx.xxx.xxx", # master IP 地址 master_port=3336, # master 对外映射端口 master_user='master', master_password='123456', # master中为slave设置的用户名 master_log_file='mysql_bin.000003', # 对照上面master查询到的信息中 file master_log_pos=676, # 对照上面master查询到的信息中position master_connect_retry=30;
如果 master 和 slave 在同一个docker容器内:
change master to master_host="mysql-master", # 容器中 master 的容器名称 master_port=3336, # master 对外映射端口 master_user='master', # master中为slave设置的用户名 master_password='123456' master_log_file='mysql_bin.000003', # 对照上面master查询到的信息中 file master_log_pos=676, # 对照上面master查询到的信息中position master_connect_retry=30;
-
开启同步
start slave;
四、验证同步
-
master 数据库
根据 master 配置文件中,需要同步的数据库是 test,则创建 test数据库,再创建表 插入数据
-
slave 数据库
查看 test 数据库以及内部数据
-
结果
master 中创建的数据库和表以及数据,在 slave 中都能找到,则完成同步