博客
关于我
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/

    你可能感兴趣的文章
    php7,从phpExcel升级到PhpSpreadsheet
    查看>>
    PHP8中match新语句的操作方法
    查看>>
    PHP:第一章——PHP中常量和预定义常量
    查看>>
    PHP:第一章——PHP中的位运算
    查看>>
    phpcms
    查看>>
    phpcms 2008 product.php pagesize参数代码注射漏洞
    查看>>
    phpcms V9 自定义添加 全局变量{DIY_PATH}方法
    查看>>
    Redis五种核心数据结构的基本使用与应用场景
    查看>>
    PHPCMS多文件上传和上传数量限制
    查看>>
    phpEnv的PHP集成环境
    查看>>
    PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/c...
    查看>>
    PHPMailer发送邮件
    查看>>
    phpmailer发送邮件,可以带附件
    查看>>
    phpmyadmin 安装
    查看>>
    phpmyadmin数据库建表及插入
    查看>>
    phprpc简单使用
    查看>>
    phpstorm中Xdebug的使用
    查看>>
    phpstorm配置php脚本执行
    查看>>
    phpStudy安装教程
    查看>>
    phpunit
    查看>>