mysql数据库relaylog

同步模式

mysql有三种同步模式分别是

异步复制:mysql中默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接受并处理。存在的问题就是,如果主库的日志没有及时从同步到从库,然后主库宕机了,这是执行故障转移,在从库中选主,可能会存在选出的主数据不完整。

全同步复制:指当主库执行完一个事务,并且等到所有从库也执行完成这个事务的时候,主库在提交事务,并且返回数据给客户端。因为要等待所有从库都同步到主库中的数据才返回数据,所以能够保证主从数据的一致性,但是数据库的性能必然受到影响;

半同步复制:半同步复制:是介于全同步和全异步同步的一种,主库至少需要等待一个从库接收并写入到RelayLog文件即可,主库不需要等待所有从库给主库返回ACK。主库收到ACK,标识这个事务完成,返回数据给客户端。

MySQL中默认的复制是异步的,所以主库和从库的同步会存在一定的延迟,更重要的是异步复制还可能引起数据的丢失。全同步复制的性能又太差了,所以从MySQL5.5开始,MySQL以插件的形式支持semi-sync半同步复制。

半同步复制潜在的问题

半同步复制分为传统的半同步复制和增强半同步复制(也称无损复制)
在传统的半同步复制中,主库写数据到BINLOG,且执行Commit操作后,会一直等待从库的ACK,即从库写入Relay Log后,并将数据落盘,返回给主库消息,通知主库可以返回前端应用操作成功,这样会出现一个问题,就是实际上主库已经将该事务Commit到了事务引擎层,应用已经可以看到数据发生了变化,只是在等待返回而已,如果此时主库宕机,有可能从库还没能写入Relay Log,就会发生主从库不一致。增强半同步复制就是为了解决这个问题,做了微调,即主库写数据到BINLOG后,就开始等待从库的应答ACK,直到至少一个从库写入Relay Log后,并将数据落盘,然后返回给主库消息,通知主库可以执行Commit操作,然后主库开始提交到事务引擎层,应用此时可以看到数据发生了变化。增强半同步复制的大致流程如下图所示

作者:回眸淡然笑
链接:https://www.jianshu.com/p/040eadca4d55
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

RelayLog

中继日志(relay log)只在主从服务器架构的从服务器上存在。从服务器为了与主服务器保持一致,要从主服务器读取二进制内容,并且把读取到的信息写入本地的日志文件中,这个从服务器本地的日志文件就叫中继日志。然后从服务器读取中继日志,并根据中继日志的内容从服务器的数据进行更新,完成主从服务器的数据同步。

搭建好主从服务器之后,中继日志默认会保存在从服务器的数据目录下。

文件名的格式是:从服务器名 - relay-bin.序号。中继日志还有一个索引文件:从服务器名 - relay-bin.index,用来定位当前正在使用的中继日志。

从服务器I/O线程将主服务器的二进制日志binlog读取过来记录到从服务器本地文件,然后从服务器SQL线程会读取中继入职的内容并应用到从服务器,从而使得服务器和主服务器的数据保持一致。

作用

中继日志用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。从服务器通过读取中继日志的内容,来同步主服务器上的操作。

中继日志是连接mastert(主服务器)和slave(从服务器)的信息,它是复制的核心,I/O线程将来自master的binlog存储到中继日志中,中继日志充当缓冲,这样master不必等待slave执行完成就可以发送下一个binlog。

Last modification:November 17, 2023
如果觉得我的文章对你有用,请随意赞赏