doc: 阅读mysql BLGC文档

This commit is contained in:
asahi
2025-08-28 20:09:19 +08:00
parent 26ac8916bf
commit ced1d2db95

View File

@@ -636,7 +636,13 @@ binlog机制mysql上层的和存储引擎无关而redo log机制是和存
在slave机器上发生recovery时如果binlog存在空洞slave将会直接跳过空洞从而导致slave中事务缺失。
为了解决该问题innodb补充了`prepare_commit_mutex`当对事务进行prepare时该mutex将会被获取并且在事务commit时被释放。故而在多事务场景下一个事务`prepare-write-flush-commit`流程中不会插入其他操作binlog写入事务的顺序和innodb存储引擎中事务提交的顺序是一致的。
> `prepare_commit_mutex`会将执行`prepare-write-commit`操作的事务串行化由于将binlog写入到文件比较耗时故而引入prepare_commit_mutext会造成bin log写入较慢。
##### binary log group commit
为了在`保证事务写binlog顺序和innodb存储引擎提交顺序一致`的基础上提高性能,故而不应采用`prepare_commit_mutex`,而是采用了如下设计。
`binary log group commit`实现将commit过程拆分为了如下图所示的多个阶段
<img src="https://img-blog.csdn.net/20161222103803619?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhb2NoZW5zaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
@@ -651,7 +657,7 @@ leader可能会注册到一个非空queue中即leader可以决定成为一个
当leader进入到stage后会一次性将queue抓取并依次处理queue中排队的session。当queue被抓取后当leader在处理old queue时其余的session又可以被注册到stage。
- `Flush Stage` 在flush stage所有注册到queue的session都会将其cache写入到binlog中。
- `Flush Stage` 在flush stage所有注册到queue的session都会将其cache写入到binlog中。`实际将内容刷新到系统缓冲区中但并不实际调用fsyncfsync的调用发生在sync stage`
- `sync stage`在sync stage会根据`sync_binlog`的设置将binary log同步到磁盘中。如果`sync_binlog`值为1所有被flushed的session都会被同步到磁盘中
- `commit stage`在commit stage所有session将会按照其register的顺序在engine中进行提交该步骤由stage leader完成。由于在commit procedure中每个stage都保留了顺序那么binlog中写入事务的顺序和引擎中事务的提交顺序是一致的。
@@ -659,3 +665,9 @@ leader可能会注册到一个非空queue中即leader可以决定成为一个
由于leader注册到下一个stage时可能变为follower最慢的stage可能会积累最多的工作。通常情况下sync stage会积累最多的工作。但是向flush阶段填充尽可能多的事务是至关重要的flush stage会被单独处理。
在flush stageleader将会逐个扫描flush queue中的sessions扫描过程在满足下列任一条件时终止
- 当queue为空时leader将会立即进入下一阶段并且将所有sessions注册到sync stage中
- 如果`从第一个任务被unqueue起`已经超过时长限制`binlog_max_flush_queue_time`那么整个queue都会被抓取并且sessions的transaction cache都会被flushed处理流程和未超时场景下一致。之后leader再回进入到下一阶段。
> 通过将sessions在stage queue进行排队在write、sync、commit多个阶段都能进行group处理。这样能够提高多事务场景下的事务提交性能通过binary log group commit也能大大减少fsync的磁盘写入次数。