热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析TiDBBinlog:PumpStorage实现详解(上)

本文作者赵一霖,将继续探讨TiDBBinlog系统中PumpStorage的实现细节,包括其核心功能如持久化存储、数据排序及配对等。

作者:赵一霖

在前文中,我们详细讨论了 Pump Server 的启动流程、gRPC API 的实现、服务下线及相关辅助机制,期间多次提及 Pump Storage。本文将聚焦于 Pump Storage 的具体实现,其源代码主要位于 pump/storage 目录下。

Pump Storage 是由 Pump Server 调用的一个模块,主要职责是实现 binlog 的持久化存储,并支持数据的排序与配对。接下来,我们将从 Storage 接口入手,逐步解析 Pump Storage 的内部工作原理。

Storage 接口概述

Storage 接口定义了 Pump Storage 对外提供的主要操作方法,其中包括重要的 WriteBinlogGCPullCommitBinlog 方法。以下是 Storage 接口的定义:

type Storage interface { // 写入 binlog 数据到 Storage WriteBinlog(binlog *pb.Binlog) error // 清理 tso 小于指定 ts 的 binlog GC(ts int64) // 返回最近一次触发 GC 指定的 ts GetGCTS() int64 // 判断所有 P-binlog 是否都与 C-binlog 匹配 AllMatched() bool // 返回最大 CommitTS,在此 TS 之前的数据已完整可同步 MaxCommitTS() int64 // 根据指定 ts 获取 binlog GetBinlog(ts int64) (binlog *pb.Binlog, err error) // 按序拉取 commitTs 大于 last 的 binlog PullCommitBinlog(ctx context.Context, last int64) <-chan []byte // 安全关闭 Storage Close() error }

Append 持久化实现

Append 是基于文件系统的持久化实现,主要负责将 binlog 数据追加写入到 Valuelog 中。考虑到单条 binlog 可能非常大,为了提升性能,我们采用了 Key 和 Value 分离的设计策略,使用 goleveldb 存储 Key(binlog 的时间戳),并设计了专门用于存储 binlog 数据的 Valuelog 组件。

初始化过程

Append 的初始化逻辑在 NewAppendWithResolver 函数中实现,主要包括初始化 Valuelog、goleveldb 等组件,并启动多个 goroutine 以处理 binlog 写入、GC 和状态维护等工作。

WriteBinlog 方法解析

WriteBinlog 方法由 Pump Server 调用,用于将 binlog 数据写入本地持久化存储。在 Append 实现中,binlog 数据在编码后会被送入 Append.writeCh 通道,由专门的 goroutine 处理:

toKV := append.writeToValueLog(writeCh) go append.writeToSorter(append.writeToKV(toKV))

binlog 数据进入 Append.writeCh 后,将依次经过以下几个处理阶段:

  • ValueLog:主要由 writeToValueLog 函数实现,将 binlog 数据批量写入 ValueLog 组件中。ValueLog 是一种持久化的键值存储实现,具体将在后续文章中详细介绍。
  • Metadata:由 writeBatchToKV 函数实现,将 binlog 的时间戳作为 Key,valuePointer 作为 Value 批量写入 Metadata 存储中。当前 Pump 使用 goleveldb 作为 Metadata 存储数据库,其底层数据结构为 LSM-Tree,确保了 binlog 相关信息按时间戳自然排序。
  • Sorter:尽管 binlog 元数据在写入过程中已经排序,但仍需 writeToSorter 进行进一步处理。这是因为 TiDB 事务采用 2PC 算法,每个成功事务包含 Prewrite 和 Commit 两条 binlog;若事务失败,则会生成一条 Rollback binlog。为了准确还原事务,必须对 Prewrite 和 Commit binlog 进行配对。Sorter 负责读取 binlog 并进行配对,对于长时间未找到匹配项的 Prewrite binlog,Sorter 会查询 TiKV 以确认其状态。

PullCommitBinlog 方法解析

PullCommitBinlog 方法用于从客户端指定的时间戳开始拉取 Commit binlog。其实现较为直接,Append 会扫描 Metadata,仅关注 Commit binlog,并根据 StartTs 查找对应的 Prewrite binlog,从而确保拉取到的均为已提交的 binlog。

GC 机制分析

GC 机制是 Pump Storage 中不可或缺的部分,旨在定期清理不再需要的 binlog 数据,以释放存储空间。GC 的触发条件包括:binlog 已同步至下游或其时间戳距离当前时间已超过预设时间。GC 过程分为两个阶段:一是扫描并删除 Metadata 中的旧数据;二是根据删除的 KVS 数量触发 Valuelog 的 GC,最终表现为删除文件系统中的文件。

在实际应用中,为避免 GC 过程对系统性能造成负面影响,我们对 GC 进行了限速处理,例如通过监控 goleveldb 中 L0 文件的数量来决定是否暂停 GC。

总结

本文深入探讨了 Pump Storage 的初始化过程及其核心功能的实现,希望对读者理解 TiDB Binlog 系统有所帮助。下一篇文章将重点介绍 Valuelog 和 SlowChaser 等辅助机制。


推荐阅读
  • 本文详细探讨了如何在 SparkSQL 中创建 DataFrame,涵盖了从基本概念到具体实践的各种方法。作为持续学习的一部分,本文将持续更新以提供最新信息。 ... [详细]
  • 本文提供了一套实用的方法论,旨在帮助开发者构建能够应对高并发请求且易于扩展的Web服务。内容涵盖了服务器架构、数据库管理、缓存策略以及异步处理等多个方面。 ... [详细]
  • 58同城的Elasticsearch应用与平台构建实践
    本文由58同城高级架构师于伯伟分享,由陈树昌编辑整理,内容源自DataFunTalk。文章探讨了Elasticsearch作为分布式搜索和分析引擎的应用,特别是在58同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
  • 在Ubuntu 16.04中使用Anaconda安装TensorFlow
    本文详细介绍了如何在Ubuntu 16.04系统上通过Anaconda环境管理工具安装TensorFlow。首先,需要下载并安装Anaconda,然后配置环境变量以确保系统能够识别Anaconda命令。接着,创建一个特定的Python环境用于安装TensorFlow,并通过指定的镜像源加速安装过程。最后,通过一个简单的线性回归示例验证TensorFlow的安装是否成功。 ... [详细]
  • .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
    .NETCore中的一个接口多种实现的依赖注入与动态选择看这篇就够了最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的 ... [详细]
  • 车载T-BOX智能网联终端的设计与实现
    本文介绍了一款基于瑞萨RH850微控制器、TICC2640R2F蓝牙微控制器和高通MDM9628处理器的T-BOX车载终端的设计。该终端通过集成CAN总线、GPS定位、数据加密、蓝牙通信和LTE无线数据传输技术,实现了车辆信息的高效采集与云端通信,支持远程车辆控制和诊断等功能。 ... [详细]
  • Elasticsearch排序机制详解
    本文深入探讨了Elasticsearch中的排序功能,包括相关性排序、字段值排序、多级排序及字符串和多值字段的排序策略,旨在帮助读者更好地理解和优化搜索结果。 ... [详细]
  • Working with Errors in Go 1.13
    作者|陌无崖 ... [详细]
  • 本文详细介绍了如何通过微信H5网页授权机制获取用户的code,并进一步获取用户的基本信息,包括必要的配置步骤和前端代码实现。 ... [详细]
  • Java集合框架源码解读(1)——ArrayList、LinkedList和Vector
    java.util.List接口是JavaCollectionsFramework的一个重要组成部分,List接口的架构图如下:本文将通过剖析List接 ... [详细]
  • 本文详细介绍了一种利用局域网环境将本地SQL Server数据库备份至另一台计算机的方法。主要步骤包括在目标机器上设置共享文件夹、配置SQL Server以支持备份任务,并通过定时任务实现自动化备份。 ... [详细]
  • 初探K近邻算法与Scikit-learn API
    本文介绍了Scikit-learn这一强大的机器学习库,重点探讨了其最新稳定版本及其安装方法,并通过一个简单的K近邻算法实例展示了如何使用Scikit-learn进行模型训练和预测。 ... [详细]
  • 解读 DevOps:开发与运维的融合之道
    近年来,随着信息技术的快速发展,DevOps作为一种新的IT管理理念逐渐受到重视。本文将探讨DevOps的核心概念及其对现代企业的重要意义。 ... [详细]
  • 本文详细探讨了虚拟化的基本概念,包括服务器虚拟化、网络虚拟化及其在云计算环境中的应用。特别强调了SDN技术在网络虚拟化和云计算中的关键作用,以及网络虚拟化技术如何提升资源利用效率和管理灵活性。 ... [详细]
  • 智能全栈云风暴:AI引领的企业转型之路
    当提及AI,人们脑海中常浮现的是天才少年独自编写算法,瞬间点亮机器人的双眼。然而,真正的AI革命正由大型企业和机构推动,它们利用全栈全场景AI技术,实现数字化与智能化的深度转型。 ... [详细]
author-avatar
Jessica_猪猪到_697
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有