dockermysql8主从配置
随着mysql镜像的升级, 以前的docker run命令中的挂载目录会无效, 做个记录
主从的文件目录是一样的, 所以conf配置 我们需要两份 下面操作都一样
master --data
--conf
--logs
slave
--data
--conf
--logs
第一步 临时启动mysql 退出容器 不产生容器信息
docker run --rm --name mysqltemp -it -v /usr/local/docker/mysql/slave/conf/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql /bin/bash
将本地想要放配置文件的目录 挂载在容器的/var/lib/mysql 目的是想复制配置文件下来
因为尝试了自己编写 和 手动复制的方法 都无法启动容器, 也不知道哪里的毛病, 竟给自己挖坑
第二步 复制my.cnf 和 依赖配置文件
cp /etc/mysql/my.cnf /var/lib/mysqlcp -R /etc/mysql/conf.d/ /var/lib/mysql/conf.d
好像是在8.0版本以前的mysql 一个my.cnf就可以了, 后来需要依赖配置文件的支持, 不然容器的挂载配置文件(my.cnf)是无效的
主从时会报server-id不能相同的问题等等
执行完命令 即可exit 退出临时容器 查看/usr/local/docker/mysql/slave/conf/ 目录下 就有刚cp下来的文件和目录
第三步
从容器cp下来的配置文件可能会有几个不等, 我们只需要修改my.cnf文件即可
[root@iZbp18caz0f7upvfdk2vzeZ conf]# cat my.cnf# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# The MySQL Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# 编辑添加server-id 和 log-bin
server-id=100
log-bin=mysql-bin
# Custom config should go here
!includedir /etc/mysql/conf.d/
[root@iZbp18caz0f7upvfdk2vzeZ conf]#
编辑添加server-id 和 log-bin
server-id确保唯一, 和主从不冲突就ok, 复制的时候记得修改该值
log-bin的mysql-bin 可以自己定义, 这里根据其主从复制原来名取了mysql-bin
简述 mysql的复制原理
- mysql主库在事务提交时会把数据库变更作为事件Events记录在二进制文件binlog中; mysql主库上的sys_binlog控制binlog日志刷新到磁盘
- 主库推送二进制文件binlog到从库的中继日志relay log, 之后从库根据中继日志重做数据库变更操作; 通过逻辑复制, 以此来达到数据一致
Mysql通过3个线程来完成主从库之间的数据复制: 其中BinLog Dump线程跑在主库上, I/O线程和SQL线程跑在从库上 ,当从库启动复制(start slave)时, 首先创建I/O线程连接主库, 主库随后创建Binlog Dump线程读取数据库事件并发给I/O线程, I/O线程获取到数据库事件更新到从库的中继日志Realy log中去, 之后从库上的SQl线程读取中继日志Realy log 中更新的数据库事件并应用
第四步 启动主从容器
-- 主库docker run --name master -p 3336:3306
-v /usr/local/docker/mysql/master/data:/var/lib/mysql
-v /usr/local/docker/mysql/master/conf/my.cnf:/etc/mysql/my.cnf
-v /usr/local/docker/mysql/master/conf/conf.d:/etc/mysql/conf.d
-v /usr/local/docker/mysql/master/logs:/var/log/mysql
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
-- 从库
docker run --name slave -p 3337:3306
-v /usr/local/docker/mysqlzc/slave/data:/var/lib/mysql
-v /usr/local/docker/mysql/slave/conf/my.cnf:/etc/mysql/my.cnf
-v /usr/local/docker/mysql/slave/conf/conf.d:/etc/mysql/conf.d
-v /usr/local/docker/mysql/slave/logs:/var/log/mysql
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
进入主库容器 docker exec -it master /bin/bash 扒拉扒拉... 添加用户 用于从库线程访问主从 复制
-- 创建用户 给权限CREATE USER "slaveuser"@"%" IDENTIFIED WITH mysql_native_password BY "slaveuser0!";
GRANT ALL PRIVILEGES ON *.* TO "slaveuser"@"%";
FLUSH PRIVILEGES;
-- 再执行此sql 查看主服务器bin日志的信息
show master status;
查看的bin信息 用于从库配置 可以先截个图记录一下
进入从库容器 执行命令
change master to master_host="172.17.0.2", -- 主库ip
master_user="slaveuser", -- 主库用户名
master_password="slaveuser0!", -- 主库密码
master_port=3306, -- 主库端口
master_log_file="mysql-bin.000060", -- 主库截图中的数值
master_log_pos= 248, -- 主库截图中的数值
master_connect_retry=30; -- 从服务器线程重新尝试连接主服务器之前睡眠的秒数,默认60
以上是一行命令 , 容器ip查看命令 docker inspect --format="{{.NetworkSettings.IPAddress}}" 容器名称|容器id
最后从库开启命令 start slave;
查看信息 show slave status G; 如果中间出了什么异常错误 都可以在此信息中查看
- slave-IO-running : yes
- slave-sql-running: yes
信息中出现两个参数yes , 说明搭建成功.
可以测试一下主库建库建表, 从库一会就也会出现相同的库表以及数据
以上是 dockermysql8主从配置 的全部内容, 来源链接: utcz.com/z/516223.html