MySQL如何保证数据的可靠性(保证数据不丢失)

news/2024/10/18 1:42:13/

1. 结论:

只要redo logbinlog 保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复。

2. 机制

WAL机制,(Write Ahead Log): 事务先写入日志,后持久化到磁盘。

3. binlog 写入机制

binlog写入流程图,选自《MySQL45讲》

流程

  • 每个线程内都有一个binlog cache,记录先写入binlog cache,所有线程共享一个binlog文件
  • binlog cache write into binlog file, binlog file 是存储在文件操作系统的page cache中。
  • binlog file 通过 fsync持久化到磁盘。

解释

  • write是内存之间的操作,速度很快。
  • fsync是内存和磁盘之间的操作,速度慢,占据磁盘的IOPS。

写入控制策略

write和fsync的时机可调,参数sync_binlog可以控制

  1. sync_binlog = 0 ,每次提交事务只write, 不fsync.
  2. sync_binlog = 1, 每次提交事务都会执行fsync。
  3. sync_binlog= N, 每次提交事务都write, 但累积N个事务后才fsync,N 的取值范围为(100,1000)。
    通俗理解,sync_binlog 控制的是fsync的时机,处于数据恢复和效率,一般不取0和1,

4. redo log 写入机制

redo log的三种状态

流程

  1. redo log 先写入 redo log buffer中,存储在mysql的进程中。(内存)
  2. 写到(write)page cache, 存储在文件系统的页缓存中。(内存)
  3. 持久化(fsync)到磁盘。

写入控制策略

redo log的写入控制同样是通过参数去调整:innodb_flush_log_at_trx_commit
从参数名就可以看出, 是innodb提供的在事务提交时redo_log的刷盘策略

  1. 设置为0表示 每次事务提交时都把redo log留在 redo log buffer。
  2. 设置为1表示 每次事务提交时都将 redo log 直接持久化到磁盘中。
  3. 设置为2表示 每次事务提交时都只是把redo log 写到page cache。

此外,Innodb存在一个后台线程,每隔1秒,机会将redo lo个buffer中的日志,刷盘到page cache,然后持久化到磁盘中。

5. 两阶段提交机制

两阶段提交
MySQL一般采用的是双“1”策略,就是sync_binlog 和 innodb_flush_log_at_trx_commit都为1。
换言之,一次完整的事务提交需要等待两次刷盘,一次是在redo log(prepare) fsync,一次是在写binlog中fsync。
引发新的问题:
如果MySQL的TPS为每秒2万,按照两阶段提交,每秒机会有四万次写磁盘,但是
磁盘能力就2万每秒,如何实现两万的TPS?
换言之:就是在遇到磁盘瓶颈时,如何优化,减少刷盘次数

组提交机制(group commit)

LSN

在介绍组提交之前,需要了解日志逻辑序列号(log sequence number, LSN),这是一个单调递增,且对应redo log的写入点,每次写入长度为length的redo log, LSN的值就会加上length
这段话比较难理解,可以看图理解。
日志逻辑序列号

redo log 采用组提交的示例

图片来自《MySQL45讲》
在这里插入图片描述

  1. trx1 是第一个到达的,会被选为这组的 leader;
  2. 等 trx1 要开始写盘的时候,这个组里面已经有了三个事务,这时候 LSN 也变成了 160;
  3. trx1 去写盘的时候,带的就是 LSN=160,因此等 trx1 返回时,所有 LSN 小于等于 160 的 redo log,都已经被持久化到磁盘;
  4. 这时候 trx2 和 trx3 就可以直接返回。

总结:一次组提交里面,组员越多,节约磁盘 IOPS 的效果越好。
在并发场景下,为了尽可能多的的在一次组提交内包含更多的组员,第一个事务在写完redo log buffer之后,接下来的fsync需要尽可能的晚调用。

优化

在MySQL 中就有这样的优化:为了让一次fsync带的组员更多,采取拖时间。
将redo log prepare分成两个阶段

  • write: 将redolog cache 写入 page cache
  • fsync:: 将page cache中的redo log 日志持久化到磁盘中。
    将binlog 分成两个阶段:
  • write : 将日志从binlog cache写入page cache中的binlog文件
  • fsync: 将binlog文件持久化到磁盘。

两阶段提交细化
本着拖时间的原则来分析:
将 prepare 阶段的 fsync 拖到binlog的write之后,
同样binlog的fsync 拖到了 redo log的fsync之后,
优化后的方案:redo log 和bin log 都实现了组提交。
区别在于 binlog的组提交带来的优化效果不如 redo log,主要原因是拖的时间不长
大佬原话:
在这里插入图片描述
但是可以通过参数来控制:

  1. binlog_group_commit_sync_delay ;表示延迟多少微秒后才调用 fsync;
  2. binlog_group_commit_sync_no_delay_count ,表示累积多少次以后才调用 fsync。
    两条件是或的关系,满足一个就会调用fsync。

http://www.ppmy.cn/news/386825.html

相关文章

【MySql】基本查询

文章目录 插入操作insert查询操作selectselect查询where条件判断order by排序limit筛选分页结果 更新操作update删除操作delete插入查询结果 CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 先创建提供一张表&am…

次时代的终端产品

看到一位领导报告,其中一些文字觉得总结十分到位,在此做一下记录。 工业革命下的产品,每一个时代都有这个时代进入千家万户的终端产品。 第一次工业革命是机械化,当时进入千家万户的,是200多年前开始出现的自行车、缝纫…

黑客松必备|Bear Necessities Hackathon Office Hours汇总

由Moonbeam和AWS Startups联合主办的Bear Necessities Hackathon黑客松启动仪式已于5月30日举行。本次黑客松将历时约1个月的时间,包含6个挑战,分别由Moonbeam基金会、Chainlink、StellaSwap、SubQuery、Biconomy提供赞助,总奖池超过5万美金。…

全球限量1000台!京东联手格力首推全AI定制冰箱 618开售

又是一年京东店庆月。每年618京东都会玩一些新花样,为各位剁手党提供价格优惠、品质优良的好产品。今年京东与“家电一姐”格力强强联合,推出了定制款“格力晶弘303升变频风冷多门冰箱”。它不仅是业界首款全部由人工智能(AI)进行…

【后端面经-数据库】MySQL的事务隔离级别简介

【后端面经-数据库】MySQL的事务隔离级别简介 0. 事务的概念1. 三类问题2. 事务隔离级别3. 操作指令4. 总结5. 参考博文 0. 事务的概念 事务指的是一连串的集中操作指令,一个事务的执行必须执行完所有的动作才能算作执行结束。事务具有四个特点,简记作A…

【力扣 】查找所有至少连续出现三次的数字/求连续登录3天的用户数(SQL完成)

0. 题目 编写一个 SQL 查询,查找所有至少连续出现三次的数字。 返回的结果表中的数据可以按 任意顺序 排列。 输入: Logs 表: —---- | Id | Num | —---- | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 1 | | 6 | 2 | | 7 | 2 | —---- …

空压机设备远程监控解决方案

空压机设备远程监控解决方案 空压机物联网系统,通过物联网技术实现远程监控管理功能,空压机物联网系统将终端空压机的各种数据信息传输到监控中心,便于时时在线监控、记录、查询、统计、分析。空压机物联网,同时客户可使用PC端、…

SRE 的工作介绍

哈喽大家好,我是咸鱼 今天看到了一篇很不错的文章,作者是一名 SRE 工程师,在 Shopee 工作,base 新加坡 分享出来给大家看看 作者:卡瓦邦噶 原文链接:https://www.kawabangga.com/posts/4481 原文如下&…