StarRocks 存算分离成本优化最佳实践

2024-08-28 15:36

本文主要是介绍StarRocks 存算分离成本优化最佳实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

序言

StarRocks 存算分离借助对象存储来实现计算和存储能力分离,而存算分离版本 StarRocks 一般来说有以下三方面成本:

  1. 计算成本,也即机器使用成本,尤其是运行在公有云上时

  2. 存储成本,该部分与对象存储上存储的数据量相关

  3. API 访问成本,这部分与访问对象存储各种 API 的频率相关


优化数据导入模式

在存算分离中,我们推荐积攒更大批量的数据,使用低频大批量写入来代替高频微批写入,从而可以达到降低对象存储如 S3 的写入次数目的。同时,降低写入频次还可以降低后台数据版本 Compaction 的频率,进一步降低对象存储的写入次数,从而降低成本。

除此之外,对于某些导入模型,例如 Routine Load,我们还可以降低 Job 的并发 Task 数量来降低对象存储的写入频率,我们可以观察 BE 日志中每个 Task 的单次 KafKa 消费数据量,如果发现量较小,那我们就可以降低 并发 Task 数量来降低对象存储写入次数。

例如,下面的例子就展示了一个真实用户案例,该用户存在大量 Routine Load Job,优化之前每个 Job 的并发度为 3,导致每小时可产生约 15-20w 次 S3 PUT Object 调用请求。我们分析了它的 Job,发现每个 Task 单次只能从 Kafka 消费 数百行数据,于是我们果断调整了任务的并发数,从 3 降低为 1,通过监控我们也发现,每个 BE 节点上的 IOPS 有了明显的下降,如下图所示(约从 15:00 完成调整):

3d29e7f51415e7feab5a2603be5fa1c3.jpeg


优化分桶数

简单解释下分桶数过多对于成本的负面影响:

  1. 导入时,会将数据根据分桶键 Hash 写入所有 Tablet,每个 Tablet 都会产生 S3 的 PUT Object 调用。因此,分桶数越多,PUT Object 调用也就越多

  2. Compaction 也会产生写入,原理同上

  3. 查询时,如果使用独立的 Warehouse 服务查询,首次查询时都会访问 S3,而 Tablet 越多,产生的 S3 GET Object 请求也就相应地增加。

因此,我们也需要根据业务模式和成本来合理选择创建表时的分桶数,我们一般建议:

  1. 如果可以,尽量创建分区表

  2. 根据数据量来决定分桶数,原则上我们一般建议每 1-3GB 数据量对应一个 Tablet,当然,需要还要从业务性能层面再来测试下这种策略的分桶数是否满足性能需求


读取成本优化

云上对象存储一般也会对 GET Object 调用收费(读取带宽与读取次数),因此,我们也需要特别关注该方面的成本消耗,针对这方面,我们有以下建议:

  1. 开启 Cache,并根据业务访问模式尽量设置合适的 Cache 策略(如选择合适大小的 disk 以及 partition_duration 等参数)

  2. 在新版本(3.1.7 or 3.2.2 之后)中,开启 Block Cache,能带来更高的效率和更低的成本


存储成本优化

由于 StarRocks 使用了多版本存储机制,用户通过 show data 命令看到的表的大小与表实际在对象存储可能会有所差距,因此,我们建议用户应当特别关注在对象存储上实际占据的存储容量。

目前可能有以下几点原因会造成对象存储实际消耗超过用户 show data 看到的大小:

  1. 导入或者 Compaction 任务失败时产生了垃圾数据未清理(在后续版本包含垃圾数据自动清理能力),如果遇到该情况,可以使用社区提供的垃圾数据清理工具扫描并清理(慎重使用,避免误删数据)

  2. Compaction 或者 Vacuum 不及时造成了历史版本回收不及时,此时应该重点关注并优先解决 Compaction 跟不上的问题

无论如何,我们都建议用户在日常的巡检中特别关注对象存储实际的数据使用。

这篇关于StarRocks 存算分离成本优化最佳实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115169

相关文章

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

springboot将lib和jar分离的操作方法

《springboot将lib和jar分离的操作方法》本文介绍了如何通过优化pom.xml配置来减小SpringBoot项目的jar包大小,主要通过使用spring-boot-maven-plugin... 遇到一个问题,就是每次maven package或者maven install后target中的ja

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件