当前位置:网站首页>TiFlash 计算层概览
TiFlash 计算层概览
2022-08-03 12:53:00 【InfoQ】
背景
TiDB + TiFlash 计算层的演进
- TiDB 中的算子是在 TiDB 中单机执行的,计算的扩展性受限;
- TiKV 中的算子是在 TiKV 中执行的,而且 TiKV 的计算能力是可以随着 TiKV 节点数的增加而线性扩展的;
- 因为 TiKV 中并没有 table 的概念,Coprocessor 是以 Region 为单位的,一个 region 一个 coprocessor request;
- 每个 Coprocessor 都会带有一个用于 MVCC 读的 timestamp,在 TiFlash 中我们称之为 start_ts。
- Coprocessor 是以 region 为单位的,而 TiDB 中默认 region 大小是 96 MB,这样对于一个 AP 的大表,可能会包含成千上万个 region,这导致一个 query 就会有成千上万次 RPC;
- 每个 Coprocessor 只读一个 region 的数据,这让存储层很多读相关的优化都用不上。
- BatchCommands:这个是 TiDB + TiKV 体系里就有的一个改进,原理就是在发送的时候将发送给同一个存储节点的 request batch 成一个,对于 TiFlash 来说,因为只支持 Coprocessor request,所以就是把一些 Coprocessor request batch 成了一个。因为 batch 操作是发送端最底层做的,所以 batch 在一起的 Coprocessor request 并没有逻辑上的联系,所以 TiFlash 拿到 BatchCoprocessor 之后也就是每个 Coprocessor request 依次处理。所以 BatchCommands 只能解决 RPC 过多的问题。
- BatchCoprocessor:这个是 TiDB + TiFlash 特有的 RPC,其想法也很简单,就是对同一个 TiFlash 节点,只发送一个 request,这个 request 里面包含了所有需要读取的 region 信息。显然这个模式不但能减少 RPC,而且存储层能一次性的看到所有需要扫描的数据,也让存储层有了更大的优化空间。
DAGRequest 到 BlockInputStream
- executors:这个是引入 TiFlash 之前的定义,其表示一个 executor 的数组,而且里面的 executor 最多就三个:一个 scan(tablescan 或者 indexscan),一个 selection,最后一个 agg/topN/limit;
- root_executors:显然上面那个 executors 的定义过于简单,无法描述 MPP 时的 plan,所以在引入 MPP 之后我们加了一个 root_executor 的 field,它是一个 executor 的 tree。
- 如何保证 TiFlash 的数据与 TiKV 的数据保持强一致性;
- 如何处理 Region error。
- Block:是执行期的最小数据单元,它由一个 column 的数组组成;
- BlockInputStream:相当于执行框架,每个 BlockInputStream 都有一个或者多个 child,执行时采用了 pull 的模型。下面是执行时的伪代码:
- 用于做计算的,例如:
- DMSegmentThreadInputStream:与存储交互的 InpuStream,可以简单理解为是 table scan;
- ExchangeReceiverInputStream:从远端读数据的 InputStream;
- ExpressionBlockInputStream:进行 expression 计算的 InputStream;
- FilterBlockInputStream:对数据进行过滤的 InputStream;
- ParallelAggregatingBlockInputStream:做数据进行聚合的 InputStream。
- 用于并发控制的,例如:
- UnionBlockInputStream:把多个 InputStream 合成一个 InputStream;
- ParallelAggregatingBlockInputStream:和 Union 类似,不过还会做一个额外的数据聚合;
- SharedQueryBlockInputStream:把一个 InputStream 扩散成多个 InputStream。
MPP
- DispatchMPPTask:用于 TiDB 向 TiFlash 发送 plan;
- EstablishMPPConnectionSyncOrAsync:用于 MPP 中上游 task 向下游 task 发起读数据的请求,因为无论是读的数据量以及读的时间会比较长,所以这个 RPC 是 streaming 的 RPC;
- CancelMPPTask:用于 TiDB 端 cancel MPP query。
- Broadcast:即将一份数据 broadcast 到多个目标 mpp task;
- HashPartition:即将一份数据用 hash partition 的方式切分成多个 partition,然后发送给目标 mpp task;
- PassThrough:这个与 broadcast 几乎一样,不过 PassThrough 的目标 task 只能有一个,通常用于 MPP task 给 TiDB 返回结果。
- 接收端
- ExchangeReceiver:用于向其他 task 建立连接,接收数据并放在 result queue;
- ExchangeReceiverInputStream:执行框架中的一个 InputStream,多个 ER Stream 共同持有一个 ExchangeReceiver,并从其 result queue 中读数据。
- 发送端
- MPPTunnel:持有 grpc streaming writer,用于将计算结果发送给其他 task,目前有三种模式:
- Sync Tunnel:用 sync grpc 实现的 tunnel;
- Async Tunnel:用 async grpc 实现的 tunnel;
- Local Tunnel:对于处于同一个节点的不同 task,他们之间的 Tunnel 不走 RPC,在内存里传输数据即可。
- MPPTunnelSet:同一个 ExchangeSender 可能需要向多个 mpp task 传输数据,所以会有多个 MPPTunnel,这些 MPPTunnel 在一起组成一个 MPPTunnelSet。
- StreamingDAGResponseWriter:持有 MPPTunnelSet,主要做一些发送之前的数据预处理工作:
- 将数据 encode 成协议规定的格式;
- 如果 Exchange Type 是 HashPartition 的话,还需要负责把数据进行 Hash partition 的切分。
- ExchangeSenderBlockInputStream:执行框架中的一个 InputStream,持有 StreamingDAGResponseWriter,把计算的结果发送给 writer。
- MPPTaskManager:全局的 instance 用来管理该 TiFlash 节点上所有的 MPP task;
- MPPQueryTaskSet:属于同一个 query 的所有 MPP task 集合,在诸如 CancelMPPTask 时用于快速找到所有的目标 task;
- MPPTask:一个 MPP query 中的最基本单元,不同 MPP task 之间通过 Exchange 来交换数据。
- 固定线程:长期存在的线程
- 动态线程:按需申请的线程,不过与之前的线程不同的是,该线程在结束当前任务之后会等一段时间,如果没有新的任务的话,才会退出
- 完全分布式的调度器,仅依赖 TiFlash 节点自身的信息
- 基本的原理为 MinTSOScheduer 保证 TiFlash 节点上最小的 start_ts 对应的所有 MPP task 能正常运行。因为全局最小的 start_ts 在各个节点上必然也是最小的 start_ts,所以 MinTSOScheduer 能够保证全局至少有一条 query 能顺利运行从而保证整个系统不会有死锁,而对于非最小 start_ts 的 MPP task,则根据当前系统的线程使用情况来决定是否可以运行,所以也能达到控制系统线程使用量的目的。
- 完全分布式的调度器,仅依赖 TiFlash 节点自身的信息
- 基本的原理为 MinTSOScheduer 保证 TiFlash 节点上最小的 start_ts 对应的所有 MPP task 能正常运行。因为全局最小的 start_ts 在各个节点上必然也是最小的 start_ts,所以 MinTSOScheduer 能够保证全局至少有一条 query 能顺利运行从而保证整个系统不会有死锁,而对于非最小 start_ts 的 MPP task,则根据当前系统的线程使用情况来决定是否可以运行,所以也能达到控制系统线程使用量的目的。
总结
边栏推荐
猜你喜欢
随机推荐
An introduction to the skeleton tool
实数取整写入文件(C语言文件篇)
Notepad++ 安装jsonview插件
Hanyuan Hi-Tech G8032 standard ERPS ring network switch Gigabit 4 optical 10 electrical industrial Ethernet switch ring network + WEB management + SNMP VLAN planning
Notepad++ install jsonview plugin
【深度学习】高效轻量级语义分割综述
基于php志愿者服务平台管理系统获取(php毕业设计)
An animation optimization of traditional guide layer animation
基于php家具销售管理系统获取(php毕业设计)
【实战技能】单片机bootloader的CANFD,I2C,SPI和串口方式更新APP视频教程(2022-08-01)
期货开户中常见问题汇总
类和对象(中上)
OpenCV perspective transform
为冲销量下探中低端市场,蔚来新品牌产品定价低至10万?
An introduction to the width tool, deformation tool and lasso tool
Yahoo!Answers - data set
An动画基础之散件动画原理与形状提示点
使用工作队列管理器(四)
The common problems in the futures account summary
Jmeter使用