本文档由 2024年 TiDB 社区互助升级导师共建
TiFlash 介绍&作用
TiFlash 是 TiDB 体系中的一个关键组件,主要用于增强 TiDB 在 HTAP(混合事务/分析处理)场景下的性能。以下是对 TiFlash 的介绍以及它对用户的价值和作用的概述:
TiFlash 简介
- 分析引擎:TiFlash 作为 TiDB 的分析引擎,是 HTAP 形态的核心部分,提供了对大规模数据集进行快速实时分析的能力。
- 列式存储:它采用列式存储结构,与 ClickHouse 高效的向量化计算引擎相结合,针对 OLAP(在线分析处理)查询进行了优化。
- 异步复制:TiFlash 通过 Raft Learner 协议实现数据的异步复制,确保了数据的强一致性,同时保持了与 TiKV 的隔离性。
- 智能选择:TiDB 可以根据查询需求,智能地选择使用 TiFlash 列存或 TiKV 行存,甚至在单个查询中混合使用以提供最佳性能。
- 计算加速:TiFlash 可以分担 TiDB 的计算压力,通过列存的高读取效率和下推计算,提高数据库整体性能。
用户价值和作用
- 性能提升:TiFlash 显著提高了对 OLAP 查询的处理速度,使得用户能够更快地得到查询结果,尤其在处理大数据量的分析时效果显著。
- 简化架构:用户可以在 TiDB 集群中直接使用 TiFlash,无需额外部署和维护单独的分析型数据库,简化了数据架构。
- 实时性:TiFlash 保证了数据的实时更新和快照隔离级别的读取,使得用户可以获取到最新的数据状态,对于需要实时数据分析的应用场景非常有价值。
- 易用性:TiFlash 支持表粒度的数据同步,用户可以根据需要同步特定表的数据,且 TiDB 可以智能地选择存储引擎,提高了易用性。
- 扩展性:TiFlash 的引入并没有改变 TiDB 的分布式和可扩展特性,用户可以根据需求灵活地扩展 TiFlash 节点。
综上所述,TiFlash 为使用 TiDB 的用户提供了一个强大的分析型存储引擎,它通过列式存储和智能计算下推,极大地提升了处理 OLAP 查询的性能,同时保持了数据的强一致性和实时性,为用户提供了一个高效、简化且易于使用的 HTAP 数据库解决方案。
更多文档:TiFlash 部署拓扑、配置 TiDB 集群、创建 TiFlash 副本、TiFlash 集群监控、TiFlash 诊断数据、水平扩容 TiFlash、在线修改 TiFlash 配置
TiFlash 上线前准备
TiFlash 是 TiDB 系统中用于增强 OLAP(在线分析处理)性能的关键组件,它通过列式存储和向量化计算来提高数据处理效率。在将 TiFlash 组件上线前,需要进行一系列的准备工作以确保其稳定运行并满足业务需求。以下是 TiFlash 上线前的一些准备步骤:
- 环境检查:确保你的 TiDB 集群满足 TiFlash 的资源要求,包括硬件资源、操作系统和网络配置。
-
版本兼容性:确认你的 TiDB 版本与 TiFlash 版本是一致。
-
集群规划:根据业务需求规划 TiFlash 节点的数量和配置。TiFlash 推荐与 TiKV 节点分开部署以实现 Workload 隔离,但也可以在没有业务隔离需求的情况下与 TiKV 同节点部署。
-
数据同步:TiFlash 不支持直接写入数据,数据必须先写入 TiKV,然后同步到 TiFlash。因此,需要配置数据同步策略,包括确定哪些表需要同步以及同步的粒度。可通过 MySQL 客户端向 TiDB 发送 DDL 命令来为特定的表建立 TiFlash 副本。
开启列存副本
ALTER TABLE '<db_name>'.'<table_name>' SET TiFlash REPLICA <count>;
count 表示副本数,副本数一般小于等于 TiFlash 实例数;0 表示删除。
查看同步进度
SELECT * FROM information_schema.TiFlash_replica WHERE TABLE_SCHEMA = '<db_name>' and TABLE_NAME = '<table_name>';
-
集群部署:如果全新部署包含 TiFlash 节点的集群,可以参考官方文档中的部署指南。若在现有集群中新增 TiFlash 节点,也需遵循相应的添加步骤。
-
配置参数:根据工作负载和性能测试结果,调整 TiFlash 的配置参数,如并发数、内存限制等,以优化性能。
-
监控与日志:配置监控系统以跟踪 TiFlash 的性能和状态,并确保日志系统能够捕获关键信息,便于后续的问题排查和性能调优。
-
测试验证:在正式环境之外,进行充分的测试,包括性能测试、故障恢复测试和业务逻辑测试,确保 TiFlash 能够满足业务需求并且稳定运行。
-
文档与培训:准备相关的技术文档,并对运维人员进行必要的培训,确保他们了解 TiFlash 的工作原理和运维操作。
-
备份与恢复:制定备份和恢复策略,确保在出现故障时可以快速恢复服务。在 TiDB 集群进行备份时,会自动备份 TiFlash 副本相关的元数据。
-
安全设置:确保 TiFlash 节点的安全性,包括网络隔离、认证授权和数据加密等。
-
性能调优:根据测试结果和业务场景,对 TiFlash 进行性能调优,包括调整 MPP 架构中的相关参数。
- 支持分区表动态裁剪
- 测试是否需要打开
tidb_opt_agg_push_down
将聚合函数下推到 Join,Projection 和 UnionAll 之前 - 测试是否需要打开 Runtime Filter 以提升 join 的执行效率
-
问题排查准备:了解可能出现的问题和相应的排查方法,比如通过特定的 API 接口来辅助排查。
查看sql执行计划判断是否使用了TiFlash引擎
explain analyze your_sql
TiDB 社区用户 TiFlash 实践文章
-
源码解读:
- 专栏 - TiFlash 源码阅读(一) TiFlash 存储层概览 | TiDB 社区
- 专栏 - TiFlash 源码阅读(二)计算层概览 | TiDB 社区
- 专栏 - TiFlash 源码阅读(三) DeltaTree 存储引擎设计及实现分析 - Part 1 | TiDB 社区
- 专栏 - TiFlash 源码解读(四) | TiFlash DDL 模块设计及实现分析 | TiDB 社区
- 专栏 - TiFlash 源码阅读(五) DeltaTree 存储引擎设计及实现分析 - Part 2 | TiDB 社区
- 专栏 - TiFlash 源码阅读(六) DeltaTree Index 的设计和实现分析 | TiDB 社区
- 专栏 - TiFlash 源码阅读(七)TiFlash Proxy 模块 | TiDB 社区
- 专栏 - TiFlash 源码阅读(八)TiFlash 表达式的实现与设计 | TiDB 社区
- 专栏 - TiFlash 源码阅读(九)TiFlash 中常用算子的设计与实现 | TiDB 社区
TiFlash FAQ
-
Q: TiFlash 可以在哪些操作系统上运行?
- A: TiFlash 主要设计用于运行在 Linux 操作系统上,具体支持的版本需要与 TiDB 的兼容性相匹配(需要和 TiDB 同一个版本)。
-
Q: 如何确认 TiFlash 已经成功安装?
- A: 确认 TiFlash 节点是否成功注册到 Placement Driver (PD) 是一个常用的验证方法。可以使用 PD Control 工具(
pd-ctl
)来检查 TiFlash 实例的状态。
- A: 确认 TiFlash 节点是否成功注册到 Placement Driver (PD) 是一个常用的验证方法。可以使用 PD Control 工具(
-
Q: TiFlash 支持表粒度的数据同步意味着什么?
- A: 这意味着可以为单个表而不是整个数据库创建 TiFlash 副本,从而实现更精细的同步控制。
-
Q: TiFlash 部署后会自动同步数据吗?
- A: 不会,TiFlash 需要手动指定需要同步的表。
-
Q: 如果 TiFlash 副本始终显示为不可用,应如何排查问题?
- A: 首先,检查 PD 的 Placement Rules 是否已开启。然后,通过 TiFlash-Summary 监控面板检查 TiFlash 进程的 UpTime。接着,使用
pd-ctl
查看 TiFlash proxy 状态,并检查副本数配置是否小于等于集群中的 TiKV 节点数。
- A: 首先,检查 PD 的 Placement Rules 是否已开启。然后,通过 TiFlash-Summary 监控面板检查 TiFlash 进程的 UpTime。接着,使用
-
Q: 如何处理 TiFlash 节点磁盘空间不足的问题?
- A: 可以通过扩容 TiFlash 节点来让 PD 将数据调度到新的 TiFlash 节点上。同时,应调整
reserve-space
配置以避免未来空间不足的问题。
- A: 可以通过扩容 TiFlash 节点来让 PD 将数据调度到新的 TiFlash 节点上。同时,应调整
-
Q: 如果发现 TiFlash 数据不同步,应采取哪些步骤?
- A: 首先,确认
ALTER table <tbl_name> set TiFlash replica <num>
操作是否执行成功。然后,检查集群中是否最少有 3 个 tikv 节点,检查 PD placement-rule 同步规则是否设置,检查 TiFlash 进程状态和 Region 同步进度。如果同步异常,查看tidb.log
和 TiFlash.log 获取更多信息。
- A: 首先,确认
-
Q: TiFlash 查询时间不稳定且日志中出现大量 Lock Exception 是怎么回事?
- A: 这通常是由于集群中存在大量写入操作,导致 TiFlash 查询时频繁遇到锁。可以通过设置查询时间戳为稍早的时间来减少锁冲突。
-
Q: 发现 TiFlash 数据文件损坏,应该如何处理?
- A: 首先下线损坏的 TiFlash 节点,然后清除该节点的数据文件,并重新部署该节点。
-
Q: TiFlash 分析慢可能由哪些因素引起?
- A: 如果 SQL 语句中的某些算子或函数不被 MPP 模式支持,TiDB 将不会选择 MPP 模式,这可能导致分析性能下降。使用
EXPLAIN
语句可以检查 SQL 中是否含有这些不被支持的元素。
- A: 如果 SQL 语句中的某些算子或函数不被 MPP 模式支持,TiDB 将不会选择 MPP 模式,这可能导致分析性能下降。使用
-
Q: TiFlash 支持哪些计算下推?
- A: TiFlash 支持多种计算下推,包括聚合、排序和谓词下推等,具体支持的下推计算可以参考官方文档 TiFlash 支持的计算下推。
-
Q: 如何对 TiFlash 进行性能调优?
- A: 性能调优通常涉及对 TiFlash 配置参数的调整,如设置 tidb_allow_mpp 通过 MPP 协议在 TiFlash 执行计算、设置 tidb_opt_agg_push_down 允许聚合函数下推到 到 Join,Projection 和 UnionAll 之前、打开 Runtime Filter 特性。推荐相关参数 session 级别修改。例如:jdbc 配置 session variable 超时参数
-
Q: 如何使用 TiDB 读取 TiFlash 副本?
- A: TiDB 提供了智能选择、Engine 隔离和手工 Hint 三种方式来读取 TiFlash 副本。智能选择依赖于成本优化器(CBO)自动选择最佳副本,Engine 隔离通过配置变量强制使用特定 engine 的副本,而手工 Hint 允许在查询中指定特定的副本。
-
Q: TiFlash 的核心组件包括哪些?
- A: TiFlash 的核心组件包括存储引擎本身和处理 Multi-Raft 协议通信的 TiFlash proxy。
-
Q: TiFlash 的核心特性有哪些?
- A: TiFlash 的核心特性包括异步复制、一致性保证、智能选择和计算加速。
-
Q: TiFlash 异步复制的工作原理是怎样的?
- A: TiFlash 使用 Raft Learner 协议以异步方式复制数据。这种方式允许在 TiFlash 节点宕机或网络延迟的情况下,TiKV 业务依然能够继续运行。
-
Q: 如何保证 TiFlash 数据的一致性?
- A: TiFlash 通过复制进度校验来保证一致性,每次读取请求时,TiFlash 中的 Region 副本会向 Leader 副本发起校对,确保读取的数据至少包含请求时间戳所覆盖的数据。
-
Q: TiFlash 在计算加速方面有哪些优势?
- A: TiFlash 的计算加速包括列存本身的高读取效率,以及能够分担 TiDB 的计算负载,通过下推计算到存储层来提高性能。
-
Q: 如何扩容 TiFlash 节点?
- A: 扩容 TiFlash 节点通常涉及添加新的节点到集群并配置数据同步,具体步骤可以参考官方的扩容指南。
-
Q: TiFlash 的配置参数有哪些重要的?
- A: TiFlash 的配置参数包括但不限于 profiles.default.max_memory_usage_for_all_queries、 storage.reserve-space 等,这些参数可以根据具体的工作负载和性能需求进行调整。
-
Q: TiFlash 的监控说明在哪里可以找到?
- A: 官方文档提供了 TiFlash 监控的详细说明,包括如何使用 Grafana 面板监控 TiFlash 的性能和状态。
-
Q: TiFlash 的报警规则应如何设置?
- A: 可以根据 TiFlash 的关键性能指标(KPIs)设置报警规则,以便于在性能下降或出现其他问题时及时得到通知。
-
Q: TiFlash 的兼容性说明在哪里可以找到?
- A: 官方文档提供了 TiFlash 与不同版本 TiDB 的兼容性说明,以帮助用户选择合适的版本进行部署。
-
Q: TiFlash 是否支持直接写入数据?
- A: 目前,TiFlash 不支持直接写入数据。所有数据必须先写入 TiKV,然后通过数据同步操作同步到 TiFlash。
-
Q: TiFlash 推荐与 TiKV 节点分开部署吗?
- A: 是的,为了实现 Workload 隔离并优化性能,推荐将 TiFlash 与 TiKV 分开部署。但在某些情况下,如果业务隔离需求不高,也可以与 TiKV 同节点部署。
-
Q: TiFlash 节点宕机时,如何保证 TiKV 业务正常进行?
- A: 由于 TiFlash 使用 Raft Learner 协议进行异步复制,即使 TiFlash 节点宕机,TiKV 上执行的业务仍能正常进行,因为数据已经在 TiKV 中持久化。
-
Q: TiFlash 在 HTAP 架构中扮演什么角色?
- A: 在 HTAP(混合事务/分析处理)架构中,TiFlash 作为分析引擎,提供列式存储和高效的 OLAP 计算能力,同时保持与 TiKV 的强一致性。
-
Q: TiFlash 的 GitHub 仓库在哪里?
- A: TiFlash 的 GitHub 仓库地址是 https://github.com/pingcap/tifalsh,这里是获取 TiFlash 源代码和相关开发文档的地方。
-
Q: 如何有效隔离一套集群中的TP&AP SQL
-
当 TP&AP SQL 耦合性不强,不属于同一业务模块的情况下,推荐使用不同的 TiDB-server 来读取不同的存储引擎。
- 以 6 个 tidb-server 举例, 可以按照以下方式配置
- 4 个 TiDB-server 设置 tidb_isolation_read_engines = 'tidb,tikv' 适用于 TP 业务。
- 2 个 TiDB-server设置 tidb_isolation_read_engines = 'tidb,tikv' 适用于 AP 业务。
-
当 TP&AP SQL 耦合性较强时, 在 v7.5以上的版本可以使用 SQL 级别 hint SET_VAR 来指定 tidb_isolation_read_engines 参数 ,详见https://docs.pingcap.com/zh/tidb/stable/optimizer-hints#set_varvar_namevar_value
-