鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

原理描述

Binlog优化主要从Binlog预分配、Binlog拆锁优化和Binlog writeset_history数据结构优化三个部分进行优化来提高系统性能。

Binlog预分配

事务组提交时,leader线程在FLUSH阶段调用write函数对binlog进行提交,然后再在SYNC阶段调用fdatasync函数强制把binlog刷到硬盘。Binlog日志文件的动态增长会带来额外的元数据开销(如Binlog文件元数据的更新等)。通过在Binlog文件创建时将其大小预分配为max_binlog_size(最大文件大小),可避免写入过程中因文件动态增长所引入的元数据操作,从而降低I/O开销并提高系统性能。

Binlog拆锁优化

在事务组提交过程中,处于FLUSH/SYNC/COMMIT阶段的所有follower会共享同一把锁和条件变量(m_lock_done, m_cond_done)。当处于COMMIT阶段的leader线程提交事务成功时,leader线程会调用pthread_cond_broadcast将处于FLUSH/SYNC/COMMIT阶段的所有follower都唤醒,对于FLUSH和SYNC阶段的follower会重新调用pthread_cond_wait陷入等待。过多的误唤醒会增加pthread_cond_wait/pthread_cond_broadcast函数的系统调用开销,加剧锁的冲突。针对该热点,通过锁拆分,让处于不同阶段的follower等待不同的锁,降低不同组之间误唤醒的可能。

Binlog writeset_history数据结构优化

事务组提交时在FLUSH阶段的leader线程会调用Writeset_trx_dependency_tracker::get_dependency获取事务的依赖关系,其中不同事务的sequence_number信息保存在m_writeset_history变量中,此变量使用的数据结构为std::map。std::map使用红黑树的形式存储元素,其插入和查找的时间复杂度为O(log N),因此可以使用hash map数据结构进行替换,将插入和查找的时间复杂度降为O(1),以提高效率。