Docker双主机Mysql主从复制环境搭建

109 阅读5分钟

本文主要介绍双主机Docker环境下mysql主从的安装与配置。

1、首先准备Docker环境,此次安装的是mysql8.0的版本。

docker pull mysql:8.0

2、在A服务器用docker run的方式启动主mysql镜像:

docker run -p 3306:3306 --name mysql-master \
--privileged=true \
-v /usr/local/soft/mysql-master/log:/var/log/mysql \
-v /usr/local/soft/mysql-master/data:/var/lib/mysql \
-v /usr/local/soft/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:8.0

3、在A服务器的/usr/local/soft/mysql-master/conf的目录下编写my.cnf文件,

cd /usr/local/soft/mysql-master/conf
vim my.cnf

将以下的文件内容拷贝进my.cnf文件中

[mysqld]
# 设 置 3306端 口
port=3306
# 服 务 端 使 用 的 字 符 集 默 认 为 utf8mb4
character-set-server=utf8mb4
# 服 务 端 使 用 的 排 序 规 则
collation-server=utf8mb4_general_ci
# 创 建 新 表 时 将 使 用 的 默 认 存 储 引 擎
default-storage-engine=INNODB
# 默 认 使 用 “mysql_native_password”插 件 认 证
# mysql 8.0 需 要 设 置 mysql_native_password
default_authentication_plugin=mysql_native_password
# 关 闭 only_full_group_by
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# mysql 时 区
default-time-zone = '+8:00'
# 最 大 连 接 数 量
max_connections=10000
# 不 再 进 行 反 解 析 ( ip不 反 解 成 域 名 ) , 这 样 可 以 加 快 数 据 库 的 反 应 时 间 。
skip-name-resolve
# binlog 日 志 存 放 路 径
log-bin=mysql-binlog
# 日 志 中 记 录 每 一 行 数 据 被 修 改 的 形 式
binlog-format=ROW
# 当 前 机 器 的 服 务 ID, 如 果 为 集 群 时 不 能 重 复 , 不 要 和 canal 的 slaveId 重 复
server_id=101
# 指 定 不 需 要 同 步 的 数 据 库 名 称
binlog-ignore-db=mysql  
# 设 置 二 进 制 日 志 使 用 内 存 大 小 ( 事 务 )
binlog_cache_size=1M  
# 二 进 制 日 志 过 期 清 理 时 间 。 默 认 值 为 0, 表 示 不 自 动 清 理 。
expire_logs_days=7
# 跳 过 主 从 复 制 中 遇 到 的 所 有 错 误 或 指 定 类 型 的 错 误 , 避 免 slave端 复 制 中 断 。
# 如 : 1062错 误 是 指 一 些 主 键 重 复 , 1032错 误 是 因 为 主 从 数 据 库 数 据 不 一 致
slave_skip_errors=1062
[mysql]
# 设 置 mysql客 户 端 默 认 字 符 集
default-character-set=utf8mb4
[client]
# 设 置 mysql客 户 端 连 接 服 务 端 时 默 认 使 用 的 端 口
port=3306

其中server_id与接下来从机的server_id不可相同,binlog-format 5.7.6前默认statement,5.7.7后默认row,可选rowmixedstatement,这里选择使用mixedlog-bin=mysql-binlog表示binlog的存放位置,赋予值以后表示开启binlog,binlog-ignore-db表示不需要进行同步的数据库名称,此处屏蔽了mysql默认的mysql表。

修改完配置后重启master实例:

docker restart mysql-master

进入mysql-master容器

docker exec -it mysql-master /bin/bash

mysql -uroot -proot

master容器实例内创建数据同步用户

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

4、B服务器同样创建从mysql镜像

docker run -p 3306:3306 --name mysql-salve \
--privileged=true \
-v /usr/local/soft/mysql-salve/log:/var/log/mysql \
-v /usr/local/soft/mysql-salve/data:/var/lib/mysql \
-v /usr/local/soft/mysql-salve/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:8.0

在B服务器的/usr/local/soft/mysql-salve/conf的目录下编写my.cnf文件,

cd /usr/local/soft/mysql-salve/conf
vim my.cnf

将以下的文件内容拷贝进my.cnf文件中

[mysqld]
# 设 置 3306端 口
port=3306
# 服 务 端 使 用 的 字 符 集 默 认 为 utf8mb4
character-set-server=utf8mb4
# 服 务 端 使 用 的 排 序 规 则
collation-server=utf8mb4_general_ci
# 创 建 新 表 时 将 使 用 的 默 认 存 储 引 擎
default-storage-engine=INNODB
# 默 认 使 用 “mysql_native_password”插 件 认 证
# mysql 8.0 需 要 设 置 mysql_native_password
default_authentication_plugin=mysql_native_password
# 关 闭 only_full_group_by
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# mysql 时 区
default-time-zone = '+8:00'
# 最 大 连 接 数 量
max_connections=10000
# 不 再 进 行 反 解 析 ( ip不 反 解 成 域 名 ) , 这 样 可 以 加 快 数 据 库 的 反 应 时 间 。
skip-name-resolve
# binlog 日 志 存 放 路 径
log-bin=mysql-binlog
# 日 志 中 记 录 每 一 行 数 据 被 修 改 的 形 式
binlog-format=ROW
# 当 前 机 器 的 服 务 ID, 如 果 为 集 群 时 不 能 重 复 , 不 要 和 canal 的 slaveId 重 复
server_id=102
# 指 定 不 需 要 同 步 的 数 据 库 名 称
binlog-ignore-db=mysql
# 设 置 二 进 制 日 志 使 用 内 存 大 小 ( 事 务 )
binlog_cache_size=1M
# 二 进 制 日 志 过 期 清 理 时 间 。 默 认 值 为 0, 表 示 不 自 动 清 理 。
expire_logs_days=7
# 跳 过 主 从 复 制 中 遇 到 的 所 有 错 误 或 指 定 类 型 的 错 误 , 避 免 slave端 复 制 中 断 。
# 如 : 1062错 误 是 指 一 些 主 键 重 复 , 1032错 误 是 因 为 主 从 数 据 库 数 据 不 一 致
slave_skip_errors=1062
# relay_log配 置 中 继 日 志
relay_log=master-mysql-relay-bin
# log_slave_updates表 示 slave将 复 制 事 件 写 进 自 己 的 二 进 制 日 志
log_slave_updates=1
# slave设 置 为 只 读 ( 具 有 super权 限 的 用 户 除 外 )
read_only=1
[mysql]
# 设 置 mysql客 户 端 默 认 字 符 集
default-character-set=utf8mb4
[client]
# 设 置 mysql客 户 端 连 接 服 务 端 时 默 认 使 用 的 端 口
port=3306

注意此处

server_id=102  #要与主mysql不一样
# relay_log配 置 中 继 日 志
relay_log=master-mysql-relay-bin
# log_slave_updates表 示 slave将 复 制 事 件 写 进 自 己 的 二 进 制 日 志
log_slave_updates=1
# slave设 置 为 只 读 ( 具 有 super权 限 的 用 户 除 外 ),也可不设置
read_only=1

修改完配置后重启slave实例

docker restart mysql-slave

在主数据库中查看主从同步状态

show master status;

image.png

此处的File和Position接下里的配置里会用到。

进入mysql-slave容器

docker exec -it mysql-slave /bin/bash
mysql -uroot -proot

在从数据库中配置主从复制

change master to \
master_host='A服务器ip', \
master_user='slave',\ 
master_password='123456', \
master_port=3306, \
master_log_file='mysql-binlog.000008', \
master_log_pos=681, \
master_connect_retry=30;

此处master_usermaster_password为刚刚master容器实例内创建数据同步用户名和密码,master_log_file为上面截图中的File和Position。

参数详细介绍
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。\

5、在从数据库中查看主从同步状态

show slave status \G;

image.png

在从数据库中开启主从同步

start slave;

再次查看从数据库状态发现已经同步

image.png

主从复制测试
主机新建库-使用库-新建表-插入数据,ok
从机使用库-查看记录,ok