在 Doris 中,什么是 Tablet(数据分片)?它与 Partition(分区)、Bucket(分桶)之间的物理与逻辑关系是怎样的?
在 Apache Doris 中,数据的分布采用了两级分区(Two-Tier Partitioning)机制,即Partition(分区)和 Bucket(分桶)。而 Tablet(数据分片) 则是这一机制下产生的最终物理产物。
为了让你清晰地理解它们,我们可以从“定义”和“关系”两个方面来拆解。
一、 什么是 Tablet(数据分片)?
Tablet 是 Doris 中最小的物理存储单元、数据管理单元和副本(Replica)管理的单元。
- 物理载体:Doris 并没有所谓的“表级文件”或“分区级文件”。你存入 Doris 的每一条数据,最终都会真实地保存在某一个 Tablet 中。一个 Tablet 在底层对应 BE(Backend)节点磁盘上的一个或多个数据文件(Segment 文件)。
- 高可用单位:Doris 的多副本机制(通常是 3 副本)是作用在 Tablet 级别的。Doris 会将一个 Tablet 的 3 个副本分散存储在不同的 BE 节点上,以保证数据的高可用。
- 扩容与均衡单位:当集群增加新的 BE 节点时,Doris 会自动将部分旧节点上的 Tablet 迁移到新节点上,实现存储和计算的负载均衡。
二、 Partition、Bucket 与 Tablet 的逻辑与物理关系
在 Doris 中,这三者的关系可以用一个公式来概括:1 个 Tablet = 1 个特定的 Partition + 1 个特定的 Bucket
1. 逻辑关系:从宏观到微观
从逻辑层面上看,它们是包含与被包含的层级关系:
- Table(表):最高逻辑层级。
- Partition(分区):第一级划分(逻辑层面)。
- 通常按照时间或连续的值范围(Range/List)进行划分。
- 作用:方便数据的生命周期管理(例如按天建分区,直接 Drop 掉过期数据的分区,非常轻量级);在查询时可以通过分区裁剪(Partition Pruning)快速过滤掉不相关的数据。
- Bucket(分桶):第二级划分(逻辑机制)。
- 在每个 Partition 内部,数据会根据指定的分桶列(通常是主键或高基数列)的 Hash 值再次被打散,分成多个 Bucket。
- 作用:将数据均匀地分布到集群的各个机器上,避免数据倾斜,并在查询时实现高度并发(多个机器同时处理各自 Bucket 里的数据)。
2. 物理关系:Tablet 是交集的实体
在 DDL 建表语句中,我们只能定义 Partition 和 Bucket,看不到 Tablet 这个词。但在物理层面,Partition 和 Bucket 的交集,就生成了 Tablet。
你可以这样理解它们的物理生成过程:
- 你建立了一张表,按“月”分了 12 个 Partition(1月到12月)。
- 你规定每个 Partition 内部按照用户 ID 哈希分成 10 个 Bucket(0号到9号桶)。
- 在物理层面上,Doris 会在集群中生成
12 × 10 = 120个 Tablet。 - 如果你设置了 3 副本,那么集群磁盘上总共会有
120 × 3 = 360个 Tablet 副本。
3. 数据写入的路由过程(物理映射)
当一条数据(例如:时间 2023-10-01,用户 ID 9527)写入 Doris 时:
- 第一步(找 Partition):Doris 检查时间
2023-10-01,决定把数据放入 “10月分区”。 - 第二步(找 Bucket):Doris 对用户 ID
9527进行 Hash 计算,然后对 10 取模,假设结果是 “3号桶”。 - 第三步(落入 Tablet):数据最终被写入到了属于 [10月分区 - 3号桶] 这个特定的 Tablet 中。
- 第四步(多副本同步):这个 Tablet 的数据会被同步到它对应的 3 个 BE 节点副本上。
三、 通俗的类比
为了加深理解,我们用“图书馆”来打个比方:
- Table(表) = 整个图书馆。
- Partition(分区) = 图书馆里的楼层或房间(例如:2023年出版的书放1楼,2024年的放2楼)。这是为了按年份快速找书,或者年底直接清空某一层楼的旧书。
- Bucket(分桶规则) = 房间里的书架编号(例如:按书名的拼音首字母,均匀分配到 10 个书架上)。这是为了让找书的人(CPU)可以分散开,大家同时去不同的书架找书,提高效率。
- Tablet(数据分片) = 真实存在的某个木头书架(例如:“1楼的3号书架”就是一个物理存在的 Tablet)。如果1楼太挤了,管理员(Doris 系统)会把“1楼的3号书架”整个搬到另一个空旷的房间(BE 节点扩容时的 Tablet 迁移)。
总结
- Partition 决定了数据在逻辑上的边界(按范围裁剪)。
- Bucket 决定了数据在计算上的并行度(按 Hash 打散)。
- Tablet 是前两者结合后在底层磁盘上的物理化身,是 Doris 分布式调度的基石。
右滑查看面试常问