初识TiDB

1. 定义

TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库

2. 作用

进行混合在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing 即 HTAP)

3. 特性

  • 金融级高可用

    数据采用多副本存储,副本数据强一致,并在少数副本同步失败时不影响多数副本使用(存储引擎使用Multi-Raft协议)

  • 水平扩容、缩容

    可按需对计算(TiDB/TiSpark)、存储(TiKV、TiFlash)分别进行在线扩容或者缩容(存储、计算分离的架构的设计)

  • 云原生

    可在公有云、私有云、混合云中实现部署工具化、自动化(提供集群管理工具TiDB Operator)

  • 兼容 MySQL 5.7 协议和 MySQL 生态

    应用无需或者修改少量代码即可从 MySQL 迁移到 TiDB(兼容 MySQL 5.7 协议、MySQL 常用的功能、MySQL 生态)

  • 实时HTAP

    TiKV 提供OLTP 服务,TiFlash提供OLAP 服务(提供行存储引擎 TiKV、列存储引擎 TiFlash 两款存储引擎) TiKV、TiFlash 可按需部署在不同的机器,解决 HTAP 资源隔离的问题。

4.目标

为用户提供一站式HTAP 解决方案,能力分别为:

  • OLTP (Online Transactional Processing)

  • OLAP (Online Analytical Processing)

5. 适用场景

高可用、强一致要求较高、数据规模中等或较大等各种应用场景

  • 对数据一致性及高可靠、系统高可用、可扩展性、容灾要求较高的金融行业属性的场景

  • 对存储容量、可扩展性、并发要求较高的海量数据及高并发的 OLTP 场景

  • Real-time HTAP 场景

  • 数据汇聚、二次加工处理的场景

6. 技术架构

TiDB 技术架构
  • TiDB Server: 计算层(计算最大支持 512 节点,每个节点最大支持 1000 并发)

    功能:

    • 连接客户端

    • 实现MySQL 协议(进行SQL解析、优化)

    • 生成分布式SQL 执行计划

    • 数据聚合

    特点:

    • 无状态(可直接横向扩展,通过负载均衡组件,如 LVS、HAProxy 或 F5)

    • 不存数据(只解析SQL ,将请求转发给底层TiKV/TiFlash)

    部署架构:

    • 至少1个实例
  • PD Server:集群元数据管理模块(Placement Driver),

    功能:

    • 存储集群元数据:TiKV 节点数据分布情况、集群拓扑结构

    • 提供TiDB Dashboard 管控界面

    • 分配分布式事务ID

    • 集群管理

    • 集群数据调度

    特点:

    部署架构:

  • 至少 1个实例

  • 存储节点(集群容量最大支持 PB 级别):包括TiKV(默认3副本<由pd配置,可修改>, Leader 负责读/写)、TiFlash

    TiKV Server: 行式存储

    功能:

    • 存储数据

    • 支持OLTP

    • 计算加速(通过协处理器 Coprocessor,计算请求中不会计算超过一个 Region 的数据)

    特点:

    • 自动维护多副本,天然支持高可用和故障转移:利用了Raft协议的特性

    部署架构:

    • 至少 3个实例

    TiFlash Server: 列式存储

    功能:

    • 存储数据

    • 支持OLAP (加速)

    特点:

    • 异步复制

    • 一致性

    • 智能选择

    • 计算加速

    部署架构:

    • 至少 0个实例

7. 组件

1)TiDB Server

TiDB 适合用于中等规模的 OLAP 计算,而 TiSpark (实验阶段,不适用于生产)适合大规模的 OLAP 计算

1.Database/Table元数据管理

  • 每个Database/Table都被分配唯一ID, 编码为key 时会在前面加上前缀m_ ,将信息序列化作为value 存储

  • 存储Database/Table 历史版本信息

2.表数据与Key-Value的映射

包括:

  • 每一行数据,即表数据

  • 所有表索引数据,即索引数据

每个表有一个全局唯一的整形 TableId, 每行数据有一个表级唯一 RowId, 每个索引有一个表级IndexId。

前缀编码:

tablePrefix     = []byte{'t'}
recordPrefixSep = []byte{'r'}
indexPrefixSep  = []byte{'i'}

例表:

CREATE TABLE User {
 ID int,
 Name varchar(20),
 Role varchar(20),
 Age int,
 PRIMARY KEY (ID),
 KEY idxAge (Age)
};

例数据:

1, "TiDB", "SQL Layer", 10
2, "TiKV", "KV Engine", 20
3, "PD", "Manager", 30

(1)表数据映射:

Key:   tablePrefix{TableID}_recordPrefixSep{RowID}
Value: [col1, col2, col3, col4]

例存储数据:

t10_r1 --> ["TiDB", "SQL Layer", 10]
t10_r2 --> ["TiKV", "KV Engine", 20]
t10_r3 --> ["PD", "Manager", 30]

(2)索引数据映射:

  • 唯一索引:
Key:   tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue
Value: RowID
  • 非唯一索引:
Key:   tablePrefix{TableID}_indexPrefixSep{IndexID}_indexedColumnsValue_{RowID}
Value: null

例存储数据: idxAge,假设这个索引的 IndexID 为 1,则其存储在 TiKV 上的索引数据为:

t10_i1_10_1 --> null
t10_i1_20_2 --> null
t10_i1_30_3 --> null

3.数据运算

SQL层架构

TiDB SQL层架构

分布式计算

例如:select count(*) from user where name = "TiDB"

分布式计算原理

作用:计算下推,充分利用分布式特性,降低中心计算引擎压力

2)PD Server

TiKV 集群会向 PD 汇报两类消息:

  • TiKV 节点信息

  • Region 信息

3)存储节点

支持分布式事务(默认隔离级别是SI: Snapshot Isolation(即可重复读), 通过两阶段提交保证ACID)。

存储层.png

TiKV Server: 行式数据存储。

每个 TiKV 实例中有两个 RocksDB 实例

  • 一个用于存储 Raft 日志(通常被称为 raftdb)

  • 另一个用于存储用户数据以及 MVCC 信息(通常被称为 kvdb)。

  • kvdb 中有四个 ColumnFamily:

    • raft(Region 元数据)

    • lock(事务数据)、

    • default(长度超过255的数据)

    • write(用户数据、MVCC数据)

存储架构
  1. RocksDB上层为Raft 协议
    存储原理
    • 通过Raft 完成请求日志的同步

    • 利用Raft 特性生成数据副本,保证数据强一致

  2. 底层使用RocksDB(高性能单机存储引擎,存储结构LSM-Tree
    • 存储数据的基本单元是Region ,以Region 为单位做数据扩缩容(默认96MB,每一个 Region 负责存储一个key rang的数据:startKey 和 endKey 左闭右开,每一个Regison 有一个Raft Group:Leader 与Follower 组成)

TiFlash Server: 列式存储(采用Delta Main结构<LSM-Tree 与 Delta Tree结合>)。

TiFlash 架构

注意点:

(1)TiFlash 暂时无法直接接受数据写入,任何数据必须先写入 TiKV 再同步到 TiFlash。

(2)TiFlash 以Raft Learner 角色接入 TiDB 集群,TiFlash 支持表粒度的数据同步,部署后并不会自动同步任何数据,需要按照按表构建 TiFlash 副本完成指定表的数据同步。

(3)对于创建了 TiFlash 副本的表,TiDB 优化器会自动根据代价估算选择是否使用 TiFlash 副本

(4)TiFlash 推荐使用和 TiKV 不同的节点以做到 Workload 隔离,但在无业务隔离的前提下,也可以选择与 TiKV 同节点部署。

8.与 MySQL 兼容性对比

  • TiDB 100% 兼容 MySQL 5.7 协议、MySQL 5.7 常用的功能及语法。

  • MySQL 5.7 生态中的系统工具(PHPMyAdmin、Navicat、MySQL Workbench、mysqldump、Mydumper/Myloader)、客户端等均可用于 TiDB。

  • 但 TiDB 尚未支持一些 MySQL 功能,可能的原因如下:

    • 有更好的解决方案,例如 JSON 取代 XML 函数。

    • 目前对这些功能的需求度不高,例如存储流程和函数。

    • 一些功能在分布式系统上的实现难度较大。

9. 生态工具

  • 全量导出

    工具:Dumpling

    • 输入:MySQL/TiDB 集群

    • 输出:SQL/CSV 文件

  • 全量导入

    工具:TiDB Lightning

    • 输入:Dumpling 输出文件、其他格式兼容的 CSV 文件
  • TiDB集群间增量同步

    工具:TiDB Binlog

    • 输入:TiDB 集群

    • 输出:TiDB 集群、MySQL、Kafka 或者增量备份文件

  • 全量导入、增量导入

    工具:TiDB Data Migration (DM)

    • 输入:MySQL/MariaDB

    • 输出:TiDB 集群

  • TiDB集群备份和恢复

    工具:Backup & Restore (BR)

    • 输入:TiDB 集群

    • 输出:TiDB 集群、MySQL、Kafka 或者增量备份文件

10. 数据迁入

支持数据迁入方式:
  • 从 MySQL 迁入TiDB

  • 从 CSV/SQL 文件迁入 TiDB

1) 从 MySQL 迁入 TiDB

目前推荐两种方式:

  • 使用 DM 迁移数据(适合场景:全量同步 <数据量小于1TB>、增量同步)

  • 使用 Mydumper 和 TiDB Lightning 迁移全量数据(适合场景:全量同步<数据量大于1TB>)

2) 从 CSV/SQL 文件迁入 TiDB
  • 从CSV文件迁入TiDB(适合场景:不兼容MySQL协议的异构数据库)

  • 从SQL迁入TiDB(适合场景:全量同步<数据量大于1TB>)

11.部署方式

  • 使用TiUP部署(推荐)

    场景:联网环境

  • 使用TiUP离线部署(推荐)

    场景:离线环境

  • 使用Ansible 部署(TiDB 4.0后不推荐使用)

    场景:联网环境

  • 使用Ansible离线部署(TiDB 4.0后不推荐使用)

    场景:联网环境

  • 使用TiDB Operator部署

    场景:k8s上部署运维

12.参考文档

TiDB 简介

注:本文内容为官网知识总结,不包含个人观点及理解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348