一、概述

1、原理

  • master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
  • slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
  • 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
  • 主从流程图

2、实现

  • 主库:192.168.3.13:3310
  • 从库:192.168.3.14:3310

二、创建master主库

  • 进入服务器192.168.3.13

1、安装镜像

  1. docker pull mysql:8.0.26

2、新建目录

  1. mkdir -p /home/apps/mysql-master/{config,log,data}

3、创建并启动

  1. docker run -d --name mysql-master \
  2. --restart=always \
  3. --privileged=true \
  4. -p 3310:3306 \
  5. -v /home/apps/mysql-master/config:/etc/mysql/conf.d \
  6. -v /home/apps/mysql-master/log:/var/log/mysql \
  7. -v /home/apps/mysql-master/data:/var/lib/mysql \
  8. -e MYSQL_ROOT_PASSWORD=123456 \
  9. mysql:8.0.26

4、新增/修改master基本配置

  1. vim /home/apps/mysql-master/config/my.cnf

添加以下内容

  1. [client]
  2. default-character-set=utf8
  3. [mysql]
  4. default-character-set=utf8
  5. [mysqld]
  6. init_connect='SET collation_connection = utf8_unicode_ci'
  7. init_connect='SET NAMES utf8'
  8. character-set-server=utf8
  9. collation-server=utf8_unicode_ci
  10. skip-character-set-client-handshake
  11. skip-name-resolve

三、创建Slave实例

  • 进入服务器192.168.3.14

1、同上面操作一样

  1. # 创建目录
  2. mkdir -p /home/apps/mysql-slave-01/{config,log,data}
  3. # 启动容器
  4. docker run -d --name mysql-slave-01 \
  5. --restart=always \
  6. --privileged=true \
  7. -p 3310:3306 \
  8. -v /home/apps/mysql-slave-01/config:/etc/mysql/conf.d \
  9. -v /home/apps/mysql-slave-01/log:/var/log/mysql \
  10. -v /home/apps/mysql-slave-01/data:/var/lib/mysql \
  11. -e MYSQL_ROOT_PASSWORD=123456 \
  12. mysql:8.0.26
  13. # 修改Slave基本配置
  14. vim /home/apps/mysql-slave-01/config/my.cnf
  15. # 添加以下内容
  16. [client]
  17. default-character-set=utf8
  18. [mysql]
  19. default-character-set=utf8
  20. [mysqld]
  21. init_connect='SET collation_connection = utf8_unicode_ci'
  22. init_connect='SET NAMES utf8'
  23. character-set-server=utf8
  24. collation-server=utf8_unicode_ci
  25. skip-character-set-client-handshake
  26. skip-name-resolve

四、主从配置

1、添加master配置

  1. vim /home/apps/mysql-master/config/my.cnf
  2. server_id=1
  3. # 开启二进制日志
  4. log-bin=mysql-bin
  5. read-only=0
  6. # 需要同步的数据库
  7. binlog-do-db=rapid-cloud
  8. binlog-do-db=rapid-cloud-test
  9. # 需要忽略的数据库
  10. replicate-ignore-db=mysql
  11. replicate-ignore-db=sys
  12. replicate-ignore-db=information_schema
  13. replicate-ignore-db=performance_schema

2、重启容器

  1. docker restart mysql-master

3、添加Slave配置

  1. vim /home/apps/mysql-slave-01/config/my.cnf
  2. server_id=2
  3. log-bin=mysql-bin
  4. read-only=1
  5. binlog-do-db=rapid-cloud
  6. binlog-do-db=rapid-cloud-test
  7. replicate-ignore-db=mysql
  8. replicate-ignore-db=sys
  9. replicate-ignore-db=information_schema
  10. replicate-ignore-db=performance_schema

4、重启容器

  1. docker restart mysql-slave-01

5、master添加帐号,用来同步的用户

  1. # 进入容器
  2. docker exec -it mysql-master /bin/bash
  3. # 进入主库mysql数据库
  4. mysql -u root -p
  5. # 授权root可以远程访问( 主从无关,为了方便我们远程连接mysql)
  6. # 授权远程
  7. ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  8. # 刷新
  9. flush privileges;
  10. # 创建backup用户
  11. # 应先创建新用户
  12. create user 'backup'@'%' identified by '123456';
  13. # 执行授权
  14. grant all privileges on *.* to 'backup'@'%';
  15. # 刷新
  16. flush privileges;
  17. # 授权远程
  18. ALTER USER 'backup'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  19. # 刷新
  20. flush privileges;
  21. # 查看主库状态
  22. show master status;

6、在从库里设置主库连接

  1. # 进入容器
  2. docker exec -it mysql-slave-01 /bin/bash
  3. # 进入主库mysql数据库
  4. mysql -u root -p
  5. change master to master_host='192.168.3.13',master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3310;

11、启动从库同步

  • 先将主库的数据复制一份到从库,包含表结构及数据
  • 将主库binlog清除一下,这样它的位置就从0开始了
  1. purge master logs to'mysql-bin.000001';
  • 开启同步
  1. # 开始同步
  2. start slave;
  3. # 停止同步
  4. # stop slave;
  5. # 查看同步状态
  6. show slave status\G;

12、错误排查

  • 如果无法实现主从同步,可以通过以下排查

13、总结:

  • 主从数据库在自己配置文件中声明需要同步哪个数据库,忽略哪个数据库等信息。并且server-id不能一样
  • 主库授权某个账号密码来同步自己的数据
  • 从库使用这个账号密码连接主库来同步数据

五、参考

docker实现mysql主从复制的更多相关文章

  1. 基于Docker的Mysql主从复制

    基于Docker的Mysql主从复制搭建 为什么基于Docker搭建? 资源有限 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐 一台机器上可以运行多个Docker容器 Docker容器之间相 ...

  2. Docker搭建MySQL主从复制

    Docker搭建MySQL主从复制 主从服务器上分别安装Docker 1.1 Docker 要求 CentOS 系统的内核版本高于 3.10 [root@localhost ~]# uname -r ...

  3. MySQL(14)---Docker搭建MySQL主从复制(一主一从)

    Docker搭建MySQL主从复制(一主一从) 上一篇博客写了MYSQL主从复制原理 : MySQL(13)---MYSQL主从复制原理 这篇我们来写 Docker搭建MYSQL主从复制(一主一从) ...

  4. 基于Docker的Mysql主从复制搭建

    来源:https://www.cnblogs.com/songwenjie/p/9371422.html?tdsourcetag=s_pctim_aiomsg   为什么基于Docker搭建? 资源有 ...

  5. 基于Docker搭建MySQL主从复制

    摘要: 本篇博文相对简单,因为是初次使用Docker,MySQL的主从复制之前也在Centos环境下搭建过,但是也忘的也差不多了,因此本次尝试在Docker中搭建. 本篇博文相对简单,因为是初次使用D ...

  6. Docker搭建 MySQL 主从复制

    为什么选 Docker 搭建主从复制需要两个以上的MySQL, 使用 Docker 非常方便.如果以前没用过,找个简单的文档看看,熟悉一下命令. 搭建过程 1.下载镜像 docker pull mys ...

  7. 基于 Docker 搭建 MySQL 主从复制

    本篇博文相对简单,因为是初次使用Docker,MySQL的主从复制之前也在Centos环境下搭建过,但是也忘的也差不多了,因此本次尝试在Docker中搭建. 根据网上教程走还是踩了一些坑,不过所幸最终 ...

  8. docker之MySQL主从复制

    MySQL主从复制 主服务器 配置文件目录 mkdir /var/lib/mysql/master/conf.d 数据存储目录 mkdir var/lib/mysql/master/data 配置my ...

  9. 使用docker部署mysql主从复制集群

    一.环境搭建 虚拟机环境:centos7 IP: 启动3个容器,一个是master,端口是3307,另外两个是slaver,端口是3308和3309 docker pull mysql:5.7 doc ...

  10. Docker进行MySQL主从复制操作

    Docker的相关操作 与 Docker下MySQL容器的安装 https://www.cnblogs.com/yumq/p/14253360.html 本次实验我是在单机状态下进行mysql的主从复 ...

随机推荐

  1. vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)

    前言: 此事例是在vue组件中,使用canvas实现倒计时动画的效果.其实,实现效果的逻辑跟vue没有关系,只要读懂canvas如何实现效果的这部分逻辑就可以了 canvas动画的原理:利用定时器,给 ...

  2. 八大排序算法~冒泡排序【加变量flag的作用】

    八大算法~冒泡排序[加变量flag的作用] 1,冒泡排序思想:从第一个数开始找,要把大数"排除在外"~为大数找后座.(从小到大排序哈) 外层循环~需要放后的大数个数: 内循环~从第 ...

  3. Thinkphp大批量插入数据库的处理方法和速度对比

    最近在使用TP框架写一个读取excel数据并将其插入到mysql数据库中的小功能.当excel中的数据条数非常多(几千甚至上万),并且多很多个列,并且某些列的内容还非常多的时候就容易出现问题. 第一种 ...

  4. Linux下系统防火墙的发展历程和怎样学好防火墙(iptalbes和firewalld)

    有关firewalld和iptables详细使用的文章 iptables详解 firewalld详解 =====================================华丽的分割线====== ...

  5. 基于Gin+Gorm框架搭建MVC模式的Go语言后端系统

    文/朱季谦 环境准备:安装Gin与Gorm 本文搭建准备环境:Gin+Gorm+MySql. Gin是Go语言的一套WEB框架,在学习一种陌生语言的陌生框架,最好的方式,就是用我们熟悉的思维去学.作为 ...

  6. 02_Java基础类型和包装类型

    基本数据类型 包装类名称 所占字节数 默认值 byte Byte 1 0 short Short 2 0 Int Integer 4 0 long Long 8 0L double Double 8 ...

  7. linux ifconfig不可用

    Q: A: 源出问题,修改源:进入源:源地址 /etc/apt/ sudo vi sources.list,将下列内容替换sources.list中的内容,并保存 deb http://mirrors ...

  8. Vue slot 插槽用法:自定义列表组件

    Vue 框架的插槽(slot)功能相对于常用的 v-for, v-if 等指令使用频率少得多,但在实现可复用的自定义组件时十分有用.例如,如果经常使用前端组件库的话,就会经常看到类似的用法: < ...

  9. 得到、微信、美团、爱奇艺APP组件化架构实践

    一.背景 随着项目逐渐扩展,业务功能越来越多,代码量越来越多,开发人员数量也越来越多.此过程中,你是否有过以下烦恼? 项目模块多且复杂,编译一次要5分钟甚至10分钟?太慢不能忍? 改了一行代码 或只调 ...

  10. 化学专业大二转战Android开发,终于拥有了鹅厂暑期实习offer

    我是双非学校,应用化学专业,一年前我大二,现在我大三.一年前我两手空空,现在我拥有了鹅厂暑期实习的offer. 虽然结果是好的,但我春招实习的道路远没有这么简单和辉煌,它是无比坎坷的:每个人应该量力而 ...