重塑链上数据索引,Chainbase 云原生 Subgraph 解析

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: Subgraph 是 The Graph 去中心化应用索引协议的具体实现, 能为各个智能合约创建索引引擎,提供 dataset 数据集供开发者快速查询使用。目前,Chainbase 正式上线并托管的核心 dataset subgraph 数量已经超过 100+。

完全拥抱云原生后,Chainbase 正式上线并托管核心 dataset subgraph 数量超过 100+:[https: //console.chainbase.com/indexer]

一、背景

对于一些具有复杂智能合约的项目 uniswap 或者 BAYC(NFT),其所有数据都存储在链上,我们只能通过链上读取到基本的合约数据,比如某只 BAYC 猿猴的所有者、根据其 ID 获取猿猴的内容 URI 或总提供量。但没办法做进一步更高级的聚合、搜索、关系查询:例如,我们想查询某个地址所拥有的猿猴,并根据其中一个特征进行筛选,就没办法直接通过与链上合约交互来获得这些信息。要获得这些信息,我们需要开发一个后端程序从 0 区块开始处理合约发出的所有 transfer 事件,然后使用Token ID 和 IPFS 哈希值从 IPFS读取元数据,汇总和计算后才能得出。这里的后端程序就是 Subgraph。

Subgraph 是 The Graph 去中心化应用索引协议的具体实现, 能为各个智能合约创建索引引擎,提供 dataset 数据集供开发者快速查询使用。

image.png

二、挑战

随着区块链生态发展,构建 Subgraph 成为了开发者越来越喜欢的用来获取和提供区块链数据的关键工具,但由于每一个 Subgraph 都只对应一个特定的智能合约,为了满足不同用户和场景,需要构建和托管的子图数量也会逐渐变多,我们托管支持了生态中大部分核心Subgraph,也在规模化托管时为现有框架和运维方式带来不少的问题和挑战:

image.png

2.1 单体PostgreSQL数据库缓存大、读写不分离

Graph Node 默认后端采用 PostgreSQL 作为关系型数据库,所有的子图共享一个数据库实例。并且会根据配置中指定的chains.provider强制缓存链上数据 Raw Data ,无法关闭。

image.png

如果在配置有多个provider 的情况下,数据库的大部分空间都会被Raw Data 占据,需要不断地进行数据库实例容量和 iops 扩容。最为致命的是随着数据库实例容量的增涨,会导致数据库的整体读写性能严重下降,最后不得不单独启动一个镜像只读数据库实例用于 query 请求读取,以降低查询延迟。如果每个 subgraph 都启动一个实例,会面临每个数据库都会缓存一份完整 Raw Data 的问题,造成严重的数据冗余和资源浪费。

image.png

2.2 Subgraph子图任务资源易被抢占、资源不易扩展

在子图刚部署上线时,子图会从设置好的startBlock开始索引,由于前部分合约交易量小,索引速度相对较快,资源消耗少;但是到核心交易区块时,交易量增大,events 事件增多导致索引慢,资源消耗多。而单节点部署的 Graph Node 整体资源受限于部署的物理机资源,物理机资源利用率经常会出现波峰和波谷,导致在子图需要资源时无法及时扩容,在子图索引到最新区块后不需要过多资源时又无法缩容。

image.png

2.3 多个子图混部后监控日志难以区分

同一个 node 部署多个 Subgraph 后,子图的所有debuginfowarnerror 日志都混杂在一起,对日志采集后无法准确地判断发生的 error 日志具体属于哪个子图,特别是还在开发测试阶段的子图无法通过日志进行问题跟踪。

2.4 需要稳定的高性能 RPC 节点

Subgraph 索引性能很大程度取决与 RPC 节点的通信性能,RPC 节点请求延迟越低,子图的索引速度越快,新部署的子图数据追到最新区块时间越短。自我部署 RPC 节点成本高。

三、解决思路

image.png

3.1 存算分离和PostgreSQL数据库集群

为了使得计算和存储可以独立扩展,提高系统的灵活性,我们需要将每个子图的数据库和各链上Raw Data Cache 区分开,比如 ethereumpolygon 单独一个数据库实例,在有新的子图部署时,检测属于哪条公链子图,自动为其分配对应的Cache 连接地址。这样做的好处是全局只要维护一份 Cache 数据,再也不用每个子图去缓存 Cache 数据,一份 Cache为所有其他子图共享,解决了数据冗余问题;其次,我们可以借助 kubernetes 中的 pvc 扩展为每个单独的数据库实例做资源扩容,每次扩容的比例按照子图索引数据量增涨幅度和其索引进度可以做到精细化控制,这样我们就能预测子图所需的资源总量。

image.png

image.png

3.2 subgraph资源隔离和自动扩缩容

每个 subgraph使用deployment 抽象成无状态应用,连接后端 statefulset 有状态的 postgresql 数据库实例,将各个subgraph的计算、存储、网络资源进行充分隔离。subgraph会全局设置初始的资源 requestlimit,在 limit 限制内,允许subgraph进行资源动态调节,资源利用率达到 80%以上进行扩容;利用率在 30%以下进行缩容。只不过由于现有的 subgraph版本只能单线程运行,并不支持并行索引,所以使用传统的 Horizontal Pod Autoscaler(HPA)水平扩容并不能提升索引速度,这里需要使用Vertical Pod Autoscaler (VPA)垂直扩容来动态提升资源 limit,以达到subgraph理想的索引性能。

image.png

3.3 Metrics 指标监控和日志采集

得益于容器化后subgraphkubernetes 中的资源隔离特性,我们可以基于具体的 pod 采集到每个subgraph 具体的的监控指标数据,使用 kube-metrics 统一收集集群数据,用于subgraph 的稳定性监控告警和资源动态扩缩容。此时可以开启 debug 日志,使用 elastic 统一收集,暴漏出 api 后可以方便地查询各个子图的调试日志信息。

3.4 稳定的高性能RPC节点

PRC 节点不仅需要支持高并发、高可用、低延迟,还需要提供稳定的SLA服务。自我托管部署RPC 节点不仅硬件成本高,后期节点也难以运维和优化。选择一家稳定的RPC 服务商是 subgraph 索引的基础保障。

四、收益效果

传统的部署架构中,如果我们需要部署一个Ethereum 归档节点,目前最佳选择是使用Erigon客户端,但是至少需要的硬件资源配置(参考 aws 云资源实例 i4i.4xlarge):

image.png

序号 名称 配置
1 CPU 16vCPU
2 ARM 128GB
3 PCIE(SSD) 3.4T +
合计费用 ≈936USD/M

而采用来自 chainbase 的 RPC 服务,只需要订阅基础套餐,成本节省 90%+。

而且在云原生托管 subgraph后,我们还解决了单体架构中数据库瓶颈造成的索引性能和缓存资源冗余问题;并借助 kubernetes 的生态能力解决了资源动态扩缩容,配合subgraph 索引资源需求大幅度提升了资源利用率。

image.png

  • 索引速度因为 RPC 节点和数据库读写性能提升 30%+
  • 平均subgraph资源利用率提升 80%+

五、未来

受限于subgraph只能串行索引区块的特点,暂时还无法突破性地提高一个全新的、从0 开始执行索引subgraph 的速度。chainbse团队正积极寻找突破现有技术限制的方法,如支持高效流式引擎 Firehose、Substream,以便我们能够进一步加快subgraph索引的速度。我们将不断改进我们的产品,满足客户的需求,并为整个行业的发展做出有意义的贡献。

我们期待与所有的客户和合作伙伴共同探索这一充满可能性的未来。

About Chainbase

Chainbase 是领先的 Web3 数据基础设施,帮助开发者轻松访问加密数据,并支持对数据的大规模索引、转换和使用。Chainbase 通过提供丰富的数据集和实时流计算技术,使开发人员能够以更少的精力完成更多的工作。

想了解更多有关 Chainbase 的信息?

在官网 chainbase.com 获取 免费账户,阅读我们的开发者文档吧!

WebsiteBlogTwitterDiscordLink3

目录
相关文章
|
22天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
120 9
|
2月前
|
消息中间件 存储 缓存
十万订单每秒热点数据架构优化实践深度解析
【11月更文挑战第20天】随着互联网技术的飞速发展,电子商务平台在高峰时段需要处理海量订单,这对系统的性能、稳定性和扩展性提出了极高的要求。尤其是在“双十一”、“618”等大型促销活动中,每秒需要处理数万甚至数十万笔订单,这对系统的热点数据处理能力构成了严峻挑战。本文将深入探讨如何优化架构以应对每秒十万订单级别的热点数据处理,从历史背景、功能点、业务场景、底层原理以及使用Java模拟示例等多个维度进行剖析。
58 8
|
2月前
|
数据采集 自然语言处理 搜索推荐
基于qwen2.5的长文本解析、数据预测与趋势分析、代码生成能力赋能esg报告分析
Qwen2.5是一款强大的生成式预训练语言模型,擅长自然语言理解和生成,支持长文本解析、数据预测、代码生成等复杂任务。Qwen-Long作为其变体,专为长上下文场景优化,适用于大型文档处理、知识图谱构建等。Qwen2.5在ESG报告解析、多Agent协作、数学模型生成等方面表现出色,提供灵活且高效的解决方案。
205 49
|
1月前
|
XML JSON JavaScript
HttpGet 请求的响应处理:获取和解析数据
HttpGet 请求的响应处理:获取和解析数据
|
2月前
|
存储 Cloud Native 块存储
EBS深度解析:云原生时代企业级块存储
企业上云的策略,从 Cloud-Hosting 转向 Serverless 架构。块存储作为企业应用上云的核心存储产品,将通过 Serverless 化来加速新的计算范式全面落地。在本话题中,我们将会介绍阿里云块存储企业级能力的创新,深入解析背后的技术细节,分享对未来趋势的判断。
151 2
|
2月前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
2月前
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####
|
2月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
76 2
|
2月前
|
数据采集 存储 自然语言处理
基于Qwen2.5的大规模ESG数据解析与趋势分析多Agent系统设计
2022年中国上市企业ESG报告数据集,涵盖制造、能源、金融、科技等行业,通过Qwen2.5大模型实现报告自动收集、解析、清洗及可视化生成,支持单/多Agent场景,大幅提升ESG数据分析效率与自动化水平。
129 0
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
93 2

推荐镜像

更多