docker mysql8 主从配置

微笑、不失礼 提交于 2020-05-07 13:23:21

本次pull的mysql是8的版本 使用该mysql搭建主从复制 

 

随着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/mysql
cp -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 , 说明搭建成功.

可以测试一下主库建库建表, 从库一会就也会出现相同的库表以及数据

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!