《MySQL——redo log 与 binlog 写入机制》

目录

    • binlog写入机制
    • redo log写入机制
    • 组提交机制实现大量的TPS
    • 理解WAL机制
    • 如何提升IO性能瓶颈

WAL机制告诉我们:只要redo log与binlog保证持久化到磁盘里,就能确保MySQL异常重启后,数据可以恢复。

下面主要记录一下MySQL写入binlog和redo log的流程。

binlog写入机制

1、事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。

2、binlog cache,系统为每个线程分配了一片binlog cache内存,参数binlog_cache_size控制单个线程内binlog cache大小。如果超过了这个大小就要暂存磁盘

3、事务提交的时候,执行器把binlog cache里完整的事务写入binlog中。并清空binlog cache

4、每个线程都有自己的binlog cache,共用一份binlog文件

5、write,是把日志写入到文件系统的page cache,内存中,没有持久化到磁盘,所以速度比较快,图中的fsync是将数据持久化到磁盘,占用磁盘的IOPS
在这里插入图片描述

关于何时write、fsync是由参数sync_binlog控制的:

1、sync_binlog = 0时,每次提交事务都只write,不fsync;
2、sync_binlog = 1时,每次提交事务都会执行fsync;
3、sync_binlog = N(N>1)时,表示每次提交事务都write,但累积N个事务后才fsync。

sync_binlog控制binlog真正刷盘的频率,对于一个IO非常大的情景,这个数字调大可以提高性能,但是如果容错率非常低的情况下,必须设为1.(sync_binlog设置为N对应的风险是:如果主机发生异常重启,会丢失最近N个事务的binlog日志)

redo log写入机制

事务在执行过程中,生成的redo log是要先写到redo log buffer的。

redo log buffer里面的内容并不需要每次生成后都要持久化到磁盘中。

如果事务执行期间MySQL发生异常重启,那么这部分日志就丢了。由于事务并没有提交,所以这时日志丢了也不会有损失。

事务没提交的时候,redo log buffer部分日志也是有可能被持久化到磁盘中的。
在这里插入图片描述
上面三个颜色表征了redo log可能的三种状态:

1、存在redo log buffer中,物理上是在MySQL进程内存中,即红色部分;

2、写到磁盘(write),但是没有持久化(fsync),物理上实在文件系统的page cache里面,即黄色部分;

3、持久化到磁盘,对应的是hard disk,也就是图中的绿色部分;

前两步是写内存,最后一步是磁盘IO,所以要在page cache够大且不影响写入page cache前将redo log 持久化到磁盘 。

为了控制redo log 的写入策略,InnoDB提供了innodb_flush_log_at_trx_commit参数,他有三种可能取值:

1、设置为0,每次事务提交的时候都只是把redo log留在redo log buffer中;
2、设置为1,每次事务提交的时候都只是把redo log直接持久化到磁盘;
3、设置为2,每次事务提交时都只是把redo log写到page cache;

与binlog不同,binlog是每个线程都有一个binlog cache,而redo log是多个线程共用一个redo log buffer。

InnoDB有一个后台线程,每隔1s,就会把redo log buffer中的日志,调用write写到文件系统的page cache,然后调用fsync持久化到磁盘,事务执行过程中的redo log也是直接写在redo log buffer上的,所以,未提交的事务的redolog也可能被持久化到磁盘。

还有两种场景也会导致没有提交的事务的redo log写入到磁盘中:

情形1:

redo log buffer占用的空间即将达到innodb_log_buffer_size一半的时候,后台线程会主动写盘。

(这里只是write,没有fsync)

情形2:

并行的事务提交的时候,顺带将这个事务的redo log buffer持久化到磁盘。

(事务A执行一半,部分redo log到buffer中;事务B提交,且 innodb_flush_log_at_trx_commit ,会把redo log buffer里的log全部持久化到磁盘中)

补充说明

两阶段提交在时序上redo log先prepare 再写binlog,最后再把redo log commit;

innodb_flush_log_at_trx_commit 设置成 1,prepare阶段redo log就已经落盘。所以redo log再commit的时候就不需要fsync了,只会write到文件系统的page cache中就够了。

sync_binlog 和 innodb_flush_log_at_trx_commit都设置为1,即一个事务完整提交前,需要等待两次刷盘,一次是redo log(prepare阶段),一次是binlog。

组提交机制实现大量的TPS

首先介绍日志逻辑序列号(log sequence number,LSN)的概念。LSN是单调递增的,每次写入长度length的redo log,LSN的值就会加上length。

三个并发事务(trx1,trx2,trx3)在prepare阶段,都写完redo buffer,并持久化到磁盘。

对应的LSN为50、120、160.

对应流程:

1、trx1第一个到达,被选为这组的leader;

2、等trx1要开始写盘的时候,这个组里面已经有三个事务,这时候LSN也变成了160;

3、trx1去写盘的时候,LSN=160;trx1返回时,所有LSN<= 160的redo log都被持久化到磁盘中;

4、trx2与trx3直接返回。

总结:

一次组提交中,组员越多,节约磁盘IOPS的效果越好。如果是单线程,就只能一个事务对应一次持久化操作

两阶段提交
两阶段提交细化

这样保证binlog也可以组提交了。由于step3速度快,所以集合到一起的binlog比较少,所以binlog的组提交效果不如redo log组提交。

提升binlog效果:

--1.binlog_group_commit_sync_delay :b表示延迟多少微秒后才调用fsync;
--2.binlog_group_commit_sync_no_delay_count :表示累积多少次以后才调用fsync;

理解WAL机制

WAL机制是减少磁盘写,可是每次提交事务都要写redo log和binlog ,磁盘读写次数没有变少。

所以WAL机制主要得益于两个方面:

--1、redo log和binlog都是顺序写,磁盘的顺序写比随机写速度要快
--2、组提交机制,可以降低磁盘IOPS消耗

如何提升IO性能瓶颈

1、设置binlog_group_commit_sync_delaybinlog_group_commit_sync_no_delay_count参数,减少binlog的写盘次数。这个方法是基于“额外故意等待”来实现的,可能会增加语句的响应时间,但是不会丢失数据

2、将sync_binlog设置为大于1的值(100~1000)。不过会有主机掉电时丢binlog日志的风险

3、将 innodb_flush_log_at_trx_commit 设置为2。会有主机掉电丢数据的风险

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串:KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

涉及到字符串的问题&#xff0c;无外乎这样一些算法和数据结构&#xff1a;自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用。当然这些都是比较高级的数据结构和算法&#xff0c;而这里面最常用和最熟悉的大概是kmp&#xff0c;即使如此还是有相当一部分人也…

WPF CanExecuteChanged

继承ICommand ,RelayCommand命令 1 public class RelayCommand : ICommand2 {3 private readonly Action _execute;4 private readonly Func<bool> _canExecute;5 public event EventHandler CanExecuteChanged;6 public RelayComma…

《MySQL——主备一致性六问六答》

目录备库为什么要设置为只读模式&#xff1f;备库设置为只读&#xff0c;如何与主库保持同步更新&#xff1f;A到B的内部流程如何&#xff1f;binlog内容是什么&#xff1f;row格式对于恢复数据有何好处M-M结构的循环复制问题以及解决方案备库为什么要设置为只读模式&#xff1…

fyi 在邮件里是什么意思_FYI的完整形式是什么?

fyi 在邮件里是什么意思仅供参考&#xff1a;供您参考 (FYI: For Your Information) FYI is an acronym of "For Your Information". It is a widespread internet slang used these days in text messaging, instant messaging, and chatting on Facebook, WhatsApp…

Hyper-V 替换 vmwp

要激活 Hyper-V 下的虚机 最简单的方法是用带证书的vmwp替换掉原来的 带证书的vmwp参见&#xff1a;http://bbs.pcbeta.com/viewthread-1408240-1-1.html 下载后腰替换 先把 Hyper-V 的俩服务停止掉 然后找到 C:\Windows\System32\vmwp.exe 右键--安全 替换掉所有者 然后给自己…

ejb模式_EJB的完整形式是什么?

ejb模式EJB&#xff1a;企业Java Bean (EJB: Enterprise Java Bean) EJB is an abbreviation of Enterprise Java Bean. EJB is one of many Java application programming interfaces (API) for flexible and manageable structuring of Java Platform, Enterprise Edition (J…

Android之PreferenceActivity

http://www.cnblogs.com/wservices/archive/2010/07/08/1773449.html 看到很多书中都没有对PreferenceActivity做介绍&#xff0c;而我正好又在项目中用到&#xff0c;所以就把自己的使用的在这总结一下&#xff0c;也方便日后查找。 PerferenceActivity是什么&#xff0c;看下…

浅谈算法和数据结构: 七 二叉查找树

前文介绍了符号表的两种实现&#xff0c;无序链表和有序数组&#xff0c;无序链表在插入的时候具有较高的灵活性&#xff0c;而有序数组在查找时具有较高的效率&#xff0c;本文介绍的二叉查找树(Binary Search Tree&#xff0c;BST)这一数据结构综合了以上两种数据结构的优点。…

《MySQL——备库多线程复制策略。》

目录备库并行复制能力MySQL5.6版本 并行复制策略MariaDB 并行复制策略MySQL5.7版本 并行复制策略MySQL5.7.22版本 并行复制策略总结备库并行复制能力 主要涉及两个方面的并行度&#xff1a; 1、客户端写入主库的能力 2、备库上sql_thread执行中转日志relay log 1的并行能力…

为移动端网页构造快速响应按钮

背景 在谷歌&#xff0c;我们不断地推测手机网页应用的可能性。像HTML5这样的技术使我们网页版的应用以及运行在手机设备上的原生应用。而这些技术的成就之一就是我们开发了一种新的创建按钮的方法&#xff0c;使按钮的响应时间远远快于一般的HTML按钮。在此之前的按钮或者其他…

Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解+使用教程

Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解使用教程 Red Gate系列文章&#xff1a; Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解使用教程 Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制…

《MySQL——基于位点orGTID的主备切换协议》

一主多从的设置&#xff0c;用于读写分离&#xff0c;主库负责所有的写入和一部分读&#xff0c;其他读请求则由从库分担。 一主多从架构下&#xff0c;主库故障后的主备切换问题。相比于一主一备&#xff0c;多了从库指向新主库的过程。 基于位点的主备切换同步 把节点B设…

数据科学和统计学_数据科学中的统计

数据科学和统计学统计 (Statistics) Statistics are utilized to process complex issues in reality with the goal that Data Scientists and Analysts can search for important patterns and changes in Data. In straightforward words, Statistics can be utilized to ge…

《MySQL——如何解决一主多从的读写分离的过期读问题》

目录两种架构两种架构特点强制走主库方案Sleep方案判断主备无延迟方案配合semi-sync等主库位点方案GTID方案两种架构 基于一主多从的读写分离&#xff0c;如何处理主备延迟导致的读写分离问题。 读写分离的主要目标&#xff1a;分摊主库压力。 有两种架构&#xff1a; 1、客…

《MySQL——外部检测与内部统计 判断 主库是否出现问题》

目录select1判断查表判断更新判断外部检测弊端内部统计一主一备的双M架构里&#xff0c;主备切换只需要把客户端流量切换到备库。 在一主多从的架构里&#xff0c;主备切换要把客户端流量切换到备库&#xff0c;也需要把从库接到新主库上。 切换有两种场景&#xff1a;1、主动…

[Json] C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json (转载)...

点击下载 ConvertJson.rar 本类实现了 C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json|等功能大家先预览一下 请看代码 /// <summary> /// 类说明&#xff1a;Assistant /// 编 码 人&#xff1a;苏飞 /// 联系方式&#xff1a;361983679 …

《MySQL——恢复数据-误删行、表、库》

目录误删行事前预防误删行数据方法误删表/库延迟复制备库事前预防误删库/表方法传统的架构不能预防误删数据&#xff0c;因为主库的一个drop table命令&#xff0c;会通过binlog传给所有从库和级联从库&#xff0c;进而导致整个集群的实例都会执行这个命令。 MySQL相关的误删除…

python图例位置_Python | 图例位置

python图例位置Legends are one of the key components of data visualization and plotting. Matplotlib can automatically define a position for a legend in addition to this, it allows us to locate it in our required positions. Following is the list of locations…

工作总结:文件对话框的分类(C++)

原文地址&#xff1a;http://www.jizhuomi.com/software/173.html 文件对话框分为打开文件对话框和保存文件对话框&#xff0c;相信大家在Windows系统中经常见到这两种文件对话框。例如&#xff0c;很多编辑软件像记事本等都有“打开”选项&#xff0c;选择“打开”后会弹出一个…

《MySQL——Innodb改进LRU算法》

Innodb改进LRU.算法&#xff0c;实质上将内存链表分成两段。 靠近头部的young和靠近末尾的old&#xff0c;取5/12段为分界。 新数据在一定时间内只能在old段的头部&#xff0c;当在old段保持了一定的时间后被再次访问才能升级到young。 实质上是分了两段lru&#xff0c;这样做的…