YugabyteDB 分片技术解析:Tablet Splitting 机制详解

YugabyteDB 分片技术解析:Tablet Splitting 机制详解

yugabyte-db yugabyte/yugabyte-db: 是 YugaByte DB 的官方仓库,一个高性能、高可扩展、分布式的 SQL 数据库,支持 PostgreSQL 兼容性。适合对分布式数据库、SQL 数据库和云原生应用的开发者。 yugabyte-db 项目地址: https://gitcode.com/gh_mirrors/yu/yugabyte-db

概述

在分布式数据库系统中,数据分片(Sharding)是核心架构设计之一。YugabyteDB 作为一款高性能分布式数据库,采用独特的 Tablet Splitting(分片拆分)机制来实现数据的动态再分片。本文将深入解析 YugabyteDB 的三种分片拆分方式及其适用场景。

为什么需要 Tablet Splitting

范围查询场景

当表采用范围分片(Range Sharding)时,数据按自然排序存储。这种情况下很难预先确定合适的分片边界。例如:

CREATE TABLE census_stats (
    age INTEGER,
    user_id INTEGER,
    ...
);

对于这个表,我们无法预知:

  1. age 列的值范围(通常是1-100)
  2. 每个 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)

对已有数据的表进行手动分片,操作步骤如下:

  1. 创建测试表并插入数据
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);
  1. 查看当前分片情况
yb-admin list_tablets ysql.yugabyte t
  1. 手动触发分片
yb-admin split_tablet <tablet_uuid>

注意:过度手动分片可能导致分片大小不均,且目前不支持分片合并。

3. 自动分片(Automatic Splitting)

从2.18.0版本开始默认启用,根据数据量自动触发分片。

分片阶段与阈值
  1. 低负载阶段

    • 每节点分片数 < tablet_split_low_phase_shard_count_per_node(默认1)
    • 分片阈值:tablet_split_low_phase_size_threshold_bytes(默认128MB)
  2. 高负载阶段

    • 每节点分片数 < tablet_split_high_phase_shard_count_per_node(默认24)
    • 分片阈值:tablet_split_high_phase_size_threshold_bytes(默认10GB)
  3. 最终阶段

    • 分片阈值: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基准测试展示自动分片:

  1. 创建集群并启用自动分片
./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"
  1. 创建测试表并加载数据
CREATE DATABASE ycsb;
CREATE TABLE usertable (
    YCSB_KEY TEXT PRIMARY KEY,
    FIELD0 TEXT, ..., FIELD9 TEXT);
  1. 运行YCSB工作负载并观察分片情况

当前限制

  1. 版本2.14.5+中,从早期版本备份恢复的范围分片索引表不支持分片
  2. 协同定位表(Colocated tables)暂不支持分片
  3. 2.14.0版本中,分片过程中的时间点恢复(PITR)有限制

总结

YugabyteDB 的 Tablet Splitting 机制提供了灵活的数据分片管理方式,从预分片到自动分片,满足不同场景需求。理解这些机制有助于优化分布式数据库的性能和扩展性。随着版本迭代,分片功能将更加强大和稳定。

yugabyte-db yugabyte/yugabyte-db: 是 YugaByte DB 的官方仓库,一个高性能、高可扩展、分布式的 SQL 数据库,支持 PostgreSQL 兼容性。适合对分布式数据库、SQL 数据库和云原生应用的开发者。 yugabyte-db 项目地址: https://gitcode.com/gh_mirrors/yu/yugabyte-db

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时飞城Herdsman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值