淘宝对binlog group commit进行了进一步的优化,其原理如下:
从XA恢复的逻辑我们可以知道,只要保证InnoDB Prepare的redo日志在写Binlog前完成write/sync即可。因此我们对Group Commit的第一个stage的逻辑做了些许修改,大概描述如下:
?Step1. InnoDB Prepare,记录当前的LSN到thd中;?
?Step2. 进入Group Commit的flush stage;Leader搜集队列,同时算出队列中最大的LSN。?
?Step3. 将InnoDB的redo log write/fsync到指定的LSN? (注:这一步就是redo log的组写入。因为小于等于LSN的redo log被一次性写入到ib_logfile[0|1])
?Step4. 写Binlog并进行随后的工作(sync Binlog, InnoDB commit , etc)
也就是将 redo log的write/sync延迟到了 binlog group commit的 flush stage 之后,sync binlog之前。
通过延迟写redo log的方式,显式的为redo log做了一次组写入(redo log group write),并减少了(redo log) log_sys->mutex的竞争。
也就是将 binlog group commit 对应的redo log也进行了 group write. 这样binlog 和 redo log都进行了优化。
官方MySQL在5.7.6的代码中引入了淘宝的优化,对应的Release Note如下:
5. XA参数 innodb_support_xa