binlog的写入机制

4 分钟阅读 431 字 + 513 词
其实,binlog 的写入逻辑比较简单:
事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中。
一个事务的 binlog 是不能被拆开的,因此不论这个事务多大,也要确保一次性写入。
这就涉及到了 binlog cache 的保存问题。 系统给 binlog cache 分配了一片内存,每个线程一个 ,参数 binlog_cache_size 用于控制单个线程内 binlog cache 所占内存的大小。如果超过了这个参数规定的大小,就要暂存到磁盘。
每个线程有自己 binlog cache,但是共用同一份 binlog 文件。
img
图中的 write,指的就是指把日志写入到 文件系统的 page cache ,并 没有把数据持久化到磁盘 ,所以速度比较快。
图中的 fsync,才是将 数据持久化到磁盘的操作 。一般情况下,我们认为 fsync 才占磁盘的 IOPS。
write 和 fsync 的时机,是由参数 sync_binlog 控制的:
  • sync_binlog= 0 的时候,表示每次提交事务都 只 write,不 fsync (此时内容写在了 page cache中 ),由 操作系统决定何时将数据持久化到磁盘
  • sync_binlog=1 的时候,表示每次提交事务 都会执行 fsync
  • sync_binlog=N(N>1) 的时候,表示每次提交事务都 write(数据内容在page cache中),但 累积 N 个事务后才 fsync
img
把“写 binlog”当成一个动作。
但实际上,写 binlog 是分成两步的:
  • 先把 binlog 从 binlog cache 中写到磁盘上的 binlog 文件;
  • 调用 fsync 持久化。
这么一来, binlog 也可以组提交了 。在执行图 5 中第 4 步把 binlog fsync 到磁盘时,如果有多个事务的 binlog 已经写完了,也是一起持久化的,这样也可以减少 IOPS 的消耗。

目录