提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、简介
本文介绍的是在 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=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_format=statement
sync_binlog=1
default_authentication_plugin=mysql_native_password
2.2 slave 数据库配置
slave 配置文件 slave-cnf
[mysqld]
server-id=2
relay-log=slave-relay-bin
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 镜像
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;
四、验证同步
|