开源云原生数仓引擎ByConity 存储计算分离架构和优势

news2025/2/27 14:13:47

供稿 | ByConity技术团队

出品 | CSDN 云计算

ByConity是一款字节跳动开源的云原生数仓引擎。它的一个重要优势是采用存储计算分离的架构,实现了读写分离和弹性扩缩容。这种架构确保读操作和写操作不会相互影响,使得计算资源和存储资源解耦,两者可以按需的且独立的扩缩容,确保资源高效利用,同时保证数据读写的强一致性。此外,ByConity支持多租户资源隔离功能,保证不同租户之间不会互相影响,更加适合多租户环境,同时ByConity采用主流的OLAP引擎优化,提供更加优异的读写性能。

一、ByConity技术背景

ClickHouse是一个开源的列式数据库管理系统,它采用Shared-Nothing的架构,这种架构有以下典型特点:

  • 每个节点独立管理一部分数据

  • 节点之间没有数据共享

  • 存储和计算紧耦合

它的查询执行大致分为两个阶段。第一阶段是每个节点独立处理它管理的数据分片,负责I/O、查询和计算。第二阶段是Coordinator节点将第一阶段每个节点计算的结果进行默认汇总,然后返回给客户端。这种架构可以实现高性能和可扩展性,特别适合固定业务规模的情况下进行高并发查询。同时,由于节点之间无数据共享,扩展性也比较容易实现,可以实现线性扩展。

图 1 Clickhouse架构

但在实际使用过程中,我们发现如下问题:

  • 扩缩容代价高:对于快速发展的业务,需要频繁进行扩容操作,而数据的reshuffle以及数据搬迁会影响实际读写操作

  • 多租户之间可能会互相影响:不同业务之间可能会有不同的业务特征,导致某些业务在特定时间点上占用了整个集群的资源池,影响其他租户

  • 读写操作受到影响:每个节点都必须负责一部分读写任务,当节点资源使用较多时,查询性能可能会受到影响

  • 资源使用情况会存在浪费:特别是在多个中小型业务共用同一个集群的情况下,可能会存在资源预估不足或者其他情况导致资源浪费

二、ByConity架构介绍

基于以上使用过程中发现的问题,我们在开源的ClickHouse架构基础上进行了升级,引入了计算与存储分离的架构,将原本计算和存储分别在每个节点本地管理的架构转换为在分布式存储上统一管理整个集群内所有数据的架构,使得每个计算节点成为一个无状态的单纯计算节点,并利用分布式存储的扩展能力和计算节点的无状态特性实现动态的扩缩容。此外,该架构还支持多租户隔离和读写任务的分离。实现了以下优势:

  • 高弹性、高扩展性:计算和存储独立扩缩容

  • 多租户隔离:不同租户使用不同计算组

  • 读写分离:读写使用不同的计算资源

存储计算分离架构

从总体架构上讲,ByConity的存储计算分离架构如图3所示,主要分为三层:共享服务层、计算层和云存储层。

  • 共享服务层:主要组件是Cloud Service,是所有查询的入口,会对查询进行解析和优化,生成Query Plan然后下发给计算层处理。它同时相当于一个协调者的角色,负责一些服务、组件和事务的管理,也包含元数据的管理--Metadata Storage。

  • 计算层:主要是计算资源组--Virtual Warehouse(简称VW) ,计算资源组件可以动态启停,包括一个 Read VW 和一个 Writer VW。在 Read VW 中,每个 Worker 节点都有一个 Optimizer 和 Runtime 模块,以及一个 Disk Cache 模块来缓存部分数据以减少对分布式存储远端系统的访问,热点数据存储在 Disk Cache 模块中。在 Writer VW 中,数据会先以 ClickHouse 格式写入本地磁盘--Local Disk,然后再批量写入分布式存储,以提高写入性能。

  • 云存储层:是分布式统一存储系统,ByConity所有的数据都存储在这一层,在计算层进行查询时,会从云存储层中读取数据。云存储层的具体实现可以采用各种云存储服务,如HDFS、S3等。

除此之外,ByConity还包括一些共享的服务组件,如TSO、Daemon Manager、Resource Manager、后台任务和服务发现等组件。

图 2 ByConity存储计算分离架构

三、ByConity架构优势

资源隔离

在大数据场景下,资源隔离是非常重要的,它可以提高系统的资源利用率、性能、安全性、可靠性和灵活性,帮助企业解决诸多业务痛点问题,如:

  • 避免不同租户之间的资源冲突,提高数据安全性和租户使用体验;

  • 根据不同的业务场景需求分配不同的资源,提高资源利用率和性能;

  • 提高数据安全性,通过隔离不同的数据处理任务或数据库实例,限制访问权限

  • 实现弹性扩缩容,根据不同的业务和数据量需求动态调整资源分配;

  • 提高系统的可靠性和稳定性,隔离故障,避免对整个系统造成影响。

但ClickHouse并没有对资源隔离做专门的设计,它是通过集群和replication的配置、load_balanding策略,以及指定本地表的写入做到一定的读写分离。对于冷热分离,ClickHouse是通过配置存储策略和使用TTL、TO DISK、TO VOLUME等技术实现。

ByConity通过存储计算分离的架构设计很好的实现了资源隔离,它引入了计算组(Virtual Warehouse 简称:VW)的概念,Virtual Warehouse是计算资源的虚拟组织,可以将计算资源按需划分为多个虚拟集群,在不同租户之间提供物理资源隔离。同时,把原本与计算资源耦合的存储统一到分布式存储管理后,计算资源与存储资源是完全解耦的且无状态的,从而计算节点主要承担的是计算任务,这些任务可以是数据写入、用户查询,也可以是一些后台任务。因此ByConity通过的部署和使用Virtual Warehouse来实现多级资源隔离:

图 3 ByConity计算组

  • 租户隔离:ByConity 的Virtual Warehouse是无状态的,可以根据不同的业务和场景进行按需的创建,且每个Virtual Warehouse是独占系统资源,所以会很轻松的实现多租户的隔离。当然,为了提高资源利用率,ByConity也支持Virtal Warehouse之间的资源租借,实现资源共享。

  • 计算资源隔离:Virtual Warehouse使得计算资源做到物理层面的隔离,且每个Virtual Warehouse可以包含多个 worker,可以被灵活创建。

读写分离

除了资源隔离外,我们还希望达到读写的分离,读写的分离是将读操作和写操作分别处理。因为在实际业务中,读操作和写操作对硬件资源的要求,以及时间的要求是不同的,所以我们希望用不同的硬件资源去执行读操作和写操作,避免读写互相影响,影响系统性能和浪费资源,具体好处如下:

  • 降低存储成本:将读操作和写操作引导到不同的存储节点上,避免不必要的数据复制和冗余。

  • 提高查询效率:将读操作引导到专门的读节点上,减少查询等待时间,从而提高数据处理效率和用户体验。

  • 降低网络成本:将读操作引导到离用户更近的读节点上,减少数据传输的距离和网络成本。

  • 提高系统可用性:将读操作和写操作分别引导到不同的节点上,当某个节点发生故障时,只会影响到该节点上的读或写操作,不会影响到整个系统的可用性

ByConity可以通过Virtual Warehouse实现读写分离,用户可以通过指定读操作和写操作使用哪个Virtual Warehouse,系统会自动将不同的读写请求转发。例如Insert操作使用专门用于写入的计算组,Select操作使用专门用于读取的计算组,读写作业之间不会相互影响。但由于ByConity使用了统一的分布式存储,必然会存在性能的问题,这里ByConity是通过本地缓存(Local Cache)去解决的。

本地缓存

对于大容量的本地缓存管理,ByConity使用Bucket-LRU算法,它是在LRU算法的基础上进行了优化,会将缓存中的数据块分为多个桶,每个桶中保存一定数量的数据块,并对每个桶使用LRU算法进行淘汰。这样可以将缓存中的数据块分散到多个桶中,从而降低了缓存淘汰的频率,同时也减少了LRU算法的开销。即使在计算组扩缩容等导致网络拓扑发生变化时,也依然使用这种机制,避免数据的reshuffling。

图 4 ByConity的缓存力度 Segment

  • 针对缓存的粒度,ByConity引入Segment概念,如图4,它是一个介于文件为单位和压缩块为单位的一个缓存粒度,大小可配置,并且适合文件存储。Segment是由多个 Mark 组成的,每个 Mark 包含多个压缩块。当查询需要读取某个Segment时,可以先检查缓存中是否存在该Segment,如果存在,则直接从缓存中读取数据,否则需要从磁盘读取数据。在实际使用中,需要根据数据的特点和需求选择合适的缓存策略,并进行优化和调整,以达到最优的性能和效果。ByConity的缓存策略有以下几种:

  • 按照Segment的访问频次:根据数据访问的频次来判断哪些数据是热点数据,并进行缓存。    

  • 按照Segment的访问范围:有些数据虽然访问频次不高,但是其查询范围较大,也需要被缓存。

  • 根据数据更新时间来决定热点数据:对于实时表等场景,新过来的数据往往是热点数据,需要被缓存。

  • 基于统计信息来优化缓存策略(开发中):根据统计信息来决定哪些数据是热点数据,需要被缓存。

ByConity的本地缓存的主要目的是在分布式存储中,通过使用较少成本(容量)的本地高速缓存盘,来缓存数据以减少网络读取带来的性能延迟增加问题。本地缓存的使用可以提高数据的访问速度和响应速度,从而减少对网络的依赖,降低系统的延迟,提高系统的性能和稳定性。

无感扩缩容

随着业务数据翻倍增长,必须通过不断的扩容支撑业务发展,但在ClickHouse的基础上扩容的成本很高,这是因为ClickHouse从架构上没有专门考虑扩缩容,导致需要运维同学手动或者通过自动化脚本去创建新的ClickHouse节点和迁移副本数据来完成扩容,因此存在时间成本和迁移结果校验的问题。再者,在扩容中需要将新的分片部署到新的节点上,这会导致数据不再均衡,需要通过数据再均衡来解决。

ByConity的存储计算分离架构可以天然解决这个问题,能实现业务无感的扩缩容。ByConity扩容分为两种:一种是纵向扩容,即调整Worker的 CPU 核数和内存大小;另一种是横向扩容,通过增、减Worker的数量,提升系统并发能力。这些依然通过ByConity的Virtual Warehouse和Worker去实现:

  • 一方面资源管理器(Resource Manager)负责对计算资源进行统一的管理和调度,能够收集各个计算组的性能数据,资源使用量,为读写任务和后台任务动态分配资源并进行扩缩容,提高资源使用率。ByConity 的组件都已经容器化,通过调整 Kubernets 的 replica 数量可以非常方便的对指定的计算组进行扩缩容。除此之外,还可以结合计算组资源使用量,通过设置 kubernets 的扩缩容阈值实现动态扩缩容。

  • 另一方面,ByConity的元数据和数据存储在远端,计算节点的无状态化使扩缩容变得十分轻量,只需等计算实例启动完成,即可立即服务,无需额外的数据迁移开销,实现实时扩缩容。

四、ByConity使用场景

ByConity 使用大量成熟 OLAP 技术,例如列存引擎,MPP 执行,智能查询优化,向量化执行,Codegen, Indexing,数据压缩,主要用于 OLAP 查询和计算场景。在实时数据接入、大宽表聚合查询、海量数据下复杂分析计算、多表关联查询场景下有非常好的性能。

场景分类场景描述特点
交互式查询用户自定义查询支持多维查询分析的数据应用自由维度、多表关联、响应快
自助式报表支持 Tableau 等 BI 工具自由维度、多表关联、响应快
用户画像分析支持 DMP 等圈人画像平台自由维度、多表关联、响应快
营销效果分析支持流量效果漏斗分析多表关联、实时
行为日志分析支持日志探索分析日志检索、数据量大
实时数据看板实时业务监控大屏支持 DataV 等可视化大屏实时
直播数据统计看板支持实时报表实时
业务仪表盘支持报表工具统计、响应快
系统链路监控支持实时监控应用实时
实时数据仓库实时数据接入支持实时数据写入、更新实时数据写入,立即可见
准实时 ETL 计算支持复杂计算,数据清洗混合负载

表 1

五、总结和展望

总结来说ByConity使用了存储计算分离的架构,且在多个方面进行了优化和升级,具有以下的优势和特性:

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

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

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

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

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

图5是接下来ByConity未来发展规划图,未来我们计划从以下几个方面进行优化和改进:

图5 ByConity未来发展规划

  • 支持分布式Disk Cache,一方面解决节点重启导致Local Cache丢失的问题,另一方面希望达到全局最优的Cache机制,提升Cache命中率。

  • 支持外表服务,例如Hudi和Iceberg等

  • 支持存储服务化,在ByConity存储数据层上,利用Spark引擎或Presto引擎的计算能力执行一些ETL任务等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/567567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot 结合 MyBatis-plus 进行逻辑删除

一 、逻辑删除的概念 逻辑删除不会在数据库中删除数据,只是通过一个字段用来标识被删除的记录,数据仍然保存在数据库中。在实际的工作当中,因为数据非常重要,为了防止因用户误操作删除数据后无法恢复的问题,我们通常不…

在 Spring Boot 中使用 Spring Cloud Kubernetes 部署应用到 Kubernetes

在 Spring Boot 中使用 Spring Cloud Kubernetes 部署应用到 Kubernetes Kubernetes 是目前最流行的容器编排平台之一,提供了一种灵活的方式来管理容器化应用程序。Spring Cloud Kubernetes 是一个基于 Spring Cloud 的项目,它提供了一种简单的方式来将…

探索可视化大屏:引领信息时代的视觉革命

可视化大屏是一种利用先进的数据可视化技术和交互技术,将大量的数据和信息以直观、易于理解的方式展示在大屏幕上的解决方案。可视化大屏通常由高分辨率的显示屏、强大的计算和处理设备以及专业的可视化软件组成,它通过图表、图形、动画等可视化元素&…

day08 Spring MVC

spring MVC相当于Servlet mvc解释:模型,视图,控制器 **使用该思想的作用:**减少耦合性,提高可维护性 Spring MVC前端控制器 方式1 1.在web.xml中配置前端控制器方式2 ​ 要是用前端控制器,必须在web.xml中配置DidpatcherServlet类 <!--前端控制器--> <servlet&g…

面试经验小结

1、为什么C有重载而C语言没有&#xff1f; C的编译过程中&#xff0c;将函数名后面的数据类型也加入到了编译阶段。 2、用异或完成两个数的数值交换。 x^y&#xff1b; y^x&#xff1b; x^y&#xff1b; 3、数组指针与指针数组&#xff1b;函数指针与指针函数 4、segment …

jdk15至17——sealed密封关键字

sealed关键字是从jdk15开始预览&#xff0c;直到jdk17成为正式版&#xff0c;可以对继承父类和实现接口进行更加细粒度的限制&#xff0c;之前的限制也只有final用于禁止继承&#xff0c;默认包权限限制在同一个包内&#xff0c;sealed密封类/接口可以明确指定哪些类可以进行继…

C# 调用Matlab打包的 DLL文件(傻瓜式操作)

1、准备Matlab代码 2. 打包 在matlab命令行窗口输入deploytool,打开MATLAB Complier,选择Library Compiler 在TYPE中选择.NET Assembly;在EXPORTED FUNCTIONS中选择要打包的文件&#xff1b;可以选择为自己打包的文件自定义NameSpace名称&#xff0c;本例中将NameSpace定义为…

Google Earth Engine(GEE):大数据林业应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

AcrelCloud-9500电瓶车充电桩收费平台 在苏州市某拆迁小区的应用

摘 要&#xff1a;全国各地电瓶车充电引发火灾的事故时有发生&#xff0c;对人民群众的生命财产安全造成了很大的威胁&#xff0c;本文介绍的苏州市某拆迁小区&#xff0c;是海虞镇为创建市级消防安全“331”示范社区选定的社区&#xff0c;该社区采用4G通信方式与服务器进行通…

一篇文章带你看懂5G网络(接入网+承载网+核心网)

通过这张网络简图帮助大家认识一下全网的网络架构&#xff0c;通过对全网架构的了解&#xff0c;将方便您对后面每一块网络细节的理解。 这张图分为左右两部分&#xff0c;右边为无线侧网络架构&#xff0c;左边为固定侧网络架构。 无线侧&#xff1a;手机或者集团客户通过基站…

mysql安装8.**版本

1. 下载MySQL 8.0.22 源码包: wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.22.tar.gz https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.22.tar.gz 2. 解压源码包: tar -zxvf mysql-8.0.22.tar.gz -C /usr/local 3. 创建用于编译的构建目录: …

LDO基本知识

本文引用TI文档 压降 压降电压 VDO 是指为实现正常稳压&#xff0c;输入电压 VIN 必须高出 所需输出电压 VOUT(nom) 的最小压差。 如果 VIN 低于此值&#xff0c;线性稳压器将以压降状态工作&#xff0c;不再调 节所需的输出电压。在这种情况下&#xff0c;输出电压 VOUT(drop…

【Docker】进入docker容器

进入已经在运行的docker容器 1、查看所有在运行的docker容器 docker ps2、进入指定的docker容器 docker attach 容器CONTAINERID docker attach 8ad850b602ff查看log docker logs -f 8ad850b602ff

普通本科机械设计毕业生,如何零基础转行数据分析?

作为本科生转行数据分析还是比较容易的&#xff0c;我们数据分析班里本科生占了一大半&#xff0c;专业也都是非计算机相关的&#xff0c;有机械、机电、会计、金融等专业的应届生&#xff0c;基本对于计算机方面接触都不算多&#xff0c;专业方面肯定都是零基础&#xff0c;会…

【案例教程】R语言在生态环境领域中的实践技术应用

R语言作为新兴的统计软件&#xff0c;以开源、自由、免费等特点风靡全球。生态环境领域研究内容广泛&#xff0c;数据常多样而复杂。利用R语言进行多元统计分析&#xff0c;从复杂的现象中发现规律、探索机制正是R的优势。为此&#xff0c;本课程以鱼类、昆虫、水文、地形等多样…

Scrapy CrawlSpider介绍和使用

一、介绍CrawlSpider CrawlSpider其实是Spider的一个子类&#xff0c;除了继承到Spider的特性和功能外&#xff0c;还派生除了其自己独有的更加强大的特性和功能。其中最显著的功能就是”LinkExtractors链接提取器“。Spider是所有爬虫的基类&#xff0c;其设计原则只是为了爬取…

【Nodejs】Node-js概述

Node.js 文章目录 Node.js一、Node.js概述1.1、介绍1.2、官网1.3、Node.js应用场景1.4、安装Node.js1.5、npm包管理器1.5.1、介绍1.5.2、切换npm源1.5.3、生成JSON配置文件1.5.4、查看当前安装的树形模块1.5.5、安装模块1.5.6、自定义脚本命令1.5.7 、自动重启应用 1.6、模块化…

机房管理技能,医疗行业必备!

机房是一个很复杂的地方&#xff0c;存放设备数量大且杂&#xff0c;再加上大量使用电&#xff0c;机房存在各种各样的隐患&#xff0c;给机房管理带来极大的难度。 因此&#xff0c;想要很好的管理机房、避免机房出现各种危险&#xff0c;就需要应用机房动环监控系统&#xff…

MT8395(Genio 1200)处理器性能参数介绍

MT8395(Genio 1200)是一款专为AI与高性能物联网应用而设计的通用型SoC&#xff0c;采用6nm制程工艺&#xff0c;已集成四核A78和四核A55的八核CPU。Genio 1200还集成Mali-G57图形处理器&#xff0c;内置独立的双核AI处理器&#xff0c;可应用于智能家电、中控设备、商业显示、工…

如何在Windows 11更新后解决C盘已满的问题?

Windows 11比Windows 10需要占用C盘更多的空间&#xff0c;在升级到Windows 11后&#xff0c;如果升级后出现问题&#xff0c;安装程序可以帮你退回到Windows 10。无论怎样&#xff0c;在升级到Windows 11后&#xff0c;系统会自动制作以前的数据的副本&#xff0c;这会占用大量…