基于Docker配置Mysql主从同步

前言

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


一、创建Mysql挂载目录

主库和从库目录如下

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

基于Docker配置Mysql主从同步_第1张图片


二、主从配置

分别在主从挂载目录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;

基于Docker配置Mysql主从同步_第2张图片

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时标识成功
基于Docker配置Mysql主从同步_第3张图片

四、测试

主库(3306端口)
从库(3307端口)
用工具连接主从服务
基于Docker配置Mysql主从同步_第4张图片
在主库创建一个test数据库,从库会同步更新操作
3307端口从库进行刷新操作,发现同步test数据库

基于Docker配置Mysql主从同步_第5张图片


结束

你可能感兴趣的:(docker,mysql)