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

    你可能感兴趣的文章
    POSIX thread编程中关于临界区内条件变量的分析
    查看>>
    POSIX与程序可移植性
    查看>>
    posix多线程有感--自旋锁
    查看>>
    SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)
    查看>>
    POSIX标准和XSI扩展
    查看>>
    post install error,please remove node_moules before retry
    查看>>
    PostGIS中获取所有EPSG的编码以及对应Proj4字符串
    查看>>
    PostGIS在Windows上的下载与安装
    查看>>
    postgis数据库优化_postgresql 性能优化
    查看>>
    Postgres Docker版本安装mysql_fdw 插件
    查看>>
    Postgres invalid command \N数据恢复处理
    查看>>
    Postgres like 模糊查询匹配集合
    查看>>
    Postgres 自定义函数内实现 in 操作符的递归查询
    查看>>
    Postgres 返回当前时间前后指定天数的集合
    查看>>
    postgres--vacuum
    查看>>
    postgres--wal
    查看>>
    postgres--流复制
    查看>>
    postgres10配置huge_pages
    查看>>
    PostgreSQL 10.0 preview 变化 - pg_xlog,pg_clog,pg_log目录更名为pg_wal,pg_xact,log
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 15章 并行查询_15.2. 何时会用到并行查询?...
    查看>>