基于Docker配置Mysql主从同步

前言

该方式只能在主库同步到从库,不支持从库同步到主库
所以的操作应该在主库进行,的操作在从库执行


一、创建Mysql挂载目录

主库和从库目录如下

  • conf:mysql配置文件目录
  • data:存储数据的目录

在这里插入图片描述


二、主从配置

分别在主从挂载目录conf创建my.cnf文件,启动容器时将配置文件挂载到容器中

1.主库配置

server-id:服务节点的唯一标识。需要给集群中的每个服务分配一个单独的ID。
log_bin:打开Binlog日志记录,并指定文件名。
log_bin-index:Binlog日志文件

[mysqld]
server-id=99
#开启binlog
log_bin=master-bin
log_bin-index=master-bin.index
skip-name-resolve
# 设置连接端口
port=3306
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password

2.从库配置

server-id:服务节点的唯一标识
relay-log:打开从服务的relay-log日志。
log-bin:打开从服务的bin-log日志记录。

[mysqld]
#主库和从库需要不一致
server-id=88
#打开MySQL中继日志
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
#打开从服务二进制日志
log-bin=mysql-bin
#使得更新的数据写进二进制日志中
log-slave-updates=1
# 设置3306端口
port=3306
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password

三、拉取Mysql镜像( mysql5.7版本 )

命令: docker pull mysql:5.7.43

启动主库

docker run  --privileged -p 3306:3306 --name mysql-master -v /home/mysql/master/conf:/etc/mysql/conf.d -v /home/mysql/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d docker.io/mysql:5.7.43

启动从库

docker run  --privileged -p 3307:3306 --name mysql-slave -v /home/mysql/slave/conf:/etc/mysql/conf.d -v /home/mysql/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d docker.io/mysql:5.7.43

获取容器IP

因为是通过Docker容器启动的,创建用户时需要指定从库ip

# 获取当前所有Docker容器的名称和IP地址
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

在这里插入图片描述

【主库配置】

1、进入主库容器并在主库上创建一个从库用来读取数据的账号

# 进入容器
docker exec -it mysql-master /bin/bash

2、创建用户

# 登录mysql
mysql -uroot -p
Enter password: 123456(此处输入密码是看不见的,回车即可)
# 创建用户并授予复制从库的权限
GRANT REPLICATION SLAVE ON *.* to 'mysql_user'@'172.17.0.4' identified by '123456';
# 刷新MySQL数据库的权限表,使最近的更改生效
flush privileges;

3、查看当前主服务器(master server)的复制状态信息
File 和 Position列的值在从库配置需要

show master status;

在这里插入图片描述

File:正在使用的二进制日志文件的名称。
Position:当前正在写入的二进制日志文件的位置。
Binlog_Do_DB:当前正在写入的二进制日志文件的位置。
Binlog_Ignore_DB:忽略复制的数据库列表,这些数据库的更改将不会被复制。

操作完成后退出主库容器。

【从库配置】

1、进入容器

docker exec -it mysql-slave /bin/bash

2、登录mysql

# 登录mysql
mysql -uroot -p
Enter password: 123456(此处输入密码是看不见的,回车即可)

3、配置从服务器连接到主服务器进行复制

CHANGE MASTER TO
MASTER_HOST='172.17.0.2',
MASTER_USER='mysql_user',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=604;

MASTER_HOST=‘172.17.0.2’:设置主服务器的IP地址为 ‘172.17.0.2’。从服务器将连接到该地址的主服务器。
MASTER_USER=‘mysql_user’: 指定用于连接主服务器的用户名为 ‘mysql_user’。从服务器将使用该用户名进行连接。
MASTER_PASSWORD=‘123456’:指定连接主服务器时使用的密码为 ‘123456’。从服务器将使用该密码进行连接验证。
MASTER_LOG_FILE=‘master-bin.000001’: 设置主服务器正在写入的二进制日志文件名为 ‘master-bin.000001’。从服务器将从该日志文件开始复制。
MASTER_LOG_FILE=‘master-bin.000001’:设置主服务器正在写入的二进制日志文件名为 ‘master-bin.000001’。从服务器将从该日志文件开始复制。

4、开启主从同步

# 开启主从同步
start slave;

出现异常:ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
则重置配置,然后再执行上方命令:

reset slave;

5、校验是否开启
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上两个状态为Yes时标识成功
在这里插入图片描述

四、测试

主库(3306端口)
从库(3307端口)
用工具连接主从服务
在这里插入图片描述
在主库创建一个test数据库,从库会同步更新操作
3307端口从库进行刷新操作,发现同步test数据库

在这里插入图片描述


结束

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1. 准备工作 - 安装Docker - 新建两个目录:`master`和`slave`,用于存放主从数据库的数据 2. 创建MySQL容器 - 创建主库容器 ``` docker run --name mysql-master -v /path/to/master:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 ``` - 创建从库容器 ``` docker run --name mysql-slave -v /path/to/slave:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 ``` 注意:`/path/to/master`和`/path/to/slave`是本地文件系统中的目录,用于存放主从数据库的数据。`123456`是MySQL的root密码,可以根据需要修改。 3. 配置主库 - 进入主库容器 ``` docker exec -it mysql-master /bin/bash ``` - 登录MySQL ``` mysql -uroot -p123456 ``` - 创建用于复制的用户 ``` CREATE USER 'replication'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%'; FLUSH PRIVILEGES; ``` - 查看主库状态 ``` SHOW MASTER STATUS; ``` 记录下File和Position的值,后面配置从库时需要用到。 4. 配置从库 - 进入从库容器 ``` docker exec -it mysql-slave /bin/bash ``` - 登录MySQL ``` mysql -uroot -p123456 ``` - 配置从库复制 ``` CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='replication', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE; ``` 注意:`mysql-master`是主库的容器名称,`replication`是上一步中创建的用于复制的用户,`mysql-bin.000001`和`154`分别是主库状态中的File和Position的值。 - 查看从库状态 ``` SHOW SLAVE STATUS\G ``` 如果Slave_IO_Running和Slave_SQL_Running都是`Yes`,则说明配置成功。 5. 测试主从同步 在主库中创建一个测试数据库和表,并插入一条数据: ``` CREATE DATABASE test; USE test; CREATE TABLE t (id INT, name VARCHAR(20)); INSERT INTO t VALUES (1, 'test'); ``` 在从库中查询该表: ``` USE test; SELECT * FROM t; ``` 可以看到从库中也有刚刚插入的数据,说明主从同步成功。 6. 总结 以上就是使用Docker搭建MySQL主从的步骤,需要注意的是,如果主库或从库的容器重启或者删除后再次创建,需要重新配置从库复制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值