如何使用TiFlash ? 干货分享
TiFlash 部署完成后要手动指定需要同步的表才能发挥出OLAP效果。
例:ALTER TABLE ‘test’.’tab_a’ SET TIFLASH REPLICA 2
备注:2表示需要两个副本;若设置为0表示删除。
查看副本状态:
SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = ‘TEST’ and TABLE_NAME = ’ TAB_A ’
当AVAILABLE字段为1 代表可用,0 代表不可用(副本状态为1后就不再改变,若通过 DDL 命令修改副本数量则会重新计算同步进度)。
PROGRESS 字段代表同步进度,通常位于0.0~1.0 之间,1 代表至少 1 个副本已经完成同步。
TiFlash存储可以分别被 TiDB 、TiSpark 读取(分析数据量特别大时使用TiSpark,反之则使用TiDB)
A.数据规模大时开启TiSpark
方法1
vi spark-defaults.conf
添加一条
spark.tispark.use.tiflash true
备注: 设置为true 时所有的查询都只读取TiFlash 副本(此时要求被查询所用到的表都必须已创建了 TiFlash 副本,若对未创建 TiFlash副本的表进行查询会报错);设置为 false 时只读取 TiKV 副本。
方法2
启动 Spark shell 或 Thrift server 时,命令行中添加
–conf spark.tispark.use.tiflash=true
方法3
Spark shell 中实时设置:
spark.conf.set(“spark.tispark.use.tiflash”, true)
方法4
Thrift server 通过 beeline 连接后实时设置:
set spark.tispark.use.tiflash=true
B.数据规模一般时使用Tidb读取
模式1:CBO
当添加了 TiFlash 副本而没有做任何 engine配置时默认使用 CBO 方式,优化器会自动根据代价估算智能选择是否使用 TiFlash 副本。
通过 desc 或 explain analyze 查看最终是否读取了tiflash副本
desc select count() from test.tab;
explain analyze select count() from test.tab;
执行计划中出现cop[tiflash]表示读取了tiflash副本。
很多时候当没有进行统计信息收集时,CBO会不选择tiflash,此时收集一下统计信息(analyze table)后再查看执行计划。
特殊情况:当表仅有单个 TiFlash 副本且相关节点无法服务,智能选择模式下的查询会不断重试,需要指定 Engine 或者手工 Hint 来读取TiKV 副本。
模式2: Engine 隔离
通过配置变量来指定所有的查询使用指定engine 的副本。
INSTANCE 级别设置,在 TiDB 配置文件添加如下配置项:
[isolation-read]
engines = [“tikv”, “tidb”, “tiflash”]
备注:其中 “tidb” 表示 TiDB 内部的内存表区,主要存储TiDB 系统表,用户不能主动使用。由于 TiDB Dashboard 等组件需要读取一些存储于TiDB 内存表区的系统表, engine 配置中最好加入 “tidb” engine。
SESSION 级别设置:
set@@session.tidb_isolation_read_engines = “tikv, tidb, tiflash”;
或
set session tidb_isolation_read_engines = “tikv, tidb, tiflash”;
如果查询中的表没有对应 engine 的副本,会报错提示:该表不存在该 engine 副本。(比如配置了 engine 为 “tiflash”, 而该表没有 TiFlash副本)
模式3: 手工 Hint
在满足 engine 隔离的前提下,强制 TiDB 对于某张或某几张表使用指定的副本。
单表:
select /*+ read_from_storage(tiflash[tab]) / … from tab;
多表:
select /+ read_from_storage(tiflash[a, b]) */ … from tab_1 as a, tab_2 as b where a.col1 = b.col2;
备注:tiflash[] 提示优化器读取 TiFlash 副本,亦可根据需要使用 tikv[] 提示优化器读取 TiKV副本。
Hint 必须在满足 engine 隔离的前提下才会生效,若 Hint 指定的引擎不在 engine 隔离列表中会被忽略,并产生 warning。若Hint 指定的表在指定的引擎上不存在副本,也会被忽略,并产生 warning。
计算下推特性:
TiFlash 支持谓词、聚合下推计算以及表连接,下推的计算可以帮助 TiDB 进行分布式加速。(有些计算类型暂不支持:Full Outer Join 、 DISTINCT COUNT)
开启计算下推的命令(session级)
set @@session.tidb_opt_broadcast_join=1
目前4.0版本的TiFlash 支持如下有限的常用表达式下推:
+, -, /, *, >=, <=, =, !=, <, >, ifnull, isnull, bitor, in, mod, bitand, or, and, like, not,
case when, month, substr, timestampdiff, date_format, from_unixtime, json_length, if, bitneg, bitxor, round without fraction, cast(int as decimal), date_add(datetime, int), date_add(datetime, string)
4.0版本中TiFlash 不支持下推的情况包括:
• 所有包含 Duration 的表达式均不能下推
• 在聚合函数或者 WHERE 条件中包含了不在上述列表中的表达式,聚合或者相关的谓词过滤均不能下推。
如查询遇到不支持的下推计算,则需要依赖TiDB 完成剩余计算,可能会很大程度影响TiFlash 加速效果。Tidb官方称:后续版本会陆续完善相关问题。