写点什么

日增 320TB 数据,行为分析系统从 ClickHouse 迁移至 ByConity 的实践

  • 2023-07-24
    北京
  • 本文字数:2696 字

    阅读完需:约 9 分钟

日增320TB数据,行为分析系统从ClickHouse迁移至ByConity的实践

AI 大模型超全落地场景&金融应用实践,8 月 16 - 19 日 FCon x AICon 大会联诀来袭、干货翻倍!

背景介绍


ByConity 适合多种业务场景,在实时数据接入、大宽表聚合查询、海量数据下复杂分析计算、多表关联查询场景下有非常好的性能。我们用一个实际的业务场景来介绍下,这套行为分析系统是基于用户多维度行为分析平台,提供事件分析、留存分析、转化分析、用户分群、用户留存等多种分析方式和场景。本文将介绍下该用户多维度行为分析平台在使用原 ClickHouse 集群遇到的问题和挑战,以及通过迁移 ByConity 后如何解决这些问题并给业务带来的收益。

图 1 行为分析系统架构设计

问题和挑战


早期这套系统部署在 ClickHouse 集群,一方面,由于业务的高速发展导致数据量日益膨胀,每日最大新增数据超过 320TB,每日新增行数超过 2.3 万亿条,用户数据维度超过 2 万多个;另一方面,用户查询需求更加灵活和多样化,需要同时支持明细查询、聚合查询以及交互式分析查询,并快速给出响应结果。


此外,在数据量不断增加的情况下(年增长 35%),我们既要能支撑这么大的数据增量带来的挑战,又要把成本增速控制在一定范围内。


但是在已有的 ClickHouse 集群上我们很难做到。原因是 ClickHouse 是基于 Shared-Nothing 的架构,每个节点是独立的,不会共享存储资源,因而计算资源和存储资源是紧耦合的,会导致如下问题:


  • 扩缩容成本变高,且会涉及到数据迁移,使我们不能实时按需的扩缩容,而且会导致资源的浪费,成本不可控

  • 紧耦合的架构会导致多租户在共享集群环境相互影响,造成用户查询相互影响

  • 由于集群上节点的读写在同一个节点完成,导致读写相互影响

  • 在复杂查询上例如多表 Join 等操作的性能支持并不是很好,无法满足用户查询多样化的需求

技术选型


因此在 2022 年初业务开始使用计算存储分离架构的 ByConity 来作为主要的 OLAP 引擎。ByConity 是一个开源的云原生数据仓库,它采用计算存储分离的架构,支持多个关键功能特性,如计算存储分离、弹性扩缩容、多租户资源隔离和数据读写的强一致性等。通过利用主流的 OLAP 引擎优化,如列存储、向量化执行、MPP 执行、查询优化等,ByConity 可以提供优异的读写性能。

图 2 ByConity 三层技术架构图


ByConity 是在开源的 ClickHouse 架构基础上进行了升级,引入了计算与存储分离的架构,将原本计算和存储分别在每个节点本地管理的架构,转换为在分布式存储上统一管理整个集群内所有数据的架构,使得每个计算节点成为一个无状态的单纯计算节点,并利用分布式存储的扩展能力和计算节点的无状态特性实现动态的扩缩容。正是由于这种改进,使得 ByConity 具有以下重要特性:


  • 资源隔离:对不同的租户进行资源的隔离,租户之间不会受到相互影响。

  • 读写分离:计算资源和存储资源解耦,确保读操作和写操作不会相互影响。

  • 弹性扩缩容:支持弹性的扩缩容,能够实时、按需的对计算资源进行扩缩容,保证资源的高效利用。

  • 数据强一致:数据读写的强一致性,确保数据始终是最新的,读写之间没有不一致。

  • 高性能:采用了主流的 OLAP 引擎优化,例如列存、向量化执行、MPP 执行、查询优化等提供优异的读写性能

业务收益


在我们引入了 ByConity 后,整体性能可以达到 91%用户查询都可以在 10 秒内完成,通过来自用户的反馈调研,这个性能指标也是在用户可接受的范围内。这里总结下我们迁移 ByConity 带来的总体收益和经验:


  • 避免资源抢占,查询性能百分百稳定

在原来 ClickHouse 的集群上,我们经常会遇到资源挤占的问题,由于 ClickHouse 并没有做到资源隔离和租户隔离,在多个用户共用集群进行查询时,当一个用户查询资源开销非常大,会涉及资源的抢占,导致这个集群上所有共用的用户查询都不稳定,服务质量达不到满足。但在迁移到 ByConity 后,由于计算组是完全物理隔离,可以达到天然的资源隔离和租户隔离,不同用户的查询相互不受到影响,整体查询性能可以达到 91%用户查询都可以在 10 秒内完成。再者 ByConity 提供了自研的复杂查询链路,自研 Disk Cache 以减少冷数据读取,并对于高频使用的 Array 建立索引等,而且热读效率也优于原 ClickHouse 集群,相比在原 Clickhouse 集群上性能折损在 10%以内。


  • 运维成本低,故障节点秒级替换

原本在 Clickhouse 集群上,如果发现集群中某个节点坏掉,需要先下掉整台机器维修,这是因为 ClickHouse 的计算资源、存储资源、以及元数据信息都在这个节点上,相当于集群少了一个计算资源,也少了一个存储副本,在替换新的节点之前,需要把对坏掉节点的本地磁盘进行备份迁移到新的节点上,维护成本比较高,且数据一致性很难得到保障。而对于 ByConity 来讲,如果发生计算组坏掉的情况,由于计算组不存储数据,只包含无状态的计算节点,因此只需要替换新的计算组即可,数据的可靠性和一致性由 HDFS 来保障,且本地热读数据缓存的丢失对业务查询性能是可控的,这部分也主要得益于了 ByConity 存储和计算分离架构实现。


  • 无感扩缩容,节约资源成本:

ByConity 是可以实现无感扩缩容,它是一个模块化和容器化的部署,基于 Kubernetes 的弹性伸缩能力,如果有足够的机器可以无限的扩容,同时如果服务器发生故障,我们也不用担心,因为 ByConity 的节点只一个无状态的计算节点,直接下掉对整个集群影响不大。而且通过自适应调度回避慢节点,提升吞吐能力,提高节点资源利用率。同时 ByConity 的压缩率极高,以其中一个业务为例,每日新增 460TB 数据,压缩后达到 100TB,压缩比达到 65%,并支持低基数编码 & ZSTD 等等压缩方式,极端情况下存储占用小于 parquet。


  • 数据一致性强保障,维护复杂度接近为零

在迁移到 ByConity 后,我们完全解决了数据一致性问题,因为 ByConity 不存在本地的主备同步问题,数据一致性问题直接交给底层的对象存储解决,例如 HDFS/S3 等。这样对一致性维护的复杂度大大降低,错误概率也更低,目前也少有用户再反馈数据一致性问题。但在之前是经常遇到,因为 ClickHouse 集群是多个副本通过节点间通信去维护的,通过一致性队列去维护一致性问题,实现上也很复杂,容易出错。另外,ByConity 可以通过 HDFS 直接访问到数据文件,不同计算引擎适配不同连接器,即可读入数据,具备通用能力。

未来展望


通过长达一年半的实践摸索,ByConity 已经成为内部使用的主要 OLAP 引擎,后期会有大量的用户和数据迁入,最终取代原本的 ClickHouse 集群。可以看出 ByConity 作为一款计算存储分离的 OLAP 引擎,具有高性能、高可扩展性和高稳定性等优点,能够满足大规模体量的数据处理和分析的需求。同时,通过在社区的交流,以及社区发布的 Roadmap 讨论https://github.com/ByConity/ByConity/issues/26,未来阶段 ByConity 会主要聚焦在以下几个方向:


  1. 支持执行层的多 Stage 执行、ETL 能力等

  2. 支持数据湖联邦查询如 Hudi、Iceberg 等

ByConity 社区拥有大量的用户,同时是一个非常开放的社区,我们邀请大家和我们一起在 Github 上讨论共建。

GitHub:https://github.com/ByConity/ByConity

2023-07-24 17:424421

评论 2 条评论

发布
用户头像
整体性能可以达到 91%用户查询都可以在 10 秒内完成,请问下这个要求是不是有点低?
2023-07-25 09:23 · 广东
回复
这个是UBA场景,这个性能在行业这个场景下是比较高的了。看你是什么场景?例如如果是BI当然需要更高
2023-07-25 19:53 · 北京
回复
没有更多了
发现更多内容

产品经理:一款用户全量会话轨迹管理产品是怎么炼成的?

博睿数据

架构师训练营大作业

Geek_f06ede

anyRTC新春大礼包

anyRTC开发者

音视频 WebRTC RTC

图解分析:Kafka 生产者客户端工作原理

码农架构

Java 程序员 架构 kafak

Clubhouse是个啥?一夜爆火一码难求

架构精进之路

七日更 2月春节不断更 clubhouse

电子书下载|2020 年云原生年货小红书来啦!

阿里巴巴云原生

容器 微服务 开发者 云原生 k8s

怎么理解Kafka消费者与消费组之间的关系?

码农架构

Java 大数据 程序员 架构

做了6年的Android,Jetpack-MVVM-高频提问和解答,看看这篇文章吧!

欢喜学安卓

android 程序员 面试 移动开发

重磅发布 | 3.4K Star可视化神器来啦

百度开发者中心

工具 可视化 #飞桨#

Kafka在哪些场景下会造成重复消费或消息丢失?

码农架构

Java kafka 程序员 架构 消息中间件

Kafka生产者哪些重要的参数是我们需要注意的?

码农架构

Java kafka 程序员 架构 消息中间件

2021版阿里Java亿级并发设计手册:基础+数据库+缓存+消息队列+分布式+维护+实战

Java架构追梦

Java 阿里巴巴 面试 系统架构 亿级并发

即构发布 LCEP 低代码互动平台产品 RoomKit,实现互动房间0代码搭建

ZEGO即构

安卓开发在线!Android面试吃透这一篇就没有拿不到的offer!大厂内部资料

欢喜学安卓

android 程序员 面试 移动开发

函数式编程Stream接口真的有那么好用吗?

码农架构

Java 程序员 架构

“双循环”下的数字货币棋局

CECBC

数字货币

Kafka 发送消息过程中拦截器的用途?

码农架构

Java kafka 程序员 架构

重磅发布 | 2021年OpenAtom XuperChain开源技术路径

百度开发者中心

百度 #区块链#

程序员成长第四篇:程序员的职业天花板

石云升

28天写作 2月春节不断更 职场天花板

架构师训练营大作业(二)

Geek_f06ede

5分钟让你理解K8S必备架构概念,以及网络模型(上)

大数据 架构

Kafka消费者提交消费位移时提交的是当前消费到的最新消息的 offset 还是 offset+1?

码农架构

Java kafka 程序员 架构 消息中间件

JDK1.8升级这么久!Stream流的规约操作有哪些?

码农架构

Java 架构 jdk 函数编程

Elasticsearch 搜索结果解析

escray

elastic 七日更 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

【JS】事件委托

德育处主任

JavaScript 大前端 js 2月春节不断更

开发Kafka消费者客户端需要注意哪些事项?

码农架构

🎨 HTTP 协议的前世今生

飞天小牛肉

Java 程序员 面试 计算机网络 2月春节不断更

关于京东技术,你想了解的都在这里丨征文活动获奖及优秀专栏推荐

京东科技开发者

京东 征文大赛

并发队列:PriorityBlockingQueue和DelayQueue案例使用

叫练

并发编程 队列 优先级队列 条件队列 并发队列

使用logstash作为docker日志驱动收集日志

远鹏

Docker Logstash 日志系统

零基础实现Java直播(二):实现流程

ZEGO即构

日增320TB数据,行为分析系统从ClickHouse迁移至ByConity的实践_数据湖仓_王蕴博@ByConity布道师_InfoQ精选文章