快来看看你们要的MySQL主从复制原理吧
从MySQL3.23版本开始,MySQL支持主从复制功能,MySQL复制是通过将记录DDL和DML操作的日志文件(binlog)从主服务器传输到从服务器,从服务器重做日志,使从服务器与主服务器中的数据达
概要 从MySQL3.23版本开始,MySQL支持主从复制功能,MySQL复制是通过将记录DDL和DML操作的日志文件(binlog)从主服务器传输到从服务器,从服务器重做日志,使从服务器与主服务器中的数据达到一致的状态。 主从复制的优点
MySQL主从复制解决的问题
注意:MySQL主从复制采用异步复制的方法,由于网络延迟的缘故,在从库中查询数据的时候要考虑到这些数据的不一致性差异,一般只有更新不频繁和对实时性不高的数据才通过从库查询数据。 MySQL 主从复制概念 MySQL主从复制指的是数据库数据可以从一个MySQL数据库主节点复制到一个或多个数据库从节点。MySQL默认采用异步复制的方式,这样从数据库不用一直访问主数据库,数据更新可以在远程服务器上进行,从数据库可以复制主数据库中所有的库,或者指定的数据库,或者特点的表。 MySQL主从复制的主要用途 读写分离 执行一条SQL语句的时候,会对相应的数据加锁,导致其他客户端阻塞等待而无法读取相应的数据,这样势必影响MySQL数据的性能,这样也就会影响现有业务,通过读写分离,主库负责写,从库负责读,即使主库出现锁表的情况,通过读从库也能保证业务的正常进行。 数据实时备份,当系统某个节点出现故障时,可以方便的故障切换(主从切换) 提高数据安全性,因为数据已经备份到从服务器,从服务器可以终止复制,所以可以在从服务器中进行数据不备份而不影响主服务器 高可用 机构扩展 随着系统架构的扩展,如果部署单个数据库库服务,就会导致IO访问频率过高。有了主从复制增加数据库节点,就可以将磁盘IO分布到多个节点上,提高单个机器的IO性能。 主从复制的形式 一主多从 提高系统的读性能 一主一从和一主多从是最常见的体系架构,实施起来简单且高效,不仅实现的高可用,还实现了读写分离,进而提升集群的并发能力。 多主一从(5.7开始支持) 多主一从可以将多台数据库备份到一台存储性能比较好的服务器 上 双主复制 每一台服务器即是master服务器,又是另外一台的slave服务器。这样任何一方所做的变更都可以通过复制到另一方服务器。 级联复制 级联模式下部分节点不是连接到主节点,而是连接到从节点。因为如果主节点连了太多的从节点就会损耗一部分性能用于Replication(复制)。那么我们可以让3~5个节点连到主节点,其他节点作为二级或者三级节点连到从节点上,这样既不会影响性能,也缓解了主节点的压力。级联模式下,从节点也要开启binlog功能。 MySQL主从复制原理 MySQL主从复制涉及到三个线程,一个运行在主节点中:log dump thread,还有两个运行在从节点中:IO thraed和SQL thread。如下图所示: 主节点log dump thread 当从服务器连接主服务器时,主服务器会为从服务器创建一个log dump thread,用于发送和读取bin log内容。log dump thread 读取bin log日志文件的时候会为bin log文件加锁,在读取完成,在发送给从服务器之前释放锁。主节点会为每一个连接自己的从节点创建一个log dump thread,log dump thread还会监听从服务器。 从节点IO thread 当从节点执行start slave命令之后,从节点会创建一个IO thread,请求主节点更新bin log,IO thread接收到主节点发送 过来的更新之后,保存到relay log中。 从节点SQL thread SQL thread读取relay log中的内容,并解析成具体的执行语句并执行,最终达到主从数据库的一致性。 对于每一个主从连接都需要这三个线程来完成。当主节点有多个从节点时,主节点需要为每一个从节点创建一个dump log thread,而每一个从节点都有自己SQL thread和IO thread,从节点用这两个线程将从主节点拉取更新和执行分成两个独立的任务,这样在执行同步任务的时候不会降低读取数据的性能。比如,如果从节点没有运行,IO thread可以很快的从主节点拉去更新,尽管SQL线程没有执行。如果SQL线程还没有执行,这是从节点宕机了,由于IO线程已经将主节点的更新拉取到了本地并保存在relay log中,当从服务器启动的时候还可以完成数据同步。 要实施复制必须打开master的bin log功能,因为主从复制的本质就是就是将主节点中的bin log节点拉取到从节点,然后解析重做从而达到数据一致性(SQL执行是顺序执行的)。主从复制的过程如下所示: 主从复制的基本过程 在从节点上执行start slave 命令,开启主从粗制开关。从节点的IO线程连接到主节点mssql复制表,并从指定的文件中指定的位置开始复制。主节点中dump log线程会监听从节点中的IO线程,当IO线程请求同步更新时,dump log线程会读取指定文件指定位置之后的信息,返回给从节点。返回信息中除了包含日志信息之外还包含了当前bin log file和bin log position(偏移量,下一次复制的起始位置)。从节点中的IO线程接收到主节点的信息之后,将日志信息保存到relay-log中,将bin-log-file和bin-log-position保存到master-info中,以便下一次复制,通知主节点下一次复制的文件名及其起始位置。SQL线程监测到relay-log中添加了新内容,就会将relay-log解析成其在主节点实际执行的SQL语句,然后再从节点中顺序执行一遍,并再relay-log.info文件中记录当前中继日志文件名和为支点。主从复制模式 MySQL主从复制默认是异步复制模式。MySQL会把增删改操作记录到bin log中,当slave连接到master时,会主动从master中获取最新的bin log文件。并把bin log保存到relay log中,然后执行relay log的更新内容。 异步模式 这种节点主节点不追主动将bin log推送到从节点,主节点执行完并提交事务后,并不关心从节点是否已经接受并处理,而是直接将结果返回给客户端。那么这样就会有一个问题,如果主节点崩溃了,还没将bin log推送到从节点,此时如果强行将从节点切换为主节点,可能导致新主节点的数据不完整。异步模式下的主从复制过程如下图所示: 半同步模式 介于异步模式和全同步模式之间,主服务器处理完客户端提交的事务后不立即向客户端返回结果,而是等待至少一个从服务器接受并写入relay log中才返回执行成功信息到客户端(只能保证主服务器将bin log至少传输到一个从服务器,并不能保证从服务器执行该事务并更新到db),否则需要等待知道超时时间,转换为异步模式,将结果返回到客户端。相对于异步复制,一定程度上保证了数据的安全性,但是也会带来一定程度的延迟,但时比全同步延时要低,延时时间至少是一个TCP/IP连接时间。所以半同步使用于延时较低的环境下。 全同步模式 指当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。因为需要等待所有从库执行完该事务才能返回成功信息,所以全同步复制的性能必然会收到严重的影响。 异步模式,半同步模式和全同步模式对比图 GTID复制模式 即全局事务ID, 保证了在每个在主库上提交的事务在集群中有一个唯一的ID. 在传统的复制里面,当发生故障,需要主从切换,需要找到bin-log和pos点(指从库更新到了主库bin-log的哪个位置,这个位置之前都已经更显完毕,这个位置之后未更新),然后将主节点指向新的主节点,相对来说比较麻烦,也容易出错。在MySQL 5.6里面,不用再找bin-log和pos点,我们只需要知道主节点的ip,端口,以及账号密码就行,因为复制是自动的,MySQL会通过内部机制GTID自动找到同步点。
总结 Mysql 主从复制是mysql 高可用,高性能的基础,有了这个基础,mysql 的部署会变得简单、灵活并且具有多样性,从而可以根据不同的业务场景做出灵活的调整。 (编辑:开发网_商丘站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |