doc: 阅读mysql 2pc实现
This commit is contained in:
@@ -592,3 +592,29 @@ group commit通常用于提高事务处理系统的性能。group commit将多
|
||||
|
||||
##### group commit机制
|
||||
group commit允许多个事务合并为一次提交,而不是每个事务单独提交。该方案会减少磁盘的io操作,提高整体吞吐量。在高并发场景下,相比于每个事务单独提交,group commit机制能够显著提高性能。
|
||||
|
||||
##### `binlog_order_commits`
|
||||
`binlog_order_commits`为global variables,并且无需停止server的运行就能对该变量进行设置。
|
||||
|
||||
如果该变量的值为`off(0)`,则代表事务可以被并行提交。在部分场景下,其能够带来性能的提升。
|
||||
|
||||
##### `binlog_max_flush_queue_time = microseconds`
|
||||
|
||||
##### binlog details
|
||||
当server在执行事务时,会收集事务造成的修改,并将其存放到`per-connection`的`transaction cache`中。如果使用了statement-based replication,那么statement将会被写入到transaction cache中;如果使用了row-based replication,那么row changes将会被写入到transaction cache中。一旦事务提交,transaction cache将会作为一个single block被写入到binary log中。
|
||||
|
||||
上述的binlog写入流程能够令每个session都独立的执行(每个connection都有其独立的transaction cache),并且仅需在写入transaction data到binary log时加锁即可。由于事务之间是相互隔离的,故而在提交时对事务进行序列化即可。
|
||||
|
||||
##### sync the storage engine and binary log
|
||||
binlog机制mysql上层的,和存储引擎无关,而redo log机制是和存储引擎绑定的。为了对存储引擎和binlog进行同步,server使用了2PC协议(tow-phase commit protocol)。
|
||||
|
||||
<img src="https://img-blog.csdn.net/20161222103535710?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhb2NoZW5zaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
|
||||
|
||||
如上图所示,使用2pc提交协议是为了能够保证`要么事务同时位于engine和binlog中,要么事务都不位于engine和binlog中`。故而,不应该出现`事务位于binlog却不位于engine中,或事务出现在engine中却不出现在binlog中`的场景,即使server在prepare后发生崩溃并后续恢复。
|
||||
|
||||
通过两阶段提交,可以实现上述需要求,一旦事务在engine中prepare,其可以被完全提交或完全回滚(即engine和binlog全部提交或全部回滚),即使prepare后server发生崩溃并后续恢复。在recovery阶段,存储引擎能够提供所有prepared但是尚未提交的事务,并且之后:
|
||||
- 如果事务可以在binlog被找到,那么事务将会被提交
|
||||
- 如果事务在binlog中找不到,那么事务将会被回滚
|
||||
|
||||
但是,上述实现需要确保`事务在engine中提交前binlog必须先被持久化`。故而,在上图中在调用`write`写入binlog后,还需要确保调用`fsync`来令binlog内容被刷新到磁盘文件中。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user