博客
关于我
TiDB Binlog 源码阅读系列文章(六)Pump Storage 介绍(下)
阅读量:643 次
发布时间:2019-03-13

本文共 1896 字,大约阅读时间需要 6 分钟。

valueLog 组件

valueLog 是 Pump Storage 中一个关键组件,负责将 Binlog 事件持久化存储到磁盘上的 logFile 文件。其核心功能包括定位 Binlog 事件、管理 logFile 文件以及优化磁盘存储结构。值得注意的是,valueLog 中的每条 Binlog 记录都由唯一的 StartTs 和 CommitTs 作为键值存储,而 value 则是一个指针,指向 valueLog 中的具体 Binlog 记录。

valueLog 的结构体定义如下:

type valueLog struct {	buf *bytes.Buffer // 用于写入当前 log 文件的缓冲区	dirPath   string	// log 文件所在的数据目录	sync      bool	// 是否同步到磁盘	maxFid    uint32	// log 文件中的最大 Fid	// filesLock sync.RWMutex	// 用于保护文件 map 的同步锁	// filesMap map[uint32]*logFile	// 存储所有 Fid 对应的 logFile 对象	// opt *Options	// 应用配置}

logFile 文件在 Pump 数据目录下以特定命名保存,例如 "000001.log",其中 "000001" 即为 log 文件编号的 Fid。valueLog 组件通过 maxFid 确定当前最大的 Fid,并仅将 Binlog 写入该 Fid 对应的 logFile。filesMap 用于存储所有 Fid 的映射关系。

valueLog 的主要功能包括:

  • 定位 Binlog 事件:通过 StartTs 和 CommitTs 作为键值快速定位对应的 Binlog 记录。
  • 持久化存储:将 Binlog 事件编码后写入 logFile 文件。
  • 文件管理:定期扫描 logFile 文件,维护其映射关系,优化磁盘存储结构。
  • 值得注意的是,valueLog 在关闭时会检查 logFile 是否已完成写入。如果 logFile 已有 footer(文件尾部标志),则直接关闭;否则,会扫描 logFile 内存中的所有 Binlog 事件,更新 maxTS,并在文件尾部添加 footer,以便下次启动时快速定位 Binlog 记录。

    slowChaser 组件

    slowChaser 是 Pump Storage 用于应对 GoLevelDB 写入缓慢或暂停的情况的优化组件。它通过定期扫描磁盘上的 logFile 文件,读取未写入KV存储的 Binlog 事件,并将其写入 GoLevelDB,以避免影响 Pump Storage 的整体性能。

    slowChaser 的主要功能包括:

  • 初始化与启动:在 Pump 收到 Binlog 事件后启动,监控 KV 写入速度。
  • 定期扫描:从指定的 valuePointer 开始,逐次读取 logFile 中的 Binlog 事件,写入 KV 存储。
  • 优化机制:通过定期检查和关闭,确保在 KV 写入恢复正常后及时停止扫描,以免影响性能。
  • slowChaser 的运行机制较为复杂。它会在以下场景下启动:

    • 当 GoLevelDB 因 compaction 操作导致写入变慢或暂停时。
    • 当 Pump 服务器接收到大量 Binlog 事件,导致 KV channel 被填满。

    在运行过程中,slowChaser 会通过定期检查确认 KV 写入是否恢复正常。如果确认后,会关闭当前轮次的扫描操作。如果 KV 写入速度未能恢复,slowChaser 会继续进行下一轮扫描。

    值得注意的是,slowChaser 的扫描操作会增加磁盘读取和 KV 写入的开销,因此其使用应谨慎,仅在必要时启动,以避免对整体性能造成负面影响。

    小结

    本文详细介绍了 Pump Storage 中的两个关键组件:valueLog 和 slowChaser。valueLog 负责将 Binlog 事件持久化存储到磁盘,优化文件管理和定位机制;slowChaser 则用于应对 KV 存储的性能瓶颈,通过定期扫描和写入优化系统性能。理解这两个组件的工作原理,对于掌握 TiDB 的 Pump 部分源码具有重要意义。

    在下一篇文章中,我们将深入介绍 Drainer Server 模块,阐述其启动机制、状态维护以及全局 Binlog 数据管理方法,为进一步理解 TiDB 的 Binlog 处理系统奠定基础。

    转载地址:http://hbkoz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现base64加密和base64解密算法(附完整源码)
    查看>>
    Objective-C实现base85 编码算法(附完整源码)
    查看>>
    Objective-C实现basic graphs基本图算法(附完整源码)
    查看>>
    Objective-C实现BCC校验计算(附完整源码)
    查看>>
    Objective-C实现bead sort珠排序算法(附完整源码)
    查看>>
    Objective-C实现BeadSort珠排序算法(附完整源码)
    查看>>
    Objective-C实现bellman-ford贝尔曼-福特算法(附完整源码)
    查看>>
    Objective-C实现bellman-ford贝尔曼-福特算法(附完整源码)
    查看>>
    Objective-C实现BellmanFord贝尔曼-福特算法(附完整源码)
    查看>>
    Objective-C实现BF算法 (附完整源码)
    查看>>
    Objective-C实现binary exponentiation二进制幂运算算法(附完整源码)
    查看>>
    Objective-C实现binomial coefficient二项式系数算法(附完整源码)
    查看>>
    Objective-C实现check strong password检查密码强度算法(附完整源码)
    查看>>
    Objective-C实现disjoint set不相交集算法(附完整源码)
    查看>>
    Objective-C实现DNF排序算法(附完整源码)
    查看>>
    Objective-C实现double factorial recursive双阶乘递归算法(附完整源码)
    查看>>
    Objective-C实现double hash双哈希算法(附完整源码)
    查看>>
    Objective-C实现double linear search recursion双线性搜索递归算法(附完整源码)
    查看>>
    Objective-C实现DoublyLinkedList双链表的算法(附完整源码)
    查看>>
    Objective-C实现DPLL(davisb putnamb logemannb loveland)算法(附完整源码)
    查看>>