StarRocks 存算分离 Compaction 原理

前言

StarRocks 中每次数据摄入都会生成一个新的数据版本,而查询时需要将所有版本数据进行合并才能获得一个正确的结果,如果历史数据版本太多,那么查询时需要读取的文件数也会很多,造成查询效率低下。因而 StarRocks 存在内部任务定期将历史数据版本进行整合,消除重复数据记录,我们称之为 Compaction。

Compaction 是为了将不同版本的数据文件进行整合,合并成大文件的动作,减少系统中小文件数量,进而提升查询效率。相比于存算一体表,StarRocks 存算分离实现了新的 Compaction 调度机制,表现为:

  1. Compaction 调度由 FE 发起,BE执行。FE 按照 Partition 为单位来发起 Compaction 任务
  2. Compaction 会生成一个新版本,也走导入的写数据、commit、publish version 这套完整流程

本文旨在描述 StarRocks 存算分离表 Compaction 基本实现原理,帮助开发和运维人员能更好地理解并根据实际需要调整 Compaction 相关配置,以在实践中取得更好地效果。

背景介绍

前面说过,每次导入都会在 FE 内生成一个新版本,而该版本被标记在 Partition 之上。一旦导入事务成功提交,便会更新 Partition 的可见数据版本号,Partition 的数据版本号单调递增。

需要注意的是,一个 Partition 内可能存在多个 Tablet,这些 Tablet 都共享相同的数据版本号,即使一次导入可能只涉及其中部分 Tablet,一旦导入事务成功提交,Partition 下所有的 Tablet 的版本都会相应地得到提升。

3662fc2365bb765e4e34aaa411df7f57.jpeg

例如上图中,Partition X 内含 Tablet 1 ~ N,当前的可见版本为12,一旦产生新的导入事务 New Load Txn,且该事务成功提交,那么 Partition X 的可见版本就变成了 13。

基本框架

StarRo

<think>好的,我现在需要详细解释StarRocks的写入流程和原理。用户之前已经询问过存储原理,现在转向写入过程,可能需要结合之前的回答中的引用内容,特别是引用[2]和[3],因为它们提到了Stream Load事务接口和Compaction机制。首先,我需要回顾用户提供的引用内容。引用[2]提到StreamLoad事务接口的实现,其中涉及内存攒批和flush,以及检查点机制。引用[3]则讨论了数据提交后形成小rowset,并通过Compaction合并成更大的segment。这些应该都是写入流程中的关键步骤。 接下来,我需要将写入流程分解为几个阶段。可能包括客户端提交、数据缓冲、事务管理、数据持久化、Compaction等部分。需要详细说明每个阶段的作用,比如如何保证数据一致性,如何提高写入效率。然后,结合用户之前的问题,他们可能关心主键模型下的写入如何处理,比如内存索引的使用。此外,存算分离模式下的写入是否有所不同,是否需要考虑冷热数据的分层策略。 还需要解释写入过程中的关键组件,比如FE和BE的分工。FE可能负责元数据管理和事务协调,而BE处理实际的数据写入和存储。例如,在StreamLoad中,客户端将数据发送到BE,BE进行缓冲和预处理,然后FE协调提交事务。 另外,Compaction的作用不可忽视,它影响查询性能和存储效率。需要说明异步Compaction如何合并小的rowset,减少碎片,提升读取速度。这可能涉及两种Compaction类型:cumulative和base,分别处理不同规模的数据合并。 还要考虑数据版本管理和多版本控制,每次写入生成新版本,旧版本如何回收。垃圾回收机制如何工作,避免影响查询性能。最后,可能需要给出配置建议,比如调整Compaction参数,优化写入批次大小,或者如何设置事务标签来避免重复提交。这些实际调优的点能帮助用户更好地应用StarRocks。 需要确保回答结构清晰,分步骤解释,并适当引用提供的资料,比如在提到事务提交时引用[2],在Compaction部分引用[3]和[1]。同时,生成的相关问题要围绕写入流程的各个方面,如事务管理、Compaction优化、数据一致性保证等。</think>### StarRocks 写入流程详细原理 StarRocks 的写入流程通过**事务管理**、**内存缓冲**和**异步合并**三大机制实现高吞吐与低延迟,以下是其核心原理: --- #### 一、写入流程架构 1. **客户端提交** - 支持多种写入方式(Stream Load/Broker Load/Routine Load),以 Stream Load 为例: ```bash # 示例:通过 curl 提交 Stream Load curl -X POST -H "label:${LABEL}" -H "Expect:100-continue" -T data.csv http://fe_host:http_port/api/db/table/_stream_load ``` - 每个写入请求需指定唯一事务标签(`label`),避免重复提交[^2] 2. **FE 协调事务** - Frontend(FE)分配事务 ID 并协调多个 Backend(BE)节点 - 维护事务状态(Prepare/Commit/Abort),保证 ACID 特性 --- #### 二、核心处理机制 1. **内存缓冲与攒批** - BE 节点将数据暂存至内存缓冲区(默认 256MB) - 触发写入的条件: - 缓冲区达到阈值 - 超时时间(默认 5s) - 手动 Flush 操作[^2] - 内存缓冲减少磁盘 I/O,提升吞吐量 2. **数据持久化** - 内存数据以 Rowset(数据版本单元)形式刷写到磁盘 - 每个 Rowset 包含: - 数据文件(按列存储) - 删除标记文件(用于主键更新) - 元数据文件(记录版本号、统计信息)[^3] 3. **主键模型处理** - 内存索引(Primary Index)实时更新,支持 Upsert 操作 - 索引结构: - 主键哈希映射(存储主键 -> Rowset 位置) - 写入时先查询索引,标记旧数据为删除状态[^2] --- #### 三、异步 Compaction 机制 1. **多级合并** | Compaction 类型 | 作用 | 触发条件 | |-------------------|------------------------------|---------------------| | Cumulative Compaction | 合并小 Rowset(< 100MB) | 小文件数量阈值(默认 5) | | Base Compaction | 合并大 Rowset 形成 Segment | 总文件大小阈值(默认 1GB)[^3] | ```text # Compaction 过程示例 原始数据 → Rowset_v1 (10MB) ↓ Cumulative Compaction → Rowset_v2 (50MB) ↓ Base Compaction → Segment (1GB) ``` 2. **优化效果** - 减少查询时的文件扫描数量 - 提升列存压缩率(合并后相同列数据连续存储) - 清理过期版本数据,释放存储空间[^1] --- #### 四、事务一致性保障 1. **两阶段提交协议** - **Prepare 阶段**:所有 BE 节点完成数据写入 - **Commit 阶段**:FE 广播提交指令,更新元数据版本号[^2] 2. **版本可见性** - 新数据版本提交后,查询自动路由到最新版本 - 旧版本数据保留至 GC 周期结束(默认 24h) --- #### 五、写入性能优化建议 1. **批次控制** - 单批次写入量建议 100MB-1GB - 过小批次导致频繁 Compaction - 过大批次增加内存压力 2. **并发配置** ```sql -- 调整 BE 写入线程数 SET GLOBAL write_thread_num = 16; ``` --- ### 相关问题 1. 如何调整 Cumulative Compaction 的触发阈值以优化写入性能? 2. Stream Load 的事务标签(label)重复提交会产生什么后果? 3. 主键模型的 Upsert 操作如何保证数据一致性? 4. 如何监控 StarRocksCompaction 任务状态? 5. 写入过程中 BE 节点故障如何处理? [^1]: 存算分离 Compaction 调优指南 [^2]: Stream Load 事务接口实现原理 [^3]: 异步 Compaction 数据合并机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值