【TiDB 社区升级互助材料】TiFlash 最佳实践&上线前准备& FAQ

本文档由 2024年 TiDB 社区互助升级导师共建

TiFlash 介绍&作用

TiFlash 是 TiDB 体系中的一个关键组件,主要用于增强 TiDB 在 HTAP(混合事务/分析处理)场景下的性能。以下是对 TiFlash 的介绍以及它对用户的价值和作用的概述:

TiFlash 简介

  1. 分析引擎:TiFlash 作为 TiDB 的分析引擎,是 HTAP 形态的核心部分,提供了对大规模数据集进行快速实时分析的能力。

  2. 列式存储:它采用列式存储结构,与 ClickHouse 高效的向量化计算引擎相结合,针对 OLAP(在线分析处理)查询进行了优化。

  3. 异步复制:TiFlash 通过 Raft Learner 协议实现数据的异步复制,确保了数据的强一致性,同时保持了与 TiKV 的隔离性。

  4. 智能选择:TiDB 可以根据查询需求,智能地选择使用 TiFlash 列存或 TiKV 行存,甚至在单个查询中混合使用以提供最佳性能。

  5. 计算加速:TiFlash 可以分担 TiDB 的计算压力,通过列存的高读取效率和下推计算,提高数据库整体性能。

用户价值和作用

  1. 性能提升:TiFlash 显著提高了对 OLAP 查询的处理速度,使得用户能够更快地得到查询结果,尤其在处理大数据量的分析时效果显著。

  2. 简化架构:用户可以在 TiDB 集群中直接使用 TiFlash,无需额外部署和维护单独的分析型数据库,简化了数据架构。

  3. 实时性:TiFlash 保证了数据的实时更新和快照隔离级别的读取,使得用户可以获取到最新的数据状态,对于需要实时数据分析的应用场景非常有价值。

  4. 易用性:TiFlash 支持表粒度的数据同步,用户可以根据需要同步特定表的数据,且 TiDB 可以智能地选择存储引擎,提高了易用性。

  5. 扩展性:TiFlash 的引入并没有改变 TiDB 的分布式和可扩展特性,用户可以根据需求灵活地扩展 TiFlash 节点。

综上所述,TiFlash 为使用 TiDB 的用户提供了一个强大的分析型存储引擎,它通过列式存储和智能计算下推,极大地提升了处理 OLAP 查询的性能,同时保持了数据的强一致性和实时性,为用户提供了一个高效、简化且易于使用的 HTAP 数据库解决方案。

更多文档:TiFlash 部署拓扑配置 TiDB 集群创建 TiFlash 副本TiFlash 集群监控TiFlash 诊断数据水平扩容 TiFlash在线修改 TiFlash 配置

TiFlash 上线前准备

TiFlash 是 TiDB 系统中用于增强 OLAP(在线分析处理)性能的关键组件,它通过列式存储和向量化计算来提高数据处理效率。在将 TiFlash 组件上线前,需要进行一系列的准备工作以确保其稳定运行并满足业务需求。以下是 TiFlash 上线前的一些准备步骤:

  1. 环境检查:确保你的 TiDB 集群满足 TiFlash 的资源要求,包括硬件资源、操作系统和网络配置。

  1. 版本兼容性:确认你的 TiDB 版本与 TiFlash 版本是一致。

  2. 集群规划:根据业务需求规划 TiFlash 节点的数量和配置。TiFlash 推荐与 TiKV 节点分开部署以实现 Workload 隔离,但也可以在没有业务隔离需求的情况下与 TiKV 同节点部署。

  3. 数据同步:TiFlash 不支持直接写入数据,数据必须先写入 TiKV,然后同步到 TiFlash。因此,需要配置数据同步策略,包括确定哪些表需要同步以及同步的粒度。可通过 MySQL 客户端向 TiDB 发送 DDL 命令来为特定的表建立 TiFlash 副本。

  4. 开启列存副本

ALTER TABLE '<db_name>'.'<table_name>' SET TiFlash REPLICA <count>;

count 表示副本数,副本数一般小于等于 TiFlash 实例数;0 表示删除。

  1. 查看同步进度
SELECT * FROM information_schema.TiFlash_replica WHERE TABLE_SCHEMA = '<db_name>' and TABLE_NAME = '<table_name>';
  1. 集群部署:如果全新部署包含 TiFlash 节点的集群,可以参考官方文档中的部署指南。若在现有集群中新增 TiFlash 节点,也需遵循相应的添加步骤。

  2. 配置参数:根据工作负载和性能测试结果,调整 TiFlash 的配置参数,如并发数、内存限制等,以优化性能。

  3. 监控与日志:配置监控系统以跟踪 TiFlash 的性能和状态,并确保日志系统能够捕获关键信息,便于后续的问题排查和性能调优。

  4. 测试验证:在正式环境之外,进行充分的测试,包括性能测试、故障恢复测试和业务逻辑测试,确保 TiFlash 能够满足业务需求并且稳定运行。

  5. 文档与培训:准备相关的技术文档,并对运维人员进行必要的培训,确保他们了解 TiFlash 的工作原理和运维操作。

  6. 备份与恢复:制定备份和恢复策略,确保在出现故障时可以快速恢复服务。在 TiDB 集群进行备份时,会自动备份 TiFlash 副本相关的元数据。

  7. 安全设置:确保 TiFlash 节点的安全性,包括网络隔离、认证授权和数据加密等。

  8. 性能调优:根据测试结果和业务场景,对 TiFlash 进行性能调优,包括调整 MPP 架构中的相关参数。

  9. 支持分区表动态裁剪

  10. 测试是否需要打开 tidb_opt_agg_push_down 将聚合函数下推到 Join,Projection 和 UnionAll 之前

  11. 测试是否需要打开 Runtime Filter 以提升 join 的执行效率

  12. 问题排查准备:了解可能出现的问题和相应的排查方法,比如通过特定的 API 接口来辅助排查。

  13. 查看sql执行计划判断是否使用了TiFlash引擎

explain analyze your_sql

TiDB 社区用户 TiFlash 实践文章

TiFlash FAQ

  1. Q: TiFlash 可以在哪些操作系统上运行?

  2. A: TiFlash 主要设计用于运行在 Linux 操作系统上,具体支持的版本需要与 TiDB 的兼容性相匹配(需要和 TiDB 同一个版本)。

  3. Q: 如何确认 TiFlash 已经成功安装?

  4. A: 确认 TiFlash 节点是否成功注册到 Placement Driver (PD) 是一个常用的验证方法。可以使用 PD Control 工具(pd-ctl)来检查 TiFlash 实例的状态。

  5. Q: TiFlash 支持表粒度的数据同步意味着什么?

  6. A: 这意味着可以为单个表而不是整个数据库创建 TiFlash 副本,从而实现更精细的同步控制。

  7. Q: TiFlash 部署后会自动同步数据吗?

  8. A: 不会,TiFlash 需要手动指定需要同步的表。

  9. Q: 如果 TiFlash 副本始终显示为不可用,应如何排查问题?

  10. A: 首先,检查 PD 的 Placement Rules 是否已开启。然后,通过 TiFlash-Summary 监控面板检查 TiFlash 进程的 UpTime。接着,使用 pd-ctl 查看 TiFlash proxy 状态,并检查副本数配置是否小于等于集群中的 TiKV 节点数。

  11. Q: 如何处理 TiFlash 节点磁盘空间不足的问题?

  12. A: 可以通过扩容 TiFlash 节点来让 PD 将数据调度到新的 TiFlash 节点上。同时,应调整 reserve-space 配置以避免未来空间不足的问题。

  13. Q: 如果发现 TiFlash 数据不同步,应采取哪些步骤?

  14. A: 首先,确认 ALTER table <tbl_name> set TiFlash replica <num> 操作是否执行成功。然后,检查集群中是否最少有 3 个 tikv 节点,检查 PD placement-rule 同步规则是否设置,检查 TiFlash 进程状态和 Region 同步进度。如果同步异常,查看 tidb.log 和 TiFlash.log 获取更多信息。

  15. Q: TiFlash 查询时间不稳定且日志中出现大量 Lock Exception 是怎么回事?

  16. A: 这通常是由于集群中存在大量写入操作,导致 TiFlash 查询时频繁遇到锁。可以通过设置查询时间戳为稍早的时间来减少锁冲突。

  17. Q: 发现 TiFlash 数据文件损坏,应该如何处理?

  18. A: 首先下线损坏的 TiFlash 节点,然后清除该节点的数据文件,并重新部署该节点。

  19. Q: TiFlash 分析慢可能由哪些因素引起?

  20. A: 如果 SQL 语句中的某些算子或函数不被 MPP 模式支持,TiDB 将不会选择 MPP 模式,这可能导致分析性能下降。使用 EXPLAIN 语句可以检查 SQL 中是否含有这些不被支持的元素。

  21. Q: TiFlash 支持哪些计算下推?

  22. A: TiFlash 支持多种计算下推,包括聚合、排序和谓词下推等,具体支持的下推计算可以参考官方文档 TiFlash 支持的计算下推

  23. Q: 如何对 TiFlash 进行性能调优?

  24. A: 性能调优通常涉及对 TiFlash 配置参数的调整,如设置 tidb_allow_mpp 通过 MPP 协议在 TiFlash 执行计算、设置 tidb_opt_agg_push_down 允许聚合函数下推到 到 Join,Projection 和 UnionAll 之前、打开 Runtime Filter 特性。推荐相关参数 session 级别修改。例如:jdbc 配置 session variable 超时参数

  25. Q: 如何使用 TiDB 读取 TiFlash 副本?

  26. A: TiDB 提供了智能选择、Engine 隔离和手工 Hint 三种方式来读取 TiFlash 副本。智能选择依赖于成本优化器(CBO)自动选择最佳副本,Engine 隔离通过配置变量强制使用特定 engine 的副本,而手工 Hint 允许在查询中指定特定的副本。

  27. Q: TiFlash 的核心组件包括哪些?

  28. A: TiFlash 的核心组件包括存储引擎本身和处理 Multi-Raft 协议通信的 TiFlash proxy。

  29. Q: TiFlash 的核心特性有哪些?

  30. A: TiFlash 的核心特性包括异步复制、一致性保证、智能选择和计算加速。

  31. Q: TiFlash 异步复制的工作原理是怎样的?

  32. A: TiFlash 使用 Raft Learner 协议以异步方式复制数据。这种方式允许在 TiFlash 节点宕机或网络延迟的情况下,TiKV 业务依然能够继续运行。

  33. Q: 如何保证 TiFlash 数据的一致性?

  34. A: TiFlash 通过复制进度校验来保证一致性,每次读取请求时,TiFlash 中的 Region 副本会向 Leader 副本发起校对,确保读取的数据至少包含请求时间戳所覆盖的数据。

  35. Q: TiFlash 在计算加速方面有哪些优势?

  36. A: TiFlash 的计算加速包括列存本身的高读取效率,以及能够分担 TiDB 的计算负载,通过下推计算到存储层来提高性能。

  37. Q: 如何扩容 TiFlash 节点?

  38. A: 扩容 TiFlash 节点通常涉及添加新的节点到集群并配置数据同步,具体步骤可以参考官方的扩容指南。

  39. Q: TiFlash 的配置参数有哪些重要的?

  40. A: TiFlash 的配置参数包括但不限于 profiles.default.max_memory_usage_for_all_queries、 storage.reserve-space 等,这些参数可以根据具体的工作负载和性能需求进行调整。

  41. Q: TiFlash 的监控说明在哪里可以找到?

  42. A: 官方文档提供了 TiFlash 监控的详细说明,包括如何使用 Grafana 面板监控 TiFlash 的性能和状态。

  43. Q: TiFlash 的报警规则应如何设置?

  44. A: 可以根据 TiFlash 的关键性能指标(KPIs)设置报警规则,以便于在性能下降或出现其他问题时及时得到通知。

  45. Q: TiFlash 的兼容性说明在哪里可以找到?

  46. A: 官方文档提供了 TiFlash 与不同版本 TiDB 的兼容性说明,以帮助用户选择合适的版本进行部署。

  47. Q: TiFlash 是否支持直接写入数据?

  48. A: 目前,TiFlash 不支持直接写入数据。所有数据必须先写入 TiKV,然后通过数据同步操作同步到 TiFlash。

  49. Q: TiFlash 推荐与 TiKV 节点分开部署吗?

  50. A: 是的,为了实现 Workload 隔离并优化性能,推荐将 TiFlash 与 TiKV 分开部署。但在某些情况下,如果业务隔离需求不高,也可以与 TiKV 同节点部署。

  51. Q: TiFlash 节点宕机时,如何保证 TiKV 业务正常进行?

  52. A: 由于 TiFlash 使用 Raft Learner 协议进行异步复制,即使 TiFlash 节点宕机,TiKV 上执行的业务仍能正常进行,因为数据已经在 TiKV 中持久化。

  53. Q: TiFlash 在 HTAP 架构中扮演什么角色?

  54. A: 在 HTAP(混合事务/分析处理)架构中,TiFlash 作为分析引擎,提供列式存储和高效的 OLAP 计算能力,同时保持与 TiKV 的强一致性。

  55. Q: TiFlash 的 GitHub 仓库在哪里?

  56. A: TiFlash 的 GitHub 仓库地址是 https://github.com/pingcap/tifalsh,这里是获取 TiFlash 源代码和相关开发文档的地方。

  57. Q: 如何有效隔离一套集群中的TP&AP SQL

  58. 当 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 业务。
  1. 当 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
3 个赞