MySQL Replication (MySQL 主从复制) 是什么?mysql
为何要主从复制以及它的实现原理是什么?sql
MySQL 主从复制是指数据能够从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新本身的数据,数据的更新能够在远程链接上进行,从节点能够复制主数据库中的全部数据库或者特定的数据库,或者特定的表。数据库
在开发工做中,有时候会碰见某个sql 语句须要锁表,致使暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即便主库出现了锁表的情景,经过读从库也能够保证业务的正常运做。安全
随着系统中业务访问量的增大,若是是单机部署数据库,就会致使I/O访问频率太高。有了主从复制,增长多个数据存储节点,将负载分布在多个从节点上,下降单机磁盘I/O访问的频率,提升单个机器的I/O性能。服务器
一主一从和一主多从是最多见的主从架构,实施起来简单而且有效,不只能够实现HA,并且还能读写分离,进而提高集群的并发能力。多线程
多主一从能够将多个MySQL数据库备份到一台存储性能比较好的服务器上。架构
双主复制,也就是互作主从复制,每一个master既是master,又是另一台服务器的slave。这样任何一方所作的变动,都会经过复制应用到另一方的数据库中。并发
级联复制模式下,部分slave的数据同步不链接主节点,而是链接从节点。由于若是主节点有太多的从节点,就会损耗一部分性能用于replication,那么咱们可让3~5个从节点链接主节点,其它从节点做为二级或者三级与从节点链接,这样不只能够缓解主节点的压力,而且对数据一致性没有负面影响。异步
MySQL主从复制涉及到三个线程,一个运行在主节点(log dump thread),其他两个(I/O thread, SQL thread)运行在从节点,以下图所示:async
当从节点链接主节点时,主节点会建立一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操做时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点以前,锁会被释放。
当从节点上执行start slave
命令以后,从节点会建立一个I/O线程用来链接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新以后,保存在本地relay-log中。
SQL线程负责读取relay log中的内容,解析成具体的操做并执行,最终保证主从数据的一致性。
对于每个主从链接,都须要三个进程来完成。当主节点有多个从节点时,主节点会为每个当前链接的从节点建一个binary log dump 进程,而每一个从节点都有本身的I/O进程,SQL进程。从节点用两个线程将从主库拉取更新和执行分红独立的任务,这样在执行同步数据任务的时候,不会下降读操做的性能。好比,若是从节点没有运行,此时I/O进程能够很快从主节点获取更新,尽管SQL进程尚未执行。若是在SQL进程执行以前从节点服务中止,至少I/O进程已经从主节点拉取到了最新的变动而且保存在本地relay日志中,当服务再次起来以后,就能够完成数据的同步。
要实施复制,首先必须打开Master 端的binary log(bin-log)功能,不然没法实现。
由于整个复制过程实际上就是Slave 从Master 端获取该日志而后再在本身身上彻底顺序的执行日志中所记录的各类操做。以下图所示:
MySQL 主从复制默认是异步的模式。MySQL增删改操做会所有记录在binary log中,当slave节点链接master时,会主动从master处获取最新的bin log文件。并把bin log中的sql relay。
异步模式以下图所示,这种模式下,主节点不会主动push bin log到从节点,这样有可能致使failover的状况下,也许从节点没有即时地将最新的bin log同步到本地。
这种模式下主节点只须要接收到其中一台从节点的返回信息,就会commit;不然须要等待直到超时时间而后切换成异步模式再提交;这样作的目的可使主从数据库的数据延迟缩小,能够提升数据安全性,确保了事务提交后,binlog至少传输到了一个从节点上,不能保证从节点将此事务更新到db中。性能上会有必定的下降,响应时间会变长。以下图所示:
半同步模式不是MySQL内置的,从MySQL5.5开始集成,须要master 和slave 安装插件开启半同步模式。
全同步模式是指主节点和从节点所有执行了commit并确认才会向客户端返回成功。
MySQL 主从复制有三种方式:基于SQL语句的复制(statement-based replication,SBR),基于行的复制(row-based replication,RBR),混合模式复制(mixed-based replication,MBR)。对应的binlog文件的格式也有三种:STATEMENT,ROW,MIXED。
MySQL主从复制是MySQL高可用,高性能的基础,有了这个基础,MySQL的部署会变得简单、灵活而且具备多样性,从而能够根据不一样的业务场景作出灵活的调整。