从Tidb的架构图中,秒懂这种绝妙
OLTP 实时OLAP两种Store并行,从客户端进来的请求智能选择,TiDB 可以自动选择使用 TiFlash 列存或 TiKV 行存,甚至在同一查询内混合使用提供最佳查询速度。(这个选择机制与 TiDB 选取不同索引提供查询类似:根据统计信息判断读取代价并作出合理选择)。
完成实时OLAP的TiFlash在提供了良好的隔离性的同时,也兼顾了强一致性。列存副本通过 Raft Learner协议异步复制,在读取的时候通过 Raft 校对索引配合 MVCC 的方式获得 Snapshot Isolation 的一致性隔离级别。很好地解决了 HTAP 场景的隔离性及列存同步的问题。
TiFlash是何神物 ?
TiFlash 提供列式存储,拥有借助 ClickHouse 高效实现的协处理器层。依赖Multi-Raft 体系以 Region 为单位进行数据复制和分散。
TiFlash 以低消耗不阻塞 TiKV 写入的方式,实时复制 TiKV 集群中的数据,同时提供与 TiKV 一样的一致性读取,可以保证读取到最新的数据。TiFlash 中的 Region 副本与 TiKV 中完全对应,会跟随 TiKV 中的 Leader 副本同时进行分裂与合并。
TiFlash 兼容 TiDB 与 TiSpark,用户可以选择使用不同的计算引擎。
目前版本(4.0)的TiFlash 暂时无法直接接受数据写入,任何数据必须先写入 TiKV 再同步到 TiFlash。TiFlash 以 learner 角色接入 TiDB 集群,TiFlash 支持表粒度的数据同步,部署后默认情况下不会同步任何数据,需要按照按表构建 TiFlash 副本完成指定表的数据同步。
TiFlash 主要包含三个组件: 存储引擎组件、 tiflash proxy 、 pd buddy,其中 tiflash proxy 主要用于处理 Multi-Raft 协议通信的相关工作,pd buddy 负责与 PD 协同工作,将 TiKV 数据按表同步到 TiFlash。
按表构建 TiFlash 副本的流程:TiDB接收到相应的 DDL 命令后 pd buddy 组件会通过 TiDB 的 status 端口获取到需要同步的数据表信息,然后会将需要同步的数据信息发送到 PD,PD 根据该信息进行相关的数据调度。
TiFlash核心特性:主要有异步复制、一致性、智能选择、计算加速等
异步复制:TiFlash 中的副本以特殊角色 (Raft Learner) 进行异步的数据复制。当 TiFlash 节点宕机或者网络高延迟等状况发生时,TiKV 的业务仍然能确保正常进行。
这套复制机制也继承了 TiKV 体系的自动负载均衡和高可用:并不用依赖附加的复制管道,而是直接以多对多方式接收 TiKV 的数据传输;且只要 TiKV 中数据不丢失,就可以随时恢复 TiFlash 的副本。
一致性:TiFlash 提供与 TiKV 一样的快照隔离支持,保证读取数据最新(确保之前写入的数据能被读取)。这个一致性是通过对数据进行复制进度校验做到的。
每次收到读取请求时,TiFlash 中的 Region 副本会向 Leader 副本发起进度校对(一个非常轻的 RPC 请求),只有当进度确保至少所包含读取请求时间戳所覆盖的数据之后才响应读取。
智能选择:TiDB 可以自动选择使用 TiFlash 列存或者 TiKV 行存,甚至在同一查询内混合使用提供最佳查询速度
(这个选择机制与 TiDB 选取不同索引提供查询类似:根据统计信息判断读取代价并作出合理选择)。
计算加速:TiFlash 对 TiDB 的计算加速分为两部分:列存本身的读取效率提升以及为 TiDB 分担计算。其中分担计算的原理和 TiKV 的协处理器一致:TiDB 会将可以由存储层分担的计算下推。能否下推取决于 TiFlash 是否可以支持相关下推。