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

供稿 | 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任务等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于html+css的图展示102

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

BLE协议栈结构

// 开坑BLE协议栈 0 镇楼图 接下来会自下往上粗略分析各个层级,后续会有对各层的细致解读 1 CONTROLLER 1.1 PHY BLE使用ISM频段(频率范围是2.400-2.4835 GHz)。将整个频带分为40份,每份的带宽为2MHz,称作RF Chann…

如何使用Python自动化测试工具Selenium进行网页自动化?

引言 Selenium是一个流行的Web自动化测试框架,它支持多种编程语言和浏览器,并提供了丰富的API和工具来模拟用户在浏览器中的行为。Selenium可以通过代码驱动浏览器自动化测试流程,包括页面导航、元素查找、数据填充、点击操作等。 与PyAuto…

抖音账号矩阵系统源码开发之——视频发布功能开发

视频发布权限在账号矩阵系统研发之初,都是一个备受争议的功能,最早之前我们使用的视频发布权限名字是Video.creat, video.delete权限,但是该权限于2022年10月份做了权限的收回,后又在上架了一个能力叫发布内容至抖音:…

PostGIS的10个最佳实践

PostGIS 是一个功能强大的开源空间数据库,可用于存储、查询和分析地理空间数据。 对于需要存储和分析大量地理空间数据的组织来说,这是一个流行的选择。 但是,正确使用 PostGIS 以充分利用它很重要。 在本文中,我们将讨论 10 个 …

【2023年4月美赛加赛】Z题:The future of Olympics 25页完整论文

【2023年4月美赛加赛】Z题:The future of Olympics 25页完整论文 1 题目 背景 国际奥委会(IOC)正面临着夏季奥运会和冬季奥运会申办数量的减少**[1]**。在过去,举办奥运会的竞争非常激烈,声望也很高。然而,最近,主办…

自定义注解和@Target、@Retention注解的使用

说明:注解可以理解为另一种形式的配置,可用于在类上、方法上等,标志是“”,如重写方法上的“Override”就是一种注解。这里我通过一个实例,来介绍自定义注解和java元注解(Target、Retention)的使…

一分钟了解乐观锁、悲观锁、共享锁、排它锁、行锁、表锁以及使用场景

大家好,我是冰点,今天给大家带来,关于MySQL中的锁的使用。 我首先提个问题,大家知道什么是 乐观锁、悲观锁、共享锁,、排它锁、行锁、表锁,以及每种锁的使用场景吗? !! 背景:最近在各…

(学习日记)2023.04.23

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

关于安卓以及微软用户chatgpt上一篇文章如今第五点无法正常进入更新解决方法以及附加本地部署

目录 一、问题出现: 1、问题: 原因: 二、解决办法(本地部署chatgpt) 1、解决(国内网络使用真的chatgpt并非镜像)一次部署终生使用 第一步: ​编辑第二步: 三、实现结…

让你不再好奇怎么给小说配音

你是否曾经想象过,当你在读小说时,你可以听到人物的声音,感受到情感和气氛的变化?有声书的出现已经让这一切成为可能。然而,如何为小说创造生动的配音效果却是一个需要仔细考虑的问题。如果你还不知道怎么给小说配音的…

智能计价器-第14届蓝桥杯省赛Scratch中级组真题第5题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第140讲。 智能计价器,本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组真题第5题&#…

信号处理与分析-卷积的性质与推导

目录 一、引言 二、信号分析中的卷积 1. 什么是卷积 2. 卷积的性质 3. 卷积的应用 三、离散卷积 1. 离散卷积的定义 2. 离散卷积的计算 3. 离散卷积的性质 四、连续卷积 五、卷积的实际应用 六、总结 一、引言 在信号处理中,卷积是一种非常重要的数学运…

2023年05月小结

5月一晃即将过去,先看看5月份都写了哪些文章: 往期推荐 国内手机号如何注册Google账号 Python中的布尔类型以及布尔值介绍 Python中深拷贝与浅拷贝介绍 Python中的集合介绍 Python中的字典学习笔记 Python学习历程-元组的基本操作回顾 记录我的Python学习…

STM32F103C8T6+2.4寸SPI TFT触摸屏代码+标准库 项目开发

目录 模块清单: 模块介绍: 1:STM32F103C8T6 2:2.4寸SPI TFT触摸屏 项目结果展示 2.4寸 TFT SPI显示触摸屏 2.4寸 SPI TFT 显示触摸屏代码下载链接: (1条消息) 2.4寸SPITFT显示触摸屏资源-CSDN文库 模块清单&#x…

低资源方面级情感分析研究综述

文章目录 前言1. 引言2. 问题定义、数据集和评价指标2.1 问题定义2.2 任务定义2.3 常用数据集 3. 方面级情感分析的方法3.1 **方面词抽取**3.1.1 基于无监督学习的方法3.1.1.1 基于规则的方面词抽取3.1.1.2 基于统计的方面词抽取 3.1.2 基于有监督浅层模型的方法3.1.3 基于有监…

Golang每日一练(leetDay0075) 打家劫舍II、最短回文串

目录 213. 打家劫舍 II House Robber ii 🌟🌟 214. 最短回文串 Shortest Palindrome 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C…

mysql加强小结 203446

数据库三范式: 什么是范式 规则:想要设计一个好的关系,必须要满足一定的约束条件,有几个等级,一级比一级高 ​ 解决什么问题:让数据库设计更加简洁,结构更加清晰,否则容易造成数据冗余 数据库有哪些范式? ​ 数据库有七大范式,常用的只有三个范式 **第一范式:**业务上属…

【1++的C++初阶】之模板

👍作者主页:进击的1 🤩 专栏链接:【1的C初阶】 文章目录 一,浅谈模板二,函数模板三,类模板 一,浅谈模板 在前面的文章【【1的C初阶】之C入门篇1】中我们对函数重载有了一定的认识&a…

Linux网络服务:SSH远程访问及控制2

目录 一、理论 1.构建密钥对验证的SSH体系 2.TCP Wrappers访问控制 二、实验 1.ecdsa免密连接 2.rsa免密连接 一、理论 1.构建密钥对验证的SSH体系 (1)免密连接原理 ① 手动添加客户端的公钥到服务端 ② 服务端收到客户端的公钥后使用客户端公钥…