面试中的MySQL主从复制|手撕MySQL|对线面试官
关注微信公众号【程序员白泽】,进入白泽的知识分享星球
前言
作为《手撕MySQL》系列的第三篇文章,今天讲解使用bin log实现主从复制的功能。主从复制也是MySQL集群实现高可用、数据库读写分离的基石。因为是系列文章,上一篇文章中(传送门)我们已经介绍了在MySQL中查看bin log的相关状态以及文件信息,并且借助bin log(二进制日志)实现数据恢复的案例。因此在这篇文章中如有涉及相关知识,将不再赘述。
重申一下,数据恢复和主从复制是bin log最重要的两个功能,也是面试的重点,一定要有所了解~
主从复制架构
一主一从/一主多从/级联

这里给出了基础的两种主从复制的架构图,左侧由一个主库向三个从库同步对数据库的变更操作(上一篇文章中我们提到过bin log只会记录变更数据库的操作)。而右侧则在这个基础之上,将同步到数据的从库继续作为后一个从库的“主库”同步数据库变更操作,但是这些操主从复制模式的基本原理都是一样的。为了便于学习,本文后面讲解的demo将基于一主一从的最简单模式。
主从复制原理

MySQL主从复制会有三个线程参与:
master端的log dump线程:
当从结点连接到主结点之后,主节点会为每一个来自从结点的连接创建一个log dump线程与之通信,log dump线程负责读取master端的bin log数据文件(多个log dump线程之间会互斥访问bin log文件——加锁),将其发送给对应slave端的接收线程。
slave端的I/O线程和SQL执行线程:
slave端的两个线程中,I/O线程是负责连接主节点,并不断请求master端的新记录的bin log变更日志。I/O线程接收到log dump线程发送过来的bin log变更之后,将其保存在slave端本地的relay log文件中(异步缓冲),然后会由SQL线程读取relay log文件中的内容,并且转换成SQL用于在slave端执行,达到同步主库变更的效果(在讲bin log数据恢复的时候,我们明白了数据恢复的本质就是再次执行一遍原先的SQL语句,而bin log中会记录数据库变更操作/行数据)
主从复制演示
下面我会用自己本地的MySQL数据库作为从库,而自己云服务器的MySQL作为主节点,通过主从复制,同步云数据库中的数据。并且在开始下面两个步骤之前要确保主库和从库的server-id不同。
- 从库server-id设置为2,这个值可以通过修改mysql配置文件并重启的方式设置,也可以通过set global参数值的形式设置,具体可以Google~

- 主库server-id设置为1

配置master节点
我的云数据库是通过Docker镜像部署的,如果你还不太清楚容器化技术,这里也可以阅读我写过的一篇Docker入门文章(传送门),下面会涉及一些docker操作命令,但如果只是为了了解主从复制的流程,继续看下去也没有任何问题 。
先通过docker ps查看正在运行的docker容器,找到MySQL容器对应的ID

通过容器ID,进入MySQL的docker镜像(这里-it后面是你MySQL容器的)

然后在MySQL容器内部登录MySQL

首先确保master节点的bin log已经开启

接下来在master节点上创建test_copy用户,设置密码为123456,并设置REPLICATION SLAVE权限(这个账号是给slave节点请求master节点用的)

查看当前master节点的bin log数据文件的pos点(position点是位置的意思,可以简单理解成每执行一个数据库事务,就会从当前position开始执行,直到下一个position结束,下一次另一个事务就从前一个事务的结束position为起点开始记录,因此两个position之间就存储着一个事务的执行步骤,而数据恢复也好,主从复制也好,核心原理就是拿到两个pos点之间的数据文件转意成SQL事务,再执行一遍SQL事务)

为了方便就直接用数据库管理工具建立一张copy表,设立id和username两个字段,插入3条数据,我们再来看一下现在bin log数据文件的pos点果然向后推了,表示对数据库的变更被记录到了bin log数据文件中。

至此master节点的配置完成,创建好了给slave节点的用户,并且也准备了用于同步的数据。

配置slave节点
现在我们用本地的MySQL数据库作为从结点,执行下面的命令,通过上面我们在主结点注册好的test_copy用户去获取主节点bin log中的变更数据。其中master_host是你的云数据库对应的服务器的IP地址:xx.xx.xx.xx。

执行start slave命令,从结点开始同步主节点变更数据。

最后在本地数据库(从数据库上查询得到copy数据库被成功同步下来!大功告成,如果遇到了问题,我再手撕MySQL系列第一篇文章就教大家在遇到MySQL启动相关问题时可以通过查询错误日志去看warning和error,找到原因),当然这只是一主一从进行数据同步的最简单的一个demo,还有通过全局事务ID代替pos点进行数据同步的方式,需要额外学习,本文就不多赘述。

结束语
本文讲解了使用bin log进行主从复制的基本原理,结合上一篇文章的数据恢复,二进制日志的两大功能已经全部讲解完成,相信在面试中如果遇到相关的知识点可以对答如流。
我是白泽,一名热衷于知识分享的程序员/学生党,关注微信公众号【程序员白泽】,我会同步我的博客文章,回复简历,也可以获得我正在使用的简历模板,建立了一个春秋招备战/内推/闲聊群,欢迎交流。

面试中的MySQL主从复制|手撕MySQL|对线面试官的更多相关文章
- MySQL通过bin log日志恢复数据|手撕MySQL|对线面试官
关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第二篇文章,今天介绍一下MySQL的二进制日志(bin log),注意不要和MySQL的InnoDB ...
- 浅谈MySQL日志文件|手撕MySQL|对线面试官
关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 上周五面试了字节的第三面,深感数据库知识的重要,我也意识到在平时的学习中,自己对于数据库的学习较为薄弱.甚至在有过一定实习经验之后,依旧因为 ...
- 【转载】Mysql主从复制、和MySQL集群(主主复制)
转载:https://www.cnblogs.com/phpstudy2015-6/p/6485819.html 请同时参考和结合这篇文件进行处理:https://blog.csdn.net/envo ...
- mysql之 MySQL 主从复制概述
1 .主从复制简介MySQL 主从复制就是将一个 MySQL 实例(Master)中的数据实时复制到另一个 MySQL 实例(slave)中,而且这个复制是一个异步复制的过程.实现整个复制操作主要由三 ...
- mysql主从复制、redis基础、持久化和主从复制
一.mysql(mariadb)基础 1.基础命令(centos7操作系统下) 1.启动mysql systemctl start mariadb 2.linux客户端连接自己 mysql -uroo ...
- MySQL主从复制介绍
MySQL主从复制介绍 MySQL数据库的主从复制方案,和使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借助第三方工具,而且,M ...
- 在线建立或重做mysql主从复制架构方法(传统模式和GTID模式)【转】
mysql主从复制架构,是mysql数据库主要特色之一,绝大多数公司都有用到. 而GTID模式是基于事务的复制模式的意思,发展到现在也是越来越多人用. 以前很多文章,介绍搭建mysql主从复制架构,是 ...
- Linux(5)- MariaDB、mysql主从复制、初识redis
一.MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL ...
- Dubbo入门到精通学习笔记(十九):MySQL源码编译安装、MySQL主从复制的配置
文章目录 MySQL 源码编译安装(CentOS-6.6+MySQL-5.6) 一.服务器配置: 二.源码安装 MySQL5.6.26: MySQL主从复制的配置 环境 依赖课程 MySQL 主从复制 ...
随机推荐
- java ++ -- 异或 短路与 短路或 三目条件
public class Demo { public static void main(String[] args) { int i1 = 12, i2 = 20; int i = (i2++); S ...
- 为什么 Redis 的查询很快, Redis 如何保证查询的高效
Redis 如何保证高效的查询效率 为什么 Redis 比较快 Redis 中的数据结构 1.简单动态字符串 SDS 对比 c 字符串的优势 SDS可以常数级别获取字符串的长度 杜绝缓冲区溢出 减少修 ...
- Vue+webpack配置实现多页面应用开发
为什么要配置多页面开发? · 由于单页面应用不利于SEO,对于某些资讯类网站不够友好,而多页面则能够更优的解决此问题. · 传统的多页面开发模式(如java的jsp等) 前后端耦合性大,开发效率低,代 ...
- HOW2J 全套教程整理:Java、前端、数据库、中间件、第三方、项目、面试题
考虑到部分同学寝室会断网,原站的所有的免费内容都提供了一个离线版本以供使用.但是它直接提供了静态页面,并不方便在手机上阅读,因为我将其转换为 EPUB. 目录 HOW2J J2EE 教程.epub H ...
- 社交网络分析的 R 基础:(三)向量、矩阵与列表
在第二章介绍了 R 语言中的基本数据类型,本章会将其组装起来,构成特殊的数据结构,即向量.矩阵与列表.这些数据结构在社交网络分析中极其重要,本质上对图的分析,就是对邻接矩阵的分析,而矩阵又是由若干个向 ...
- 通过json动态创建控制器
通过字符串来创建控制器 如果通过字符串来创建控制器 不可以直接通过类型来获取对应的类 因为Swift有命名空间,类前需要加上命名空间的名称 获取命名空间的名称 let executable = NSB ...
- WordPress子模板继承
很多时候我们不想重写模板,而是想在某个模板的基础上进行修改,那么这个时候我们就需要用到模板继承技巧. 子主题开发 style.css 是必须的文件,只需要新增 Template: 父模板的文件夹名
- Cadence物理库 LEF 文件语法学习【持续更新】
我是 雪天鱼,一名FPGA爱好者,研究方向是FPGA架构探索. 关注公众号,拉你进"IC设计交流群". @ 目录 一.LEF简介 1.1 通用规则 1.2 管理 LEF 文件 二. ...
- Node.js躬行记(15)——活动规则引擎
在日常的业务开发中,会包含许多的业务规则,一般就是用if-else硬编码的方式实现,这样就会增加逻辑的维护成本,若无注释,可能都无法理解规则意图. 因为一旦规则有所改变,那么就需要修改代码再发布代码, ...
- 取代 Mybatis Generator,这款代码生成神器配置更简单,开发效率更高!
作为一名 Java 后端开发,日常工作中免不了要生成数据库表对应的持久化对象 PO,操作数据库的接口 DAO,以及 CRUD 的 XML,也就是 mapper. Mybatis Generator 是 ...