数据库面试题:Mysql主从复制原理

Mysql主从复制原理

一. 主从复制概述

  • 简单来说就是数据库集群,包括主数据库和从数据库。用户更新数据只去主数据库更新,查询数据只去从数据库查询。即更新操作仅在主数据库上,之后从数据库一起更新,查询操作仅在从数据库上。这样保证了读写分离,不会出现因为在高并发的情况下造成的读写冲突。
  • MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。

二. 主从复制原理

相关知识:

  • binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。
  • binlog不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,但你可以通过查询通用日志来查看MySQL执行过的所有语句。

主从复制中涉及的文件

主库: binlog
从库:

  • relaylog 中继日志
  • master.info 主库信息文件
  • relaylog.info relaylog应用的信息

主从复制中涉及的三个线程

主库:

  • Binlog_Dump Thread :与从库交互,推送binlog

从库:

  • SLAVE_IO_THREAD: I/O线程,请求获取主库的binlog
  • SLAVE_SQL_THREAD:SQL线程

原理:

  • master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中
  • slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
  • i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
  • 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
  • SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

三. 主从复制的常见问题及解决方案

问题:

  • 主库宕机后,数据可能丢失
  • 从库只有一个sql Thread,主库写压力大,复制很可能延时

解决方法:

  • 半同步复制—解决数据丢失的问题
  • 并行复制----解决从库复制延迟的问题

3.1 半同步复制

  • 对于异步复制,主库将事务Binlog事件写入到Binlog文件中,此时主库只会通知一下Dump线程发送这些新的Binlog,然后主库就会继续处理提交操作,而此时不会保证这些Binlog传到任何一个从库节点上。
  • 对于全同步复制,当主库提交事务之后,所有的从库节点必须收到,APPLY并且提交这些事务,然后主库线程才能继续做后续操作。这里面有一个很明显的缺点就是,主库完成一个事务的时间被拉长,性能降低。
  • 对于半同步复制,是介于全同步复制和异步复制之间的一种,主库只需要等待至少一个从库节点收到并且Flush Binlog到Relay Log文件即可,主库不需要等待所有从库给主库反馈。同时,这里只是一个收到的反馈,而不是已经完全执行并且提交的反馈,这样就节省了很多时间。

3.2 并行复制

原理:从库多线程apply binlog

你可能感兴趣的:(数据库面试题)