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