【赵渝强老师】TiDB的列存引擎:TiFlash
TiDB的TiFlash提供列式存储,且拥有借助ClickHouse高效实现的协处理器层。除此以外,它与TiKV非常类似,依赖同样的Multi-Raft体系,以Region为单位进行数据复制和分散。TiFlash以低消耗不阻塞TiKV写入的方式,实时复制TiKV集群中的数据,并同时提供与TiKV一样的一致性读取,且可以保证读取到最新的数据。TiFlash中的Region副本与TiKV中完全对应,且会跟随TiKV中的Leader副本同时进行分裂与合并。下图为TiDB HTAP形态架构,其中包含TiFlash节点。
TiFlash主要包含两个组件,一个是列式存储引擎组件,另一个是处理Multi-Raft协议通信相关工作的TiFlashproxy组件。TiFlash可以兼容TiDB与TiSpark,用户可以选择使用不同的计算引擎。
提示:TiFlash暂时无法直接接受数据写入,任何数据必须先写入TiKV再同步到TiFlash。
视频讲解如下:
TiFlash部署完成后并不会自动从TiKV中同步数据,而需要手动指定需要同步的表。可以使用TiDB或者TiSpark读取TiFlash,其中:TiDB适合用于中等规模的OLAP计算,而TiSpark适合大规模的OLAP计算。用户可以根据使用的场景和使用习惯自行选择。
执行下面的语句创建一个TiDB数据库集群,该集群中将包含:一个TiDB节点、一个PD节点、两个TiKV节点和两个TiFlash节点。
代码语言:powershell复制# tiup playground v8.5.1 \
--db 1 --pd 1 --kv 2 \
--tiflash 2 --without-monitor
TiFlash接入TiKV集群后,默认不会开始同步数据。可通过MySQL客户端向TiDB发送DDL命令来为特定的表建立TiFlash副本,DDL语句格式如下:
代码语言:sql复制ALTER TABLE <table_name> SET TIFLASH REPLICA <count>;
# 其中:count表示TiFlash中的副本数,0表示删除TiFlash中的所有副本数。
下面是具体的操作步骤:
(1)为员工表emp建立2个TiFlash副本。
代码语言:sql复制tidb> alter table emp set tiflash replica 2;
(2)查看员工表emp的同步进度。
代码语言:sql复制tidb> select * from information_schema.tiflash_replica
where table_schema = 'scott' and table_name = 'emp' \G;
# 输出的信息如下:
*************************** 1. row ***************************
TABLE_SCHEMA: scott
TABLE_NAME: emp
TABLE_ID: 114
REPLICA_COUNT: 2
LOCATION_LABELS:
AVAILABLE: 0
PROGRESS: 0.5
1 row in set (0.005 sec)
(3)再次查看员工表emp的同步进度。
代码语言:sql复制tidb> select * from information_schema.tiflash_replica
where table_schema = 'scott' and table_name = 'emp' \G;
# 输出的信息如下:
*************************** 1. row ***************************
TABLE_SCHEMA: scott
TABLE_NAME: emp
TABLE_ID: 114
REPLICA_COUNT: 2
LOCATION_LABELS:
AVAILABLE: 1
PROGRESS: 1
1 row in set (0.004 sec)
# 其中:
# AVAILABLE字段:表示该表的TiFlash副本是否可用。
1代表可用,0代表不可用。副本状态为可用之后就不再改变,
如果通过DDL命令修改副本数则会重新计算同步进度。
# PROGRESS字段:代表同步进度,在0.0~1.0之间,1代表至少1个副本已经完成同步。
(4)删除员工表emp的所有TiFlash副本。
代码语言:sql复制tidb> alter table emp set tiflash replica 0;
(5)为scott数据库构建TiFlash副本。
代码语言:sql复制tidb> alter database scott set tiflash replica 2;
(6)查看scott数据库的同步进度。
代码语言:sql复制tidb> select * from information_schema.tiflash_replica
where table_schema = 'scott' \G;
# 输出的信息如下:
*************************** 1. row ***************************
TABLE_SCHEMA: scott
TABLE_NAME: emp
TABLE_ID: 114
REPLICA_COUNT: 2
LOCATION_LABELS:
AVAILABLE: 0
PROGRESS: 0.5
*************************** 2. row ***************************
TABLE_SCHEMA: scott
TABLE_NAME: dept
TABLE_ID: 112
REPLICA_COUNT: 2
LOCATION_LABELS:
AVAILABLE: 0
PROGRESS: 0.5
2 rows in set (0.006 sec)
(7)再次查看scott数据库的同步进度。
代码语言:sql复制tidb> select * from information_schema.tiflash_replica
where table_schema = 'scott' \G;
# 输出的信息如下:
*************************** 1. row ***************************
TABLE_SCHEMA: scott
TABLE_NAME: emp
TABLE_ID: 114
REPLICA_COUNT: 2
LOCATION_LABELS:
AVAILABLE: 1
PROGRESS: 1
*************************** 2. row ***************************
TABLE_SCHEMA: scott
TABLE_NAME: dept
TABLE_ID: 112
REPLICA_COUNT: 2
LOCATION_LABELS:
AVAILABLE: 1
PROGRESS: 1
2 rows in set (0.006 sec)
(8)基于员工表emp创建一张新表,并查看新表的列存同步进度。
代码语言:sql复制tidb> create table newemp like emp;
tidb> select * from information_schema.tiflash_replica
where table_schema = 'scott' and table_name = 'newemp' \G;
# 输出的信息如下:
*************************** 1. row ***************************
TABLE_SCHEMA: scott
TABLE_NAME: newemp
TABLE_ID: 126
REPLICA_COUNT: 2
LOCATION_LABELS:
AVAILABLE: 1
PROGRESS: 1
1 row in set (0.008 sec)
# 提示:基于一张已存在TiFlash副本的表创建的新表也将自动拥有TIFlash副本。
在了解到了TiFlash的基本操作后,下面讨论一下TiFlash的核心特性。
- 异步复制
TiFlash中的副本以特殊角色(Raft Learner)进行异步的数据复制。这表示当TiFlash节点宕机或者网络高延迟等状况发生时,TiKV的业务仍然能确保正常进行。这套复制机制也继承了TiKV体系的自动负载均衡和高可用:并不用依赖附加的复制管道,而是直接以多对多方式接收TiKV的数据传输;且只要TiKV中数据不丢失,就可以随时恢复TiFlash的副本。
- 一致性
TiFlash提供与TiKV一样的快照隔离支持,且保证读取数据最新。这个一致性是通过对数据进行复制进度校验做到的。每次收到读取请求,TiFlash中的Region副本会向Leader副本发起进度校对,只有当进度确保至少所包含读取请求时间戳所覆盖的数据一致后才响应读取。
- 智能选择
TiDB可以自动选择使用TiFlash列存或者TiKV行存,甚至在同一查询内混合使用提供最佳查询速度。这个选择机制与TiDB选取不同索引提供查询类似:根据统计信息判断读取代价并作出合理选择。
- 计算加速
TiFlash对TiDB的计算加速分为两部分:列存本身的读取效率提升以及为TiDB分担计算。TiDB会将可以由存储层分担的计算下推。能否下推取决于TiFlash是否可以支持相关下推。