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

这篇具有很好参考价值的文章主要介绍了MySQL如何保证数据的可靠性(保证数据不丢失)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 结论:

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

2. 机制

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

3. binlog 写入机制

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

流程

  • 每个线程内都有一个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 写入机制

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

流程

  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如何保证数据的可靠性(保证数据不丢失)
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
这段话比较难理解,可以看图理解。
MySQL如何保证数据的可靠性(保证数据不丢失)

redo log 采用组提交的示例

图片来自《MySQL45讲》
MySQL如何保证数据的可靠性(保证数据不丢失)

  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文件持久化到磁盘。

MySQL如何保证数据的可靠性(保证数据不丢失)
本着拖时间的原则来分析:
将 prepare 阶段的 fsync 拖到binlog的write之后,
同样binlog的fsync 拖到了 redo log的fsync之后,
优化后的方案:redo log 和bin log 都实现了组提交。
区别在于 binlog的组提交带来的优化效果不如 redo log,主要原因是拖的时间不长
大佬原话:
MySQL如何保证数据的可靠性(保证数据不丢失)
但是可以通过参数来控制:文章来源地址https://www.toymoban.com/news/detail-484957.html

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

到了这里,关于MySQL如何保证数据的可靠性(保证数据不丢失)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何保证消息的可靠性(面试题)

    面试题 :Rebbitmq怎么保证消息的可靠性 消费者在接收到消息后,默认情况下RabbitMQ会自动确认消息(autoAck=true)。为保证消息可靠性,可以设置autoAck=false,使得消费者在处理完消息后手动发送确认(basicAck)。如果消费者在处理过程中发生异常或者未完成处理就终止运行,那

    2024年04月14日
    浏览(48)
  • 如何保证 RabbitMQ 的消息可靠性?

    项目开发中经常会使用消息队列来 完成异步处理、应用解耦、流量控制等功能 。虽然消息队列的出现解决了一些场景下的问题,但是同时也引出了一些问题,其中使用消息队列时如何保证消息的可靠性就是一个常见的问题。 如果在项目中遇到需要保证消息一定被消费的场景

    2024年02月07日
    浏览(49)
  • rabbitmq如何保证消息的可靠性

    RabbitMQ可以通过以下方式来保证消息的可靠性: 在发布消息时,可以设置消息的delivery mode为2,这样消息会被持久化存储在磁盘上,即使RabbitMQ服务器重启,消息也不会丢失。 可以创建持久化的队列,这样即使RabbitMQ服务器重启,队列也不会丢失。 在消费者端,可以 设置手动

    2024年01月23日
    浏览(54)
  • TCP如何保证传输的可靠性

    TCP采用哪些方式保证数据传输可靠? 答: 1、数据分块:将数据包划分为合适的大小,这样更能适应网络的限制,如果数据发生错误或丢失,只要重传有问题的部分即可,减少重传的数据量。方便进行流量和拥塞控制。 2、数据包有序号,可以根据序号对失序的数据包进行重

    2024年04月11日
    浏览(39)
  • TCP如何保证服务的可靠性

    TCP保证可靠性一般有以下几种方法: (1) 确认应答 :ACK和序列号 (2) 超时重传 :发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送 (3) 流量控制 :控制发送方发送窗口的大小来实现流量控制 (4) 拥

    2024年02月15日
    浏览(41)
  • Kafka—工作流程、如何保证消息可靠性

    分布式事件流平台 。希望不仅仅是存储数据,还能够数据存储、数据分析、数据集成等功能。消息队列(把数据从一方发给另一方),消息生产好了但是消费方不一定准备好了(读写不一致),就需要一个中间商来存储信息,kafka就是中间商 架构图如下: 名称 解释 Broker 消

    2024年02月11日
    浏览(52)
  • 【HBZ分享】TCP可靠性传输如何保证的?

    ACK机制是发送方与接收方的一个相互确认 客户端向服务端发送连接请求,此时服务端要回馈给客户端ACK,以表示服务端接到了客户端请求,这是第一和的第二次握手 客户端接收到服务端响应后,同样也要回馈服务端的响应,告知服务端我收到了你的回馈,我们可以进行传输

    2024年02月10日
    浏览(35)
  • rabbitmq如何保证消息的可靠性传输(简述版本)?

    我需要从三点去考虑, 生产者弄丢了数据,生产者将消息发送的Exchange并且路由到队列 队列需要将消息给它持久化 消费者要成功消费队列中的消息 RabbitMQ提供了confirm机制,保证了消息消息发送的Exchange交换机,那么还提供了return机制,可以保证消息从exchange路由到队列中,如

    2024年02月13日
    浏览(37)
  • RabbitMQ如何保证消息的可靠性6000字详解

    RabbitMQ通过生产者、消费者以及MQ Broker达到了解耦的特点,实现了异步通讯等一些优点,但是在消息的传递中引入了MQ Broker必然会带来一些其他问题,比如如何保证消息在传输过程中可靠性(即不让数据丢失,发送一次消息就会被消费一次)?这篇博客将详细从生产者,MQ B

    2024年02月16日
    浏览(37)
  • 计算机网络-TCP如何保证传输可靠性

    TCP协议传输的特点主要就是面向字节流、传输可靠、面向连接。 TCP协议如何确保传输的可靠性的? TCP协议保证数据传输可靠性的方式主要有: 1.校验和 2.序列号 3.确认应答 4.超时重传 5.连接管理 6.流量控制 7.拥塞控制 1.校验和 发送方:在发送数据之前计算检验和,并进行校验

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包