MySQL主从复制原理探索

上一篇文章里面,讲到了遇到mysql主从延迟的坑,对于此次的坑多说两句,之前也看过这样的例子,也知道不可以写完以后立刻更新,可是真正开发的时候仍是没有注意到这一点,道理你们都懂,可是仍是会犯错,只有等到本身亲身体验到该错误以后,才真正的掌握到该道理。html

经历过一次mysql主从延迟以后,就开始思考,主从复制是什么东西?它是怎么实现的呢?它的原理是什么?因而乎就开始查阅资料、文章,现将本身理解到的内容总结在此,加深印象。mysql

为何要作主从复制?

一、在业务复杂的系统中,有这么一个情景,有一句sql语句须要锁表,致使暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即便主库出现了锁表的情景,经过读从库也能够保证业务的正常运做。sql

二、作数据的热备数据库

三、架构的扩展。业务量愈来愈大,I/O访问频率太高,单机没法知足,此时作多库的存储,下降磁盘I/O访问的频率,提升单个机器的I/O性能。segmentfault

mysql主从复制的原理是什么?

binlog: binary log,主库中保存更新事件日志的二进制文件。安全

主从复制的基础是主库记录数据库的全部变动记录到binlog。binlog是数据库中保存配置中过时时间内全部修改数据库结构或内容的一个文件。若是过时时间是10d的话,那么就是最近10d的数据库修改记录。架构

mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。异步

在主库里,只要有更新事件出现,就会被依次地写入到binlog里面,是以后从库链接到主库时,从主库拉取过来进行复制操做的数据源。性能

binlog输出线程。每当有从库链接到主库的时候,主库都会建立一个线程而后发送binlog内容到从库。
对于每个即将发送给从库的sql事件,binlog输出线程会将其锁住。一旦该事件被线程读取完以后,该锁会被释放,即便在该事件彻底发送到从库的时候,该锁也会被释放。学习

在从库里,当复制开始的时候,从库就会建立两个线程进行处理:

从库I/O线程。当START SLAVE语句在从库开始执行以后,从库建立一个I/O线程,该线程链接到主库并请求主库发送binlog里面的更新记录到从库上。
从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。

从库的SQL线程。从库建立一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。

能够知道,对于每个主从复制的链接,都有三个线程。拥有多个从库的主库为每个链接到主库的从库建立一个binlog输出线程,每个从库都有它本身的I/O线程和SQL线程。

从库经过建立两个独立的线程,使得在进行复制时,从库的读和写进行了分离。所以,即便负责执行的线程运行较慢,负责读取更新语句的线程并不会所以变得缓慢。好比说,若是从库有一段时间没运行了,当它在此启动的时候,尽管它的SQL线程执行比较慢,它的I/O线程能够快速地从主库里读取全部的binlog内容。这样一来,即便从库在SQL线程执行完全部读取到的语句前中止运行了,I/O线程也至少彻底读取了全部的内容,并将其安全地备份在从库本地的relay log,随时准备在从库下一次启动的时候执行语句。

查看主从复制的状态

当主从复制正在进行中时,若是想查看从库两个线程运行状态,能够经过执行在从库里执行”show slave statusG”语句,如下的字段能够给你想要的信息:

Master_Log_File — 上一个从主库拷贝过来的binlog文件
Read_Master_Log_Pos — 主库的binlog文件被拷贝到从库的relay log中的位置
Relay_Master_Log_File — SQL线程当前处理中的relay log文件
Exec_Master_Log_Pos — 当前binlog文件正在被执行的语句的位置

整个主从复制的流程能够经过如下图示理解:

DB Replication

  • 步骤一:主库db的更新事件(update、insert、delete)被写到binlog
  • 步骤二:从库发起链接,链接到主库
  • 步骤三:此时主库建立一个binlog dump thread,把binlog的内容发送到从库
  • 步骤四:从库启动以后,建立一个I/O线程,读取主库传过来的binlog内容并写入到relay log
  • 步骤五:还会建立一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db
注:上面的解释是解释每一步作了什么,整个mysql主从复制是异步的,不是按照上面的步骤执行的。

其余

关于主从复制架构的搭建,能够参考网上更多的文档,文笔有限,不作更多的介绍。

做为一名开发,这些基础的mysql知识仍是须要多多学习。

参考资料

What is MySQL Replication and How Does It Work?

Replication Implementation Details

原创文章,文笔有限,才疏学浅,文中如有不正之处,万望告知。

若是本文对你有帮助,请点下推荐吧,谢谢^_^

更多精彩内容,请关注我的公众号。