Docker 中搭建 Mysql 主从复制

267 阅读3分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情

前言

Mysql在容器化配置主从模式,为什么要用主从模式 数据的热备,当主库出现死锁等问题时可以更好的容灾处理当然出现死锁也只是一个场景。当然从机太多数据同步问题也是需要考虑的所以 一主一从还是不错的选择。今天我们在docker 上安装配置一下

首先我们先去拉取镜像

我们这里使用mysql 5.7 的镜像

//拉取镜像
docker pull mysql:5.7

下面我们先创建一下 mster的容器 并将配置文件和数据卷 挂载到宿主机上方便我们后期修改配置文件同步容器

docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

执行完成后我们使用的docker ps -a 查看一下容器的状态 image.png 可以看到 容器正常启动 且端口映射没有问题,下面我们取去创建配置文件就是刚才挂载的目录 /mydata/mysql-master/conf

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8 
server_id=101 ##设置server_id 局域网中需要唯一
binlog-ignore-db=mysql ## 指定不需要同步的数据库名称(没有的可以不配置)
log-bin=mysql-bin ## 开启二进制日志功能
binlog_cache_size=1M ## 设置二进制日志格式使用内存大小(事务)
binlog_format=mixed ## 设置二进制日志格式(mixed,statement,row)
expire_logs_days=7 ## 设置日志清理时间 默认为 0表示不自动 清理
slave_skip_errors=1026 ##跳过 1062 主键重复的错误

然后我们重启 docker restart mysql-master 容器 ,然后查看运行状态为 up 说明启动成功

image.png 进入容器创建用户

//创建用户
create user 'slave'@'%' identified by '123456'
//授权
grant replication slave, replication client on *.* tO 'slave'@'%'

从服务容器 创建和主服务器步骤一样只需要修改一下配置文件 中设置为只读模式 read_only=1

image.png 进入从服务器容器配置主服务器地址

change master to master_host='192.168.199.10', master_user='slave', master_password='123456', 
master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
  • master_host:主数据库的IP地址;
  • master_port:主数据库的运行端口;
  • master_user:在主数据库创建的用于同步数据的用户账号;
  • master_password:在主数据库创建的用于同步数据的用户密码;
  • master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
  • master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
  • master_connect_retry:连接失败重试的时间间隔,单位为秒。

image.png 在从容器中 mysql 里使用 show slave status \G;查看同步状态 image.png 在从服务中开始 数据同步 start slave可以看到都已经 是yes了

image.png 如果start slave 执行完成 报错 是因为文件指定不对

 Got fatal error 1236 from master when reading data from binary log:
 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master;
 the first event 'mall-mysql-bin.000001' at 617,
 the last event read from './mall-mysql-bin.000001' at

去主服务其上 show master status 获取到 文件名称和 Position参数的值重新走一下 change master to master_log_file ='mall-mysql-bin.000002',master_log_pos=154; 这个命令 当然先执行 stop slave image.png

下面我们来测试 主从复制在主服务创建表和插入一条测试数据

image.png 来到测试服务容器中查看数据

image.png 可以看到没有问题从库实现了自动同步

实践是检验真理的唯一准则,感兴趣的可以去试试呀!明天见咯 😃😃😃😃