一文讲解MySQL的主从复制

MySQL主从模式是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点 。MySQL 默 认采用异步复制方式 , 这样从节点不用一直访问主服务器来更新自己的数据 , 从节点可以复制主数据库 中的所有数据库 , 或者特定的数据库 , 或者特定的表 。阿粉在前面的几篇文章中 , 说了索引的分析 , 索引的原理 , 以及慢查询应该怎么去做合理的优化 , 接下来阿粉也给大家说说这个 MySQL 的组从复制到底是个怎么回事 。
主从模式MySQL主从模式是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点 。MySQL 默 认采用异步复制方式 , 这样从节点不用一直访问主服务器来更新自己的数据 , 从节点可以复制主数据库 中的所有数据库 , 或者特定的数据库 , 或者特定的表 。

一文讲解MySQL的主从复制

文章插图
【一文讲解MySQL的主从复制】mysql主从复制用途:
  • 实时灾备 , 用于故障切换(高可用)
  • 读写分离 , 提供查询服务(读扩展)
  • 数据备份 , 避免影响业务(高可用)
主从部署必要条件:
  • 从库服务器能连通主库
  • 主库开启binlog日志(设置log-bin参数)
  • 主从server-id不
上面这些就是我们如果想要部署一套属于自己的 MySQL 的主从复制时 , 需要的条件 , 那么主从复制都是什么原理呢?
主从复制的步骤主从复制整体分为以下三个步骤:
第一步:主库将数据库的变更操作记录到Binlog日志文件中
第二步:从库读取主库中的Binlog日志文件信息写入到从库的Relay Log中继日志中
第三步:从库读取中继日志信息在从库中进行Replay,更新从库数据信息
上面的是文字描述 , 
我们再来一张原理图看看:
一文讲解MySQL的主从复制

文章插图
在上述三个过程中 , 涉及了Master的BinlogDump Thread和Slave的I/O Thread、SQL Thread , 它们的作用如下:
  • Master服务器对数据库更改操作记录在Binlog中 , BinlogDump Thread接到写入请求后 , 读取 Binlog信息推送给Slave的I/O Thread 。
  • Slave的I/O Thread将读取到的Binlog信息写入到本地Relay Log中 。
  • Slave的SQL Thread检测到Relay Log的变更请求 , 解析relay log中内容在从库上执行 。上述过程都是异步操作 , 俗称异步复制 , 存在数据延迟现象 。
但是如果我们这么看主从复制的话 , 是不是会发现一些问题呢?
MySQL主从复制的问题:
  • 主库宕机后 , 数据可能丢失
  • 从库只有一个SQL Thread , 主库写压力大 , 复制很可能延时
一般的 , 如果我们做了主从复制的话 , 那么数据库一定出现过复制延迟的情况 , 如果你没遇到过 , 说明你没有发现过 , 但是实际上是肯定有过的 , 除非你已经想到了如何去解决这个问题了 , 那么解决这个问题的方式是什么呢?
  • 半同步复制---解决数据丢失的问题
  • 并行复制----解决从库复制延迟的问题
那么什么是半同步复制 , 什么是并行复制呢?
半同步复制为了提升数据安全 , MySQL让Master在某一个时间点等待Slave节点的 ACK(Acknowledge character)消息 , 接收到ACK消息后才进行事务提交 , 这也是半同步复制的基础 。