---
title: 'TiDB 6.5 新特性解析丨解锁 TiDB + 数据仓库的新形态'
date: '2023-03-23T00:00:00+08:00'
status: publish
permalink: /blog/unlock-the-new-form-of-tidb-and-data-warehouse
author:
    - 骆融臻
    - 数据小黑
excerpt: '从 v6.5.0 开始，TiCDC 支持将行变更事件保存至存储服务，这给 TiDB + 数据仓库带来了更多可能。本文将结合生产中的实际需求和测试结果，分享 TiDB + 数据仓库共建的构想。'
type: post
id: 3217
category:
    - 产品技术解读
tag:
    - TiCDC
    - TiDB
post_format: []
profile:
    - 数据小黑
algolia_posts_post_records_count:
    - '5'
---
导读
--

从 v6.5.0 开始，TiCDC 支持将行变更事件保存至存储服务，这给 TiDB + 数据仓库带来了更多可能。本文由 TiDB 社区版主、数据架构师数据小黑撰写，结合生产中的实际需求和测试结果，分享了他对 TiDB + 数据仓库共建的构想。

背景
--

最近 TiDB V6.5.0 发版了，已经浸润在数据中多年，我对一个特性特别感兴趣：从 v6.5.0 开始，TiCDC 支持将行变更事件保存至存储服务，如 Amazon S3、Azure Blob Storage 和 NFS。

简言之，这个特性能够通过 TiCDC 这一个组件，就能保存 CDC 日志到对象存储中，这个特性满足了我对数据架构的一些想象，例如：

1. 数据链路足够短
2. 同步组件尽量少

结合这个特性，基于最近的一些实际需求和 POC 的成果，我想聊一聊与 TiDB 搭配的数据仓库应该是什么样的，是否能够有一个足够简单的架构，搭建一个适配大多数云的数据仓库。

何为数据仓库，何为数据库
------------

数据仓库，英文名称为 Data Warehouse，可简写为 DW 或 DWH。数据仓库，是为企业所有级别的决策制定过程，提供所有类型数据支持的战略集合。它是单个数据存储，出于分析性报告和决策支持目的而创建。为需要业务智能的企业，提供指导业务流程改进、监视时间、成本、质量以及控制。怎么理解上面这个解释，根据我们遇到的客户的诉求，数据仓库都是干这些事的：

1. 大型企业内有各种各样的内部系统，一般情况下，这些业务系统建设时间不同，建设厂商不同，甚至于底层数据产品都有较大差异。领导要看全局，看大数，看趋势，需要一个架构把数据整合起来，这个架构叫做数据仓库 
  2. 一个企业内的数据相对比较单一，企业通过各种渠道汇集了多种多样的数据放在一起进行分析，这时候需要一个架构来解决采集数据的存储、计算、服务等多种问题，这个架构叫做数据仓库

以上的需求整合的数据，在整合之前就可以被准确认知，知道整合的目的。

![数据仓库.png](https://img1.pingcap.com/prod/_40af7eb5ba.png)假如企业基于战略目的，先执行收集数据的动作，然后从收集的数据中挖掘价值，此时的架构应该叫做数据湖。

![数据湖.png](https://img1.pingcap.com/prod/_6ea086f044.png)本篇文章不纠结这两个概念，只是想讨论一个场景：

1. 业务应用的后端数据库是 TiDB
2. 有分析较久远历史数据的需求
3. 有接入第三方数据综合分析的需求
4. 硬件投资有限，需要合理的架构充分发挥硬件性能
5. 客户的部署环境不确定，需要适配大多数云

这是我们实际遇到的需求，我们也做了一些思考和 POC 测试。

TiDB 与数据仓库共建的必要性
----------------

对 TiDB 比较了解的人会知道 TiDB 有两个组件来解决 AP 侧的问题：

**TiFlash**

TiFlash 是 TiDB HTAP 形态的关键组件，它是 TiKV 的列存扩展，在提供了良好的隔离性的同时，也兼顾了强一致性。列存副本通过 Raft Learner 协议异步复制，但是在读取的时候通过 Raft 校对索引配合 MVCC 的方式获得 Snapshot Isolation 的一致性隔离级别。这个架构很好地解决了 HTAP 场景的隔离性以及列存同步的问题。

**TiSpark**

TiSpark 是 PingCAP 为解决用户复杂 OLAP 需求而推出的产品。它借助 Spark 平台，同时融合 TiKV 分布式集群的优势，和 TiDB 一起为用户一站式解决 HTAP (Hybrid Transactional/Analytical Processing) 的需求。TiFlash 和 TiSpark 都允许使用多个主机在 OLTP 数据上执行 OLAP 查询。TiFlash 是列式存储，这提供了更高效的分析查询。TiFlash 和 TiSpark 可以同时使用。

我们已经在多个场景下，组合使用了 TiFlash 和 TiSpark，在我们的应用场景下，数据流转如下图：

![TiFlash和 TiSpark 组合.png](https://img1.pingcap.com/prod/Ti_Flash_Ti_Spark_3b7b61d331.png)这个架构解决了我们的问题，但是有个小缺点，就是成本相对比较高。

1. 从数据同步链路上讲：数据在计算完成之后，需要经过 TiKV 写到 TiFlash，这样的做法不是太经济
2. 从硬件成本上讲：为了保证数据写入效率，TiKV 和 TiFlash 的硬件我们都给的比较好，因为各种因素影响，我们并没有在较差的硬件下测试，所以在较差硬件条件下效率差多少，我们没有实际数据，也没太有信心进行测试
3. 从架构设计上来讲：假如要接入第三方数据，完全没必要从 TiKV 走一遍，这些数据仅仅作为分析的需求，没有必要占用 TP 的资源

随着我们客户的发展，我们现在遇到一些问题：

1. 客户的分析需求爆发式增长，通常要求我们在有限的成本下，尽可能地提高效率
2. 数据的采集方式复杂多样，一不小心就对 TP 侧产生影响，我们加了消息队列做消峰处理

基于以上分析，单纯的使用 TiFlash、TiSpark 并不能完全贴合我们的诉求，基于我们多年的技术积累，我们架构了一套跟 TiDB 打通的数据仓库架构，具有低成本、多云适配的特性，下一节做一些分析，给大家参考。

打通 TiDB 与数据仓库的建构设想
------------------

先来看看现在通用的大数据架构：

![通用大数据架构.jpeg](https://img1.pingcap.com/prod/_08f18cbc67.jpeg)我们在设计数据架构的时候，因数据规模的原因采用了 hadoop 体系作为底座，理论上 TiDB 的数据可以直接接入这一套产品中。我们在推广项目的过程中发现了一些问题：

1. 客户投资不多，hadoop 的云产品太贵，客户没有采购，我们无法迁移
2. 客户投资充裕，被云厂商洗脑，只买了 hadoop serverless 版本，各厂商的 api 和 sql 规范都不一样，造成我们一个项目一套代码
3. 有一些项目前期数据规模并不大，客户对先期投入一套大数据产品十分不理解，我们基于这一套架构也做不到伸缩自由

基于以上原因，我们打算研究了一套替代 hadoop 的架构，对于一些主要环节我们做了一些决策：

1. 存储产品：基于 OSS 在云产品中的地位和性价比，存储采用 OSS
2. 计算环境：我们并不想投入人力管理计算资源的调度，采用事实标准 k8s 做资源的调度
3. api 形态：我们原来的计算流程需要编程，在这次架构设计中，我们打算提供 JDBC 接口，类似打造一个 serverless 的计算服务

我们设计的架构如下：

![替代 Hadoop 架构设想.jpeg](https://img1.pingcap.com/prod/Hadoop_c41a7ce4e0.jpeg)与前一个架构相比，我们没有部署任何组件，依托 k8s 实现了计算的调度和数据的访问，k8s 和对象存储也不需要我们管理维护，减掉我们大部分的运维工作。基于 k8s 和对象存储的通用性，我们这套架构在大部分云上都可以无缝迁移；运行时资源也具有较好的弹性，可以随着数据规模做资源规模的伸缩。这一套架构其实有点小缺点就是必须还要配套一个 kafka，我们把 TiDB 版本升级到 v6.5.0 之后，架构简化如下：

![简化后的架构.jpeg](https://img1.pingcap.com/prod/_f32c7451d0.jpeg)为什么我对存在 kafka 的数据链路叫做一个小缺点，而把直接写对象存储，更感兴趣，或者说 v6.5.0 这么多优秀特性，我却对这一点情有独钟。从长期的运维经验来看，我们有过一些不好的经验：

1. 从部署的角度来讲，多一个组件，就多一套部署脚本、多一分管理成本。在人员充足的项目，可能是一个不大的问题，但我们很多项目只有一到两个运维人员，从这个角度看，其实组件越少越好，因为他们精力有限，很多组件不会管理，或者说根本不知道有这么多组件存在，这就很尴尬。长此以往，一线说二线不好，二线说一线不行，团队氛围很不好，事情也干不好。
2. 从高可用的角度来讲，维护的环节越多，出错的可能性越大，可靠性越差。我们曾经在同步的源库和目标库之间设置了三个组件（具体原因不再详述），这样的设计有很高的数据吞吐能力，但是对于高频更新的表，总是感觉少数据。我们用 Otter+TiDB 的链路代替了原有链路之后，问题消失了。事后追查根本原因是我们的配置有问题，导致了同步过程中数据覆盖不全。组件越多，配置越多，即使在人员充足的情况下，也可能有疏漏。

所以，我目前的思路是同步链路越短、配置越简单，数据可靠性越高。

结语
--

综上所述，v6.5.0 发布了 TiCDC 支持将行变更事件保存至存储服务的特性，基于这个特性，同步链路的架构设计也有了改善。我们对上述架构做了很多 POC 测试，也将会在下一步实践中总结更多经验。希望我们的思考能够给大家更多启发。