[转帖]9.2 TiFlash 架构与原理

tiflash,架构,原理 · 浏览次数 : 0

小编点评

**9.2. TiFlash 架构与原理概述** **架构** TiFlash 架构是一种列式存储架构,利用 ClickHouse 的向量化计算引擎,提供读取和计算双重性能优势。它具有以下关键组件: * **Region:**一个包含多个 Peer 的区域,每个 Peer 代表一个 Raft 服务器节点。 * **Replica Manager Index:**主要面向点查的结构,用于存储 Region 的索引信息。 * **Raft Learner Proxy:**基于 Raft Learner 的数据同步机制,负责维护 Region 的状态机。 * **Schema Syncer:**实时同步 TiDB 的最新的表 Schema 信息。 * **Learner Read / Coprocessor:**负责执行外部一致性检查,并处理跨 Region 的查询。 **原理** 1. **Region 存储:** Region 是一个独立的存储节点,包含一个 Raft 服务器和多个 Peer。 2. **Index 维护:** Region 的 Index 存储在 Leader 中,负责维护 Region 的一致性。 3. **数据同步:** 从 TiDB 中获取最新的 Schema 信息,并同步到 Region 中。 4. **数据读取:** 通过 Learner Read 的机制,从多个 Region 中读取数据。 5. **分区和索引:** 在读请求中,使用 Region 的版本号进行分区和索引匹配。 6. **向量化计算:** ClickHouse 的向量化计算引擎用于优化列式存储的数据读取和计算。 **优势** * **双重性能:**读取和计算的双重处理提高了性能。 * **OLAP 查询加速:**通过索引,可以优化对于列数据进行聚合的 OLAP 查询。 * **分布式自动扩展:**通过分布式存储,可以轻松扩展系统性能。 * **SI(Snapshot Isolation)隔离级别读取:**支持读操作的 SI isolation,确保数据一致性。

正文

9.2 TiFlash 架构与原理

相比于行存,TiFlash 根据强 Schema 按列式存储结构化数据,借助 ClickHouse 的向量化计算引擎,带来读取和计算双重性能优势。相较于普通列存,TiFlash 则具有实时更新、分布式自动扩展、SI(Snapshot Isolation)隔离级别读取等优势。本章节将从架构和原理的角度来解读 TiFlash。

9.2.1 基本架构

1.png

TiFlash 引擎补全了 TiDB 在 OLAP 方面的短板。TiDB 可通过计算层的优化器分析,或者显式指定等方式,将部分运算下推到对应的引擎,达到速度的提升。值得一提的是,在表关联场景下,即便 TiFlash 架构没有 MPP 相关功能,借助 TiDB 的查询优化器、布隆过滤器下推和表广播等手段,相当比例的关联场景仍可享受 TiFlash 加速。

如上图所示,TiFlash 能以 Raft Learner Store 的角色无缝接入 TiKV 的分布式存储体系。TiKV 基于 Key 范围做数据分片并将一个单元命名为 Region,同一 Region 的多个 Peer(副本)分散在不同存储节点上,共同组成一个 Raft Group。每个 Raft Group 中,Peer 按照角色划分主要有 Leader、Follower、Learner。在 TiKV 节点中,Peer 的角色可按照一定的机制切换,但考虑到底层数据的异构性,所有存在于 TiFlash 节点的 Peer 都只能是 Learner(在协议层保证)。TiFlash 对外可以视作特殊的 TiKV 节点,接受 PD 对于 Region 的统一管理调度。TiDB 和 TiSpark 可按照和 TiKV 相同的 Coprocessor 协议下推任务到 TiFlash。

在 TiDB 的体系中,每个 Table 含有 Schema、Index(索引)、Record(实际的行数据) 等内容。由于 TiKV 本身没有 Table 的概念,TiDB 需要将 Table 数据按照 Schema 编码为 Key-Value 的形式后写入相应 Region,通过 Multi-Raft 协议同步到 TiFlash,再由 TiFlash 根据 Schema 进行解码拆列和持久化等操作。

9.2.2 原理

2.png

这是一张 TiFlash 数据同步到读取的基本流程架构图,以下将按照大类模块分别简单介绍。

1. Replica Manager

Index 这种主要面向点查的结构对于 TiFlash 的列式存储是没有意义的。为了避免同步冗余数据并实现按 Table 动态增删 TiFlash 列存副本,需要借助 PD 来有选择地同步 Region。

3.png

在同一个集群内的 TiFlash 节点会利用 PD 的 ETCD 选举并维护一个 Replica Manager 来负责与 PD 和 TiDB 交互。当感知到 TiDB 对于 TiFlash 副本的操作后(DDL 语句),会将其转化为 PD 的 Placement Rule,通过 PD 令 TiKV 分裂出指定 Key 范围的 Region,为其添加 Learner Peer 并调度到集群中的 TiFlash 节点。此外,当 Table 的 TiFlash 副本尚未可用时,Replica Manager 还负责向各个 TiFlash 节点收集 Table 的数据同步进度并上报给 TiDB。

2. Raft Learner Proxy

基于 Raft Learner 的数据同步机制是整个 TiFlash 存储体系的基石,也是数据实时性、正确性的根本保障。Region 的 Learner Peer 除了不参与投票和选举,仍要维护与其他 TiKV 节点中相同的全套状态机。因此,TiKV 被改造成了一个 Raft Proxy 库,并由 Proxy 和 TiFlash 协同维护节点内的 Region,其中实际的数据写入发生在 TiFlash 侧。

作为固定存在的 Learner,TiFLash 可以进行数据进行二次加工而不用担心对其他节点产生影响。TiFlash 在执行 Raft 命令时就可以做到剔除无效数据,将未提交的数据按 Schema 预解析等优化。同时 TiFlash 实现了对于 Raft 命令的幂等回放以及引擎层的幂等写,可以不记录 WAL 且只在必要的时刻做针对性的持久化,从而简化模型并降低了风险。

TiDB 的事务实现是基于 Percolator 模型的,映射到 TiKV 中则是对 3 个 CF(Column Family) 数据的读写:Write、Default、Lock。TiFlash 也在每个 Region 内部对此做了抽象,不同的是对于 TiFlash 而言,数据写入 CF 只能作为中间过程,最终持久化到存储层需要找到 Region 对应的 Table 再根据 Schema 进行行列结构转换。

3. Schema Syncer

每个 TiFlash 节点都会实时同步 TiDB 的最新的表 Schema 信息。TiFlash 兼容 TiDB 体系的在线 DDL,对经常需要做表结构修改的业务非常友好,例如增、删、改字段等操作都不影响在线业务。

4. Learner Read / Coprocessor

4.png

无论是通过 CH 客户端、TiSpark、CHSpark 还是 TiDB 向 TiFlash 发起查询,都需要 Learner Read 来确保外部一致性。在同一个 Raft Group 中,Index 是永续递增的(任何 Raft 命令都会对其产生修改),可被视作乐观锁。Region 本身含有 Version 和 Conf Version 两种版本号,当发生诸如 Split/Merge/ChangePeer 等操作时,版本号均会产生相应的变化。

所有的查询都需要由上层拆分为一个或多个 Region 的读请求,需要包含 Region 的两种版本号(可从 PD 或 TiKV 获取),Timestamp(用于 Snapshot Read 的时间戳,从 PD 获取),以及 Table 相关信息(Schema Version 从 TiDB 获取)。单次读请求可大致分为以下步骤:

  1. 校验并更新本节点的 Schema
  2. 向 Region 的 Leader Peer 获取最新的 Index,等待当前节点中 Learner 的 Applied Index 追上
  3. 校对 Version 和 Conf Version,检查 Lock CF 中的锁信息
  4. 读取内存中的半结构化数据和存储引擎中 Region 范围对应的结构化数据
  5. 按照 Timestamp 进行 Snapshot Read 和多路合并
  6. Coprocessor 计算(主要借助 ClickHouse 的向量化计算引擎)

9.2.3 TiFlash 对 OLAP 查询加速

OLAP 类的查询通常具有以下几个特点:

  • 每次查询读取大量的行,但是仅需要少量的列
  • 宽表,即每个表包含着大量的列
  • 查询通过一张或多张小表关联一张大表,并对大表上的列做聚合

TiFlash 列存引擎针对这类查询有较好的优化效果:

(1) I/O 优化

  • 每次查询可以只读取需要的列,减少了 I/O 资源的使用
  • 同列数据类型相同,相较于行存可以获得更高的压缩比
  • 整体的 I/O 减少,令内存的使用更加高效

(2) CPU 优化

  • 列式存储可以很方便地按批处理字段,充分利用 CPU Cache 取得更好的局部性
  • 利用向量化处理指令并行处理部分计算

9.2.4 TiKV 与 TiFlash 配合

TiFlash 可被当作列存索引使用,获得更精确的统计信息。对于关联查询来说,点查相关的任务可以下推到 TiKV,而需要关联的大批量聚合查询则会下推到TiFlash,通过两个引擎的配合,达到更快的速度。

9.2.5 总结与展望

TiFlash 是 TiDB HTAP 之路上的全新实践。这套架构体系也将伴随生产环境的使用不断演化发展,进而为用户解决更多问题。

与[转帖]9.2 TiFlash 架构与原理相似的内容:

[转帖]9.2 TiFlash 架构与原理

9.2 TiFlash 架构与原理 相比于行存,TiFlash 根据强 Schema 按列式存储结构化数据,借助 ClickHouse 的向量化计算引擎,带来读取和计算双重性能优势。相较于普通列存,TiFlash 则具有实时更新、分布式自动扩展、SI(Snapshot Isolation)隔离级别读

[转帖]openGauss 3.0 单节点安装部署

https://cdn.modb.pro/db/568455 openGauss来源于PostgreSQL 9.2.4pg使用c实现,gs使用c++实现一个实例多个库 单机HA不是支持一主一备,提供高可靠和读扩展,备机最多8套。 主备部署模块说明:OM运维管理模块:提供日常运维、配置管理接口,工具在

[转帖]openGauss 3.0 单节点安装部署

https://cdn.modb.pro/db/568455 openGauss来源于PostgreSQL 9.2.4pg使用c实现,gs使用c++实现一个实例多个库 单机HA不是支持一主一备,提供高可靠和读扩展,备机最多8套。 主备部署模块说明:OM运维管理模块:提供日常运维、配置管理接口,工具在

[转帖]openGauss 3.0 单节点安装部署

https://www.modb.pro/db/568455?utm_source=index_ori openGauss来源于PostgreSQL 9.2.4pg使用c实现,gs使用c++实现一个实例多个库 单机HA不是支持一主一备,提供高可靠和读扩展,备机最多8套。 主备部署模块说明:OM运维管

[转帖]Docker方式安装ZabbixServer/Agent及Grafana

https://www.jianshu.com/p/055a3cf63233 安装环境 [root@master0 ~]# docker version Client: Version: 17.12.0-ce API version: 1.35 Go version: go1.9.2 Git com

[转帖]openGauss单机部署

作者:可达 openGauss单机部署 一、安装环境 1.操作系统:虚拟机VMware、CentOS7.9 2.环境设置: (1)虚拟机内存3G、磁盘100G (2)系统版本修改 一开始使用了centos8,无法安装,因此降低版本,选用7.9后依然存在一些问题,因此修改/etc/redhat-rel

[转帖]redis-cluster-proxy安装使用尝试

https://www.cnblogs.com/gered/p/15210509.html 【1】gcc 4.9+安装 【2】redis-cluster-proxy 介绍与安装 下载安装: 配置文件: 启动 【3】连接核验 【4】故障转移 【4.0】查看集群状态 【4.1】集群挂一个主库的影响 【4

[转帖]20191022-从Jenkins NativeOOM到Java8内存

我把老掉牙的Jenkins升级了,它跑了几天好好的;后来我有一个python脚本使用JenkinsAPI 0.3.9每隔2.5分钟发送约300余get请求,结果过了3天,它就挂了;当我开两个脚本时,40.5小时就挂了。(可以通过搜索Jenkins日志/var/log/jenkins/* 中字符Jen

[转帖]postgresql 物理备份 barman 之 安装

os: ubuntu 16.04postgresql: 9.6.8barman: 2.5 ip 规划 192.168.56.101 node1 barman192.168.56.102 node2 postgresql barman 是2ndquadrant推出的一款 postgresql 开源备份

[转帖]我63岁,夫妻俩退休工资15000,回农村养老不到一年,落荒而逃

[一种声音]我63岁,夫妻俩退休工资15000,回农村养老不到一年,落荒而逃 xilei 发布于 2023-2-14 9:36:00 我63岁,夫妻俩退休工资15000,回农村养老不到一年,我们落荒而逃 1、 我是老袁,江西人,一个儿子在上海工作,儿子和儿媳都有不错的单位。孙子住寄宿学校,也不需要我