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

本文涉及的产品
性能测试 PTS,5000VUM额度
注册配置 MSE Nacos/ZooKeeper,118元/月
可观测链路 OpenTelemetry 版,每月50GB免费额度
简介: 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

目录
相关文章
|
4天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
8天前
|
数据库 索引
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
29 3
|
10天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3920 2
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
3天前
|
Kubernetes Cloud Native 调度
云原生批量任务编排引擎Argo Workflows发布3.6,一文解析关键新特性
Argo Workflows是CNCF毕业项目,最受欢迎的云原生工作流引擎,专为Kubernetes上编排批量任务而设计,本文主要对最新发布的Argo Workflows 3.6版本的关键新特性做一个深入的解析。
|
5天前
|
监控 Cloud Native 持续交付
云原生技术深度解析:重塑现代应用开发与部署范式####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在现代软件开发中的重要性。通过剖析容器化、微服务架构、持续集成/持续部署(CI/CD)等关键技术,本文旨在揭示云原生技术如何促进应用的敏捷性、可扩展性和高可用性,进而推动企业数字化转型进程。不同于传统摘要仅概述内容要点,本部分将融入具体案例分析,直观展示云原生技术在实际应用中的显著成效与挑战应对策略,为读者提供更加丰富、立体的理解视角。 ####
|
6天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
91 1
|
12天前
|
人工智能 Cloud Native Java
云原生技术深度解析:从IO优化到AI处理
【10月更文挑战第24天】在当今数字化时代,云计算已经成为企业IT架构的核心。云原生作为云计算的最新演进形态,旨在通过一系列先进的技术和实践,帮助企业构建高效、弹性、可观测的应用系统。本文将从IO优化、key问题解决、多线程意义以及AI处理等多个维度,深入探讨云原生技术的内涵与外延,并结合Java和AI技术给出相应的示例。
56 1
|
6天前
|
JSON 前端开发 JavaScript
API接口商品详情接口数据解析
商品详情接口通常用于提供特定商品的详细信息,这些信息比商品列表接口中的信息更加详细和全面。以下是一个示例的JSON数据格式,用于表示一个商品详情API接口的响应。这个示例假定API返回一个包含商品详细信息的对象。
|
12天前
|
运维 Cloud Native 持续交付
云原生技术解析:从IO出发,以阿里云原生为例
【10月更文挑战第24天】随着互联网技术的不断发展,传统的单体应用架构逐渐暴露出扩展性差、迭代速度慢等问题。为了应对这些挑战,云原生技术应运而生。云原生是一种利用云计算的优势,以更灵活、可扩展和可靠的方式构建和部署应用程序的方法。它强调以容器、微服务、自动化和持续交付为核心,旨在提高开发效率、增强系统的灵活性和可维护性。阿里云作为国内领先的云服务商,在云原生领域有着深厚的积累和实践。
40 0
|
19天前
|
API
Vue3组件通信全解析:利用props、emit、provide/inject跨层级传递数据,expose与ref实现父子组件方法调用
Vue3组件通信全解析:利用props、emit、provide/inject跨层级传递数据,expose与ref实现父子组件方法调用
207 0

推荐镜像

更多