小编导读:
计算资源使用率提高 20%,存储成本降低 40%。
数据建模工作减少,开发效率提升 20%。
新集群部署时间缩短至 1 小时内。
背景
架构1.0
架构1.0
计算资源浪费:潮汐现象导致资源利用率低,按峰值申请的计算资源经常闲置。 存储数据冗余:数据需额外同步,多副本存储加剧浪费。 可靠性挑战:数据同步复杂,扩容延迟影响用户体验。
架构2.0
架构2.0
在“降本增效”的大背景下,多点 DMALL 大数据部门于 2023 年完成了以“数据湖”为核心的大数据平台升级(详见 [1]),引入云原生、存算分离和湖仓一体等新技术。升级后的平台架构如下图所示:



降低计算成本:StarRocks 计算负载的高峰期集中在白天,Apache Spark 等离线计算负载的高峰期集中在晚上,从宏观上看,可共享同一批资源。按需分配资源显著提升了整体利用率,降低了计算成本。 降低存储成本:StarRocks 支持将内部表存储在兼容 S3 协议的对象存储中,以按需付费模式大幅降低存储成本。此外,可直接读取 Apache Hive 和 Apache Iceberg 中的数据,减少冗余存储,进一步节省成本。 保证查询性能:通过本地磁盘缓存,StarRocks 在存储分离架构下的查询性能媲美存算一体。同时,基于 Kubernetes 的 HPA 机制,动态调整资源分配,优化用户体验。
应用场景
在完成数据平台架构升级后,我们对增量和部分存量业务进行了改造适配。
多点的数据分析场景主要分为离线 T+1 更新分析和实时更新分析两类。在这两类场景中,我们均采用了新架构进行改造和适配。
T+1 更新分析场景
T+1 更新分析场景

在充分利用本地 SSD 缓存、自定义刷新缓存逻辑、以及 Kubernetes HPA 弹性扩容的基础上,StarRocks 存算分离模式的查询速率可以达到存算一体的效果,个别大 SQL 在 StarRocks 集群弹性增加 Computer Node Pod 之后,查询速度甚至比存算一体要快一些。以下是“存算一体+内表”和“存算分离+外表” 真实业务场景的对比测试结果(横坐标为查询 SQL,纵坐标为响应时长)

实时更新分析场景
实时更新分析场景

收益
从最终效果来看,多点 DMALL 大数据平台引入 StarRocks 的存算分离架构、Lakehouse (外表查询)与 StarRocks on Kubernetes 等特性,在保证存量业务查询性能无影响的前提下,达到了如下收益:
机器成本降低:通过引入存算分离的特性,利用“数据持久化使用按需付费的对象存储”、“本地 SSD 盘只用于查询加速”、“计算节点弹性扩缩容” 等特性,整体计算资源使用率提高20%,存储成本降低超过40%; 开发效率提高: 通过采用 External Catalog 直接查询 Iceberg 数据源,数据工程师无需再手动建内表,减少了数据建模的工作量,开发效率提高了20%; 运维效率提高: 通过采用 StarRocks on Kubernetes 的特性,在部署维护新集群时,无需再手动部署,只需通过 YAML 文件配置即可实现集群的自动部署,提高了运维效率。目前客户私有化环境部署一套新集群,只需要准备好对象存储服务以及 Kubernetes 集群,可以在1小时内完成集群的部署交付。
实践经验
每次技术升级都伴随“阵痛”,架构变化和新特性使得升级过程像是重新学习新引擎,过程中遇到许多挑战,也积累了宝贵经验。本篇文章将秉持技术开源共享的精神,从 Lakehouse(存算分离外表)、Shared Data(存算分离内表)、StarRocks on Kubernetes(部署)等方面总结经验,与大家分享。
Lakehouse
1.1 统一数据湖鉴权
StarRocks on Kubernetes 原生支持对接 LDAP 登录及 Apache Ranger 的鉴权。但是为了提升鉴权效率与灵活性,在大数据集群进行升级时我们就已经重构了集群权限体系。

在使用 StarRocks on Kubernetes 之前,我们对 FE 中相关代码进行了调整,对接司内的登录和鉴权逻辑,达到了统一管控的效果。
添加自定义登录接口及实现类,对接司内 UniDATA 大数据平台统一登录,无需管理不同引擎的登录信息。 简化 StarRocks 的管理权限设计。根据过往司内使用经验,将除库表数据外的其它权限(建立 Catalog、删除 BE 节点、动态修改 FE 配置等)合并为统一的管理权限。并在集群建立时分配给单独的部门组织账户,用于日常管理维护。 将库表数据权限,不论外表还是内表,均对接 Ranger 的 Hadoop Table(Hive)模块进行管控。外表可直接对接,内表设计特殊权限数据结构进行对接。这样的做法不但降低权限管理复杂度,也使数据权限在数据湖层面达成了统一。
1.2 统一查询入口
为提升客户端使用数据模型的灵活性,我们在不改变原有 SQL 的前提下,实现了数据表存储引擎和 Catalog 的路由切换。在 StarRocks 与客户端之间,增加了自研查询代理引擎 MixDB Proxy。该引擎维护逻辑库与查询引擎、Catalog、物理库的映射信息,支持按需切换存储引擎、Catalog 和库。同时,MixDB Proxy 具备鉴权、限流、降级、资源统计、查询审计等功能,不仅大幅减少业务端切换存储引擎的工作量,还保障了查询服务的稳定性。

1.3 优化本地缓存
切换湖表及充分利用缓存
StarRocks 存算分离版本的核心特性之一是支持对 Apache Iceberg 等湖表的查询。升级前,BI 报表全部使用 StarRocks 内表;升级后,大部分数据查询切换为 Apache Iceberg 湖表。这一改进不仅减少了数据冗余,还省去了单独同步 StarRocks 的任务设置,显著降低了运维压力。不过,直接查询湖表的速度较内表慢,所幸新增的本地磁盘缓存特性大幅缩小了这一差距。
以下是缓存使用的核心配置:
Properties
# 启用缓存功能
datacache_enable = true
# 湖表元数据刷新频率,默认10min,这个参数也控制了湖表数据异步刷新的频率
background_refresh_metadata_interval_millis = 600000
定时刷新缓存
尽管 StarRocks 提供了预热功能,但需要设置明确的库表和过滤条件。作为多点 DMALL 大数据基础层,我们面对几十个 StarRocks 集群,每个客户的需求各不相同,难以统一设计和管理这些预热任务。经过讨论,我们决定自研缓存刷新工具。该工具以 Kubernetes 上的 CronJob 作为载体,支持每日定时预刷新缓存,大幅提升了 BI 分析应用用户的使用体验。

缓存刷新工具每日从 AuditLoader Table 中获取最近一段时间的查询 SQL,进行统计和分析。通过解析、拆分与重组,初步整理出查询相关的库表和过滤条件。基于过往查询行为,工具采用统计学习的方法,预测下一日可能的查询数据范围,并据此改写和优化查询条件。
为应对缓存目录容量有限可能触发的 LRU 缓存淘汰问题,工具会根据查询频率对库表进行排序,将高频库表排在最后执行。最终,工具将优化后的查询条件转化为 SQL,并打上标签执行缓存刷新。
1.4 升级开发模式
之前采用 DataLake + Warehouse 分层架构(以 Apache Iceberg + StarRocks 为例)时,可以在对 Apache Iceberg 表的 Schema 或加工逻辑进行修改后,经过充分验证,再将结果数据同步至 StarRocks。在 Apache Iceberg 的逻辑调整及数据重跑过程中,StarRocks 的查询不受影响。
然而,在升级为 Lakehouse 架构后,若修改了 Apache Iceberg 的逻辑,并对原表执行 Insert Overwrite 操作,StarRocks 的查询将立即感知到数据变化。但在数据尚未经过充分验证的情况下,可能会引发数据质量问题。
由于我司采用 Apache Iceberg 作为数据湖的表结构,我们通过 Apache Iceberg 提供的 branch 特性有效解决了这一问题。具体而言,StarRocks 在通过 External Catalog 查询 Apache Iceberg 表时,默认访问的是 main branch。
当需要对现有 Apache Iceberg 表的加工逻辑进行修改时,我们基于现有的 main branch 新建了 audit-branch,在 audit-branch 进行迭代升级。验证通过后,将 audit-branch 的变更合并回 main branch。
最后,通过以下命令对 StarRocks 的本地 SSD 缓存进行强制更新。
REFRESH EXTERNAL TABLE [external_catalog.][db_name.]<table_name> [PARTITION ('partition_name', ...)]

存算分离 Shared Data
存算分离 Shared Data
2.1 云原生主键索引
主键索引带来的磁盘压力
幸运的是, StarRocks v3.3.2 版本支持将主键索引写入对象存储,同时利用缓存进行索引预热。通过将集群升级到 v3.3.2,并对主键的列数和长度进行了优化,选用了占用内存较少的数据类型(如 INT、BIGINT 等),我们有效缓解了磁盘容量压力问题。
具体来看,在升级前,当我们搭建集群并接入仅有100张内表时,配备5个 CN节点,每个节点挂载60GB的云磁盘,集群的磁盘容量已经面临严重瓶颈。而在升级到 v3.3.2 后,我们将每个节点的磁盘容量缩小至20GB,将大量的主键索引写入对象存储,节省了约 80% 的存储成本。更重要的是,后续接入新的内表时,我们无需担心磁盘压力或额外申请资源。在通过适当的参数调优后,集群运行更加稳定,极大地释放了运维压力。
Properties
# 修改表的属性,支持基于对象存储上的持久化索引
"enable_persistent_index" = "true",
"persistent_index_type" = "CLOUD_NATIVE"
2.2 Compaction 调优
Compaction 临时文件带来的磁盘压力
在集群搭建时,考虑到写多读少的场景,且加速要求不高、缓存需求量较小,为了控制成本,我们将每个 CN 节点的磁盘容量限制在 20GB。然而,当写入数据量增加时,compaction 和缓存争抢资源的问题变得尤为突出。
为了解决这一问题,我们首先尝试了调整缓存和 compaction 相关的参数,包括控制缓存占用的磁盘容量、提高 compaction 的并发度和执行效率,并增加单磁盘 compaction 线程的数量。这些调整暂时稳定了集群,但在 CN 节点扩缩容的过程中,我们仍然遇到临时文件过大导致磁盘崩溃的问题。
经过进一步分析和社区帮助,我们意识到有些参数仅适用于存算一体的场景,而我们的集群是基于存算分离架构 的。最终,通过设置 enable_light_pk_compaction_publish 参数,彻底终结了“磁盘争夺战”。
# 关闭轻量级主键表compaction的设置,关闭后,compaction临时crm文件不会再写入/cn/storage/tmp,这对于我们这样的小磁盘环境非常重要
enable_light_pk_compaction_publish = false
# 允许vertical compaction时将临时数据写到磁盘。
lake_enable_vertical_compaction_fill_data_cache = true
# 主键表单次compaction可以合并的最大数据比例。调大比例,提升总体速度。
update_compaction_ratio_threshold = 0.8
# compaction时远程读Buffer的大小,默认1M,扩大该值,提升总体速度
lake_compaction_stream_buffer_size_bytes = 5242880
StarRocks on Kubernetes
StarRocks on Kubernetes
3.1 按场景拆分小集群
场景拆分,按需部署小集群:
大数据基座部门承担起类“DBA”的职责,根据需求为每个部门或使用场景快速拉起专属的 StarRocks 小集群。小集群间通过 Kubernetes Namespace 实现资源隔离,每个集群可以根据特定场景进行自定义配置。即使某个集群出现突发状况,也不会对其他集群的正常使用造成影响。
共享湖表,统一查询结果:
每个小集群持有各自的内表,但共享一份 Apache Iceberg 湖表。无论用户从哪个小集群查询 Apache Iceberg 湖表,结果始终一致。
自助运维与统一管理结合:
每个集群设有专属的“集群管理员”角色,支持部门自助进行集群内的管理操作。与此同时,大数据基座部门作为“超级管理员”,统一掌控底层资源和权限,在需要时提供支撑服务。这种分工设计减轻了单点运维压力,提高了整体效率。
3.2 元数据备份与恢复
如果出现 Kubernetes 机器重启等极端异常情况导致的 FE 元数据丢失,备份数据就派上用场了。恢复工具以 Kubernetes 的 Init Container 为载体,根据配置信息在 FE Container 正式启动前,恢复备份元数据到元数据目录, FE 启动后可正常使用集群。
虽然该工具的设计初衷是应对 Kubernetes 集群异常导致的 FE 元数据丢失,但上线后更多地被应用在实际的迁移或重装场景,如 CRD 限制导致无法修改配置或集群迁移等。

3.3 自定义弹性扩缩容
为了解决这一问题,我们基于 Kubernetes 的特性设置 CronJob 来解决这个问题。通过分析历史监控日志数据,我们制定了以下方案:
白天扩容:在用户高峰期到来之前,CronJob 会自动调整 CN Pod 的最小数量,提前完成扩容,全天保持这一最小 Pod 数,支撑大部分 BI 分析查询。 夜间缩容:在用户使用量锐减后,CronJob 会将 CN Pod 的最小数量下调,HPA 逐步触发缩容,释放资源供夜间的入湖、数据同步、数仓构建等离线任务使用。

3.4 解决数据写入与 HPA 的冲突
这一问题的根本原因在于 CN Pod 的关闭流程顺序:通知 FE Pod 的步骤被放在了后面,而此时 Kubernetes 已将 CN Pod 标记为 Terminating 状态,导致无法正常接收请求。
Prolog |
我们利用 Kubernetes 的 Lifecycle 特性,通过配置 PreStop Hook,在 CN Pod 进入 Terminating 状态之前,优先通知 FE Pod 删除该 CN Pod 的连接信息,再进行后续关闭步骤。
例子:
YAML
lifecycle:
preStop:
exec:
command:
- sh
- '-c'
- >-
mysql -h$FE_SERVICE_NAME.$POD_NAMESPACE.svc.cluster.local -P9030 -uroot -ppwd -e "ALTER SYSTEM DROP COMPUTE NODE'$HOSTNAME.starrocks-cn-search.$POD_NAMESPACE.svc.cluster.local:9050'";
sh /opt/starrocks/cn_prestop.sh
总结
在 StarRocks 的升级之路中,我们曾尝试压缩单个 CN Pod 的内存,扩大 CN Pod 的数量,以提升 Kubernetes Node 的装箱率。但测试后发现,这种优化方式并不适用于 StarRocks。即使是在 Kubernetes 部署模式下,StarRocks 也需要配置较大内存和 CPU 的 Pod 来保证服务质量。
后续规划
StarRocks 引入 Serverless容器(如火山云 VCI/华为云 CCI/阿里云 ECI)支持 CN 弹性,充分利用 ResourcePolicy方 式,优先利用 Kubernetes 固定池资源,不足时使用弹性资源,真正实现按需付费和秒级弹性,避免固定节点规格难以提升装箱率; 增强 StarRocks 自身运营功能,如健康诊断、SQL 调优、资源成本报表等; 考虑如何更智能优化 StarRocks 异步物化视图(AutoMV),用于数据仓库构建等; 引入 Paimon 等新的湖仓格式,针对实时更新、实时查询的场景,考虑采用“仓冷沉湖”的方式接入湖表。
文章参考
https://juicefs.com/zh-cn/blog/user-stories/separation-of-storage--computing-building-cloud-native-big-data-platform
李铭,多点 DMALL 资深大数据研发工程师,目前负责公司大数据云原生架构设计与数据基座新特性研究;研究领域为大数据统一 SQL 网关、分布式文件存储、高性能计算、数据安全等。大数据开源社区爱好者,重点关注多个开源项目Apache Kyuubi、JuiceFS、Apache Celeborn、StarRocks 等在司内的适配和应用。
关于 StarRocks
StarRocks 是隶属于 Linux Foundation 的开源 Lakehouse 引擎 ,采用 Apache License v2.0 许可证。StarRocks 全球社区蓬勃发展,聚集数万活跃用户,Github 星标数已突破 9500,贡献者超过 450 人,并吸引数十家行业领先企业共建开源生态。
StarRocks Lakehouse 架构让企业能基于一份数据,满足 BI 报表、Ad-hoc 查询、Customer-facing 分析等不同场景的数据分析需求,实现 "One Data,All Analytics" 的业务价值。StarRocks 已被全球超过 500 家市值 70 亿元人民币以上的顶尖企业选择,包括中国民生银行、沃尔玛、携程、腾讯、美的、理想汽车、Pinterest、Shopee 等,覆盖金融、零售、在线旅游、游戏、制造等领域。

行业优秀实践案例
泛金融:中国民生银行|平安银行|中信银行|四川银行|南京银行|宁波银行|中原银行|中信建投|苏商银行|微众银行|杭银消费金融|马上消费金融||中信建投|申万宏源|西南证券|中泰证券|国泰君安证券|广发证券|国投证券|中欧财富|创金合信基金|泰康资产|人保财险
互联网:微信|小红书|滴滴|B站|携程|同程旅行|芒果TV|得物|贝壳|汽车之家|腾讯大数据|腾讯音乐|饿了么|七猫|金山办公|Pinterest|欢聚集团|美团餐饮|58同城|网易邮箱|360|腾讯游戏|波克城市|37手游|游族网络|喜马拉雅|Shopee
新经济:蔚来汽车|理想汽车|吉利汽车|顺丰|京东物流|跨越速运|沃尔玛|屈臣氏|麦当劳|大润发|华润集团|TCL |万物新生|百草味|多点 DMALL|酷开科技|vivo|聚水潭|泸州老窖|中免集团|蓝月亮|立白|美的|伊利|公牛




