binlog的写入机制

每个线程都会先将日志写入到binglog cache, 事务提交的时候,再把binlog cache写到binlog文件中。所有线程都写一个binlog日志。

binlog_cache_size 用于控制单个线程内binlog cache 所占内存的大小,如果超过了这个参数规定的大小,就要暂存到磁盘。

write 和 fsync 的时机,是由参数 sync_binlog 控制的:

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

因此,在出现 IO 瓶颈的场景里,将 sync_binlog 设置成一个比较大的值,可以提升性能。在实际的业务场景中,考虑到丢失日志量的可控性,一般不建议将这个参数设成 0,比较常见的是将其设置为 100~1000 中的某个数值。

redo log 的写入机制

redo log 也是写入缓存,redo log buffer 之中。

redo log 事务提交时是否fsync,由参数innodb_flush_log_at_trx_commit控制:

  1. 为0的时候,不做任何操作。redo log还是在redo log buffer之中。
  2. 为1的时候,每次提交事务就把redo log buffer fsync到磁盘
  3. 为2的时候,只是把redo log 写到page cache

此外,innodb 后台线程会每隔1秒将 redo log buffer中的日志,写入文件系统的page cache,然后调用fsync持久化到磁盘。因此,一个还没提交的事务,其在redo log buffer中的redo log会被后台线程持久化。

还有两种情况,redo log buffer会持久化

  1. redo log buffer大小占用达到innodb_log_buffer_size 一半,后台线程主动写盘。事务没有提交,只是写道page cache
  2. 当设置innodb_flush_log_at_trx_commit, 其他事务提交了,顺带将redo log buffer中的提交了

组提交机制

redo log 是有序号的,(log sequence number, LSN), 组提交机制指的时, 序号大的事务提交后,可以保证小于等于这个需要的redo log 都持久化到磁盘了。

(trx1, trx2, trx3) 这一组事务,trx3 提交了,调用fsync可以将之前的都持久化到磁盘。

binlog 也可以通过参数设置组提交的效果

如果你想提升 binlog 组提交的效果,可以通过设置 binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count 来实现。

  1. binlog_group_commit_sync_delay 参数,表示延迟多少微秒后才调用 fsync;
  2. binlog_group_commit_sync_no_delay_count 参数,表示累积多少次以后才调用 fsync。

如果你的 MySQL 现在出现了性能瓶颈,而且瓶颈在 IO 上,可以通过哪些方法来提升性能呢?针对这个问题,可以考虑以下三种方法:

  1. 设置 binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count 参数,减少 binlog 的写盘次数。这个方法是基于“额外的故意等待”来实现的,因此可能会增加语句的响应时间,但没有丢失数据的风险。
  2. 将 sync_binlog 设置为大于 1 的值(比较常见是 100~1000)。这样做的风险是,主机掉电时会丢 binlog 日志。
  3. 将 innodb_flush_log_at_trx_commit 设置为 2。这样做的风险是,主机掉电的时候会丢数据

MySQL binlog和redolog的写入机制的更多相关文章

  1. 谈谈MySQL bin log的写入机制、以及线上的参数是如何配置的

    目录 一.binlog 的高速缓存 二.刷盘机制 三.推荐的策略 推荐阅读 问个问题吧!为什么你需要了解binlog的落盘机制呢? 我来回答一下: ​ 上一篇文章提到了生产环境中你可以使用binlog ...

  2. [转]mysql binlog in realtime

    原文:http://guweigang.com/blog/2013/11/18/mysql-binlog-in-realtime/ 众所周知,MySQL是最受欢迎的互联网数据库(没有之一)—————— ...

  3. Mysql binlog日志解析

    1. 摘要: Mysql日志抽取与解析正如名字所将的那样,分抽取和解析两个部分.这里Mysql日志主要是指binlog日志.二进制日志由配置文件的log-bin选项负责启用,Mysql服务器将在数据根 ...

  4. 一个分布式 MySQL Binlog 存储系统的架构设计

    1. kingbus简介 1.1 kingbus是什么? kingbus是一个基于raft强一致协议实现的分布式MySQL binlog 存储系统.它能够充当一个MySQL Slave从真正的Mast ...

  5. 20180705关于mysql binlog的解析方式

    来自:https://blog.csdn.net/u012985132/article/details/74964366/ 关系型数据库和Hadoop生态的沟通越来越密集,时效要求也越来越高.本篇就来 ...

  6. 基于 MySQL Binlog 的 Elasticsearch 数据同步实践 原

    一.背景 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数据可以 ...

  7. 怎么避免从删库到跑路 -- 详解 mysql binlog 的配置与使用

    1. 引言 使用数据库的时候,我们每个操作都十分小心,尤其是不能直接在数据库上执行 update.delete 等操作,否则万一忘记加全 where 条件,可能就会造成无法挽回的结果. 有一句十分流行 ...

  8. 基于MySQL Binlog的Elasticsearch数据同步实践

    一.为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数 ...

  9. java面试一日一题:binlog undolog redolog的区别

    问题:请讲下mysql中binlog.undolog.redolog三种日志的区别 分析:mysql中这三种日志很常见,也是面试中涉及比较多的方面,要理解清楚这三种日志的定位及区别: 回答要点: 主要 ...

  10. MySQL-技术专题-MySQL主从架构以及[半同步机制]模式大全

    MySQL的主从复制 一般在大规模的项目上,都是使用MySQL的复制功能来创建MySQL的主从集群的. 主要是可以通过为数据库服务器配置一个或多个备库的方式来进行数据同步. 复制的功能不仅有利于构建高 ...

随机推荐

  1. Moby 项目 - 开源容器化工具集

    项目标题与描述 Moby 是一个开源项目,由 Docker 创建,旨在推动和加速软件容器化.它提供了一套"乐高积木"式的工具组件.组装这些组件成为自定义容器系统的框架,以及供所有容 ...

  2. Blazor学习之旅(4)数据共享

    本篇,我们来了解下在Blazor中数据是如何共享的,组件之间又该如何传递参数. 关于Blazor组件 在 Blazor 中,从名为"组件"的自包含代码部分生成 UI.每个组件都可以 ...

  3. pdf工具类之根据页码复制(分割)pdf

    实现思路:将原pdf中第m页和第n页的内容复制到目标pdf中 代码如下: 1 /** 2 * 复制(分割)pdf 3 * 4 * @param sourceFilePath 源文件地址 5 * @pa ...

  4. MySQL快速安装

    1.下载地址(mysql5.7) https://downloads.mysql.com/archives/community/ 2.my.cnf 查看代码 #default-character-se ...

  5. 前端开发系列059-网络篇之网络基础知识和HTTP协议

    一.网络编程基本概念 1.1 客户端和服务器的基本概念 客户端(Client)能从服务器获取资源为客户提供服务的程序(设备). 服务器(Server)为客户端提供服务.提供数据.提供资源的机器. 说明 ...

  6. Genymotion虚拟机启动时get no IP address的解决方法汇总

    "Genymotion虚拟机启动时get no IP address"这个问题一直困扰了我很多天,我在网上也试了不少方法,今天终于成功打开了,太兴奋了. 鉴于网上各种方法比较分散, ...

  7. ES5与ES6学习

    ES5和ES6的区别 什么是ES5? ES5全称ECMAScript5,又称ECMAScript2009. 什么是ES6? ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的 ...

  8. Linux字符驱动开发-GPIO设备驱动模板(基于设备树及GPIO子系统)

    一..在设备树根节点添加节点信息 led{ compatible="myled"; status="okay"; default-state="on& ...

  9. Distributions: Chebyshev Inequality | Uniform | Cauchy | Normal/Gaussian

    https://www.britannica.com/science/probability-theory https://www.britannica.com/biography/David-Bla ...

  10. SciTech-EECS-一次完成“电子”和“机械”统一设计: 3D化PCB(电路板)设计 与 solidworks的3D化产品设计 完美结合

    Altium Designer做PCB设计. Altium Designer导出PCB设计为3D封装的设计文件. SolidWorks 导入Altium Designer导出的3D设计文件. Soli ...