本文主要介绍双主机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
,可选row
,mixed
,statement
,这里选择使用mixed
。log-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;
此处的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_user
和master_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;
在从数据库中开启主从同步
start slave;
再次查看从数据库状态发现已经同步
主从复制测试
主机新建库-使用库-新建表-插入数据,ok
从机使用库-查看记录,ok