YugabyteDB 分片技术解析:Tablet Splitting 机制详解
概述
在分布式数据库系统中,数据分片(Sharding)是核心架构设计之一。YugabyteDB 作为一款高性能分布式数据库,采用独特的 Tablet Splitting(分片拆分)机制来实现数据的动态再分片。本文将深入解析 YugabyteDB 的三种分片拆分方式及其适用场景。
为什么需要 Tablet Splitting
范围查询场景
当表采用范围分片(Range Sharding)时,数据按自然排序存储。这种情况下很难预先确定合适的分片边界。例如:
CREATE TABLE census_stats (
age INTEGER,
user_id INTEGER,
...
);
对于这个表,我们无法预知:
- age 列的值范围(通常是1-100)
- 每个 age 值对应的 user_id 分布情况
低基数主键场景
当主键或索引列的基数(不同值数量)很低时,哈希分片效果不佳。例如 gender 列只有"Male"和"Female"两个值,哈希分片无法有效利用集群资源。
小表变大数据场景
某些表初始数据量小,分片数少。随着数据增长和节点增加,可能出现节点数超过分片数的情况,此时需要通过分片拆分实现集群再平衡。
三种分片拆分方式
1. 预分片(Presplitting)
在表创建时就预先划分好分片数量,适用于已知数据分布的场景。
哈希分片表
哈希分片的键空间是确定的(如2字节哈希范围是[0x0000, 0xFFFF])。创建表时可指定分片数:
CREATE TABLE customers (
customer_id bpchar NOT NULL PRIMARY KEY HASH
) SPLIT INTO 16 TABLETS;
范围分片表
范围分片需要显式指定分界点:
CREATE TABLE customers (
customer_id bpchar NOT NULL PRIMARY KEY ASC
) SPLIT AT VALUES ((1000), (2000), (3000));
2. 手动分片(Manual Splitting)
对已有数据的表进行手动分片,操作步骤如下:
- 创建测试表并插入数据
CREATE TABLE t (k VARCHAR, v TEXT, PRIMARY KEY (k)) SPLIT INTO 1 TABLETS;
INSERT INTO t SELECT i::text, left(md5(random()::text), 4)
FROM generate_series(1, 100000) s(i);
- 查看当前分片情况
yb-admin list_tablets ysql.yugabyte t
- 手动触发分片
yb-admin split_tablet <tablet_uuid>
注意:过度手动分片可能导致分片大小不均,且目前不支持分片合并。
3. 自动分片(Automatic Splitting)
从2.18.0版本开始默认启用,根据数据量自动触发分片。
分片阶段与阈值
-
低负载阶段:
- 每节点分片数 < tablet_split_low_phase_shard_count_per_node(默认1)
- 分片阈值:tablet_split_low_phase_size_threshold_bytes(默认128MB)
-
高负载阶段:
- 每节点分片数 < tablet_split_high_phase_shard_count_per_node(默认24)
- 分片阈值:tablet_split_high_phase_size_threshold_bytes(默认10GB)
-
最终阶段:
- 分片阈值:tablet_force_split_threshold_bytes(默认100GB)
分片后压缩
分片后会触发全量压缩以清理冗余数据,可能影响性能。相关调优参数:
-
yb-master标志:
- outstanding_tablet_split_limit:总待处理分片数限制(默认1)
- outstanding_tablet_split_limit_per_tserver:每节点待处理分片数限制(默认1)
-
yb-tserver标志:
- post_split_trigger_compaction_pool_max_threads:压缩线程数(默认1)
- post_split_trigger_compaction_pool_max_queue_size:待处理压缩任务队列大小(默认16)
实际应用示例
通过YCSB基准测试展示自动分片:
- 创建集群并启用自动分片
./bin/yb-ctl --rf=3 create \
--master_flags "enable_automatic_tablet_splitting=true,tablet_split_low_phase_size_threshold_bytes=30000000" \
--tserver_flags "memstore_size_mb=10"
- 创建测试表并加载数据
CREATE DATABASE ycsb;
CREATE TABLE usertable (
YCSB_KEY TEXT PRIMARY KEY,
FIELD0 TEXT, ..., FIELD9 TEXT);
- 运行YCSB工作负载并观察分片情况
当前限制
- 版本2.14.5+中,从早期版本备份恢复的范围分片索引表不支持分片
- 协同定位表(Colocated tables)暂不支持分片
- 2.14.0版本中,分片过程中的时间点恢复(PITR)有限制
总结
YugabyteDB 的 Tablet Splitting 机制提供了灵活的数据分片管理方式,从预分片到自动分片,满足不同场景需求。理解这些机制有助于优化分布式数据库的性能和扩展性。随着版本迭代,分片功能将更加强大和稳定。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考