博客 / 工程

Goldsky - 基于 ClickHouse 和 Redpanda 的黄金标准架构

author avatar
ClickHouse 团队
2023 年 12 月 20 日 - 12 分钟阅读

简介

作为一家扎根于开源的公司,我们发现我们的用户通常是率先识别和开发新技术架构模式或应用的人。虽然我们可能是 ClickHouse 方面的专家,但我们实际上不可能尝试所有可能的集成技术或试验代表所有用例的所有数据集。因此,每当我们进行客户访谈时,我们总是很高兴听到新兴的部署模式,尤其是与其他流行的 OSS 项目的部署模式。在与我们的客户 Goldsky 交谈并听到这样的模式后,我们决定分享他们针对 Redpanda、Apache Flink 和 ClickHouse 的部署架构。我们认为这对于那些需要向众多最终客户交付数据集转换子集的用户来说,可能具有广泛的应用前景。

为了突出此架构的功能,Goldsky 慷慨地在一个公开访问的 ClickHouse 实例上共享了来自广泛使用的区块链 Base 的数据。这使有兴趣使用区块链数据开发功能、产品或平台的用户能够轻松创建概念验证,这要归功于 Goldsky 平台提供的免费且持续更新的数据源。通过消除对摄取管道、基础设施设置或管理通过 BigQuery 直接使用此数据相关的成本的担忧,我们的目标是使此概念验证成为一个有价值的例证,说明在利用 ClickHouse 和 Goldsky 进行区块链分析时所实现的效率。

Goldsky

Goldsky 提供加密数据即服务,将来自 15 多个最受欢迎的区块链的数据交付到客户自己的数据存储中。这包括区块链索引、子图和数据流管道。通过为开发人员提供创建简单 API 的能力,可以将这些数据暴露在强大的 dApp(去中心化应用程序)中,而无需担心所需的复杂基础设施、数据管理和逻辑来提取有用的信息。通常,前者涉及远程过程调用 (RPC) 提供商和 API,它们复杂且难以建模。

通过提供“数据管道即服务”,Goldsky 允许区块链数据被客户特定的逻辑过滤和转换,从而只有区块链的特定子集被交付到智能 API 端点。虽然用户通常在 Goldsky 交付的数据上公开 API 端点,但 ClickHouse 越来越多地被视为首选的分析数据库,如果需要更复杂的查询。在这种情况下,Goldsky 需要将区块链数据集交付到专用的 ClickHouse(通常是云)集群。此数据集通常是特定区块链的子集,例如,与特定地址或钱包余额相关的所有区块。除了过滤或仅从特定时间点开始流式传输之外,用户还需要能够在插入 ClickHouse 之前预聚合数据。

虽然这些处理能力都内置在 Goldsky 服务中,但这从数据工程的角度来看提出了一个挑战 - 如何有效地将相同的 TiB 数据集流式传输到可能数万个 ClickHouse 实例,同时提供可能仅针对子集的客户独立处理。

架构

gold_sky_architecture.png

Goldsky 架构由 Redpanda、Apache Flink 和 ClickHouse 组成。数据通过直接索引器推送到 Redpanda 中,这些索引器可以提取区块、交易、追踪和日志等结构。每个区块链都作为 Redpanda 上的多个主题存在(每种数据类型一个主题),Apache Flink 可以从中消费和转换事件。用户编写 FlinkSQL 来转换特定的数据集,可能从主题上的特定位置开始以限制数据的时间。转换在数据交付到 ClickHouse 进行分析之前在流中应用。这种多租户架构使 Goldsky 能够有效地处理任何加密数据集并将其交付到可能数千个 ClickHouse 集群。所有这些都通过一个简单的界面或 API 公开,抽象了复杂性,并允许用户简单地用 SQL 自然地编写转换。

读者可能会注意到上面的子图模块。子图是一种单线程索引方法,允许用户编写 webassembly 逻辑,使用 typescript 顺序处理区块链。这允许通过读取和写入状态进行自定义聚合,这可能是一种更容易入门的范例。这也允许额外的 HTTP 调用以太坊网络,以在索引过程中提取合约状态。这些子图反过来可以用于公开 API 或插入到 ClickHouse 中进行分析。更多详情请点击此处

我们在下面探讨这些技术选择中的每一个。

Redpanda 作为后备存储

Goldsky 花费了大量精力确保所有流行的区块链都转换为可以轻松地被 ClickHouse 等其他服务消费的格式。模式驱动的 Avro 格式代表了他们当前的首选格式。一旦区块链被转换,就存在几个主要挑战

  • 高效存储转换后的数据,供客户稍后消费。此处的保留期是无限的
  • 保持此数据最新,以便用户可以访问最新的交易和区块
  • 确保数据可以以最小的端到端延迟交付到任意数量的目的地,包括 ClickHouse

由于所有区块链数据本质上都是时间序列、有序且不可变的,并且具有 Kafka 的先前经验,Goldsky 团队将 Redpanda 确定为首选的 Kafka 实现。此选择背后的主要动机是其分层存储架构。这允许数据以经济高效的方式保留在对象存储上,同时仍然以 GiB/秒的速度将数据交付到下游目的地,而不是为传统 Kafka 共享无架构中不需要的硬件付费。当与最近Jepsen 测试验证的高级别持久性结合使用时,此功能特别符合 Goldsky 的典型访问模式,即,最新的区块是主要关注点,并且数据需要按顺序流式传输。

有关 Goldsky 选择 Redpanda 的更多详细信息,我们推荐博客“Goldsky 如何使用 Redpanda 为 Web3 开发人员普及流式数据”

为了满足用户能够过滤和转换数据的要求,Goldsky 利用 Apache Flink® - 向其用户公开 FlinkSQL。虽然后转换很简单,例如,将数据过滤到特定的合约,但 Flink 提供了更复杂的流处理功能,例如流内连接、TopN 计数,甚至在需要时还提供模式识别。这些功能是在仍然保持到 ClickHouse 的高插入性能(速率达到 50 万个事件/秒)的同时提供的。

有关 Goldsky 选择 Flink 的更多详细信息,我们推荐博客“使用变更日志和流解决区块链数据挑战”,尤其是在如何有效处理区块链重组方面。

ClickHouse 用于分析

虽然 ClickHouse 不是用户请求交付事件的唯一数据库,但它代表了在需要对大型数据集执行查询分析时的主要选择。ClickHouse 在加密分析领域的应用广为人知,用户利用其无与伦比的查询性能、成本效率和增强的 SQL 来处理通常达到 TiB 的数据集。使用 SQL 查询区块链数据是直观的,并且已通过 dune 等服务普及。

ClickHouse 用于回填

最近,Goldsky 开始探索使用 ClickHouse 进行数据回填。这通常是需要完整或过滤的数据集的客户的要求。在这些情况下,ClickHouse 可用于有效地识别子集并重定向到 Goldsky 管道。Redpanda 可用于后续更新。这是使用自定义混合源实现的,该混合源能够从两个来源消费数据:ClickHouse 用于回填,Redpanda 用于增量。在管道中定义的任何聚合都可以在 ClickHouse 和 Redpanda 之间工作,而用户无需知道数据来自何处。

挑战与经验教训

Goldsky 在 ClickHouse 方面的主要挑战涉及使用 ReplacingMergeTree 引擎类型,以及学习如何最佳地使用它。此引擎选择确保可以有效地处理更新(或重复事件)。为了优化目的,Goldsky 特别利用了

此外,Goldsky 允许用户自定义他们的 ORDER BY 键以与其访问模式对齐。这通常是区块时间戳或地址。将来,他们希望利用对 ReplacingMergeTree 引擎的投影的支持。

示例数据集

在 ClickHouse,我们一直在寻找大型数据集以在我们的公共实例中公开。为了测试 Goldsky 服务,我们对 Goldsky 提供将区块链发送到我们的一个公共实例感到兴奋。为了寻找具有大量交易的广泛采用的链,我们选择了 Base。

Base 区块链是基于以太坊 L2 的去中心化账本。它利用一种称为“参与证明”的独特共识机制,该机制结合了权益证明和工作量证明的元素,从而可以在保持强大安全性的同时实现高效的交易处理和共识。此区块链整合了智能合约和去中心化应用程序 (DApp) 等功能,以支持广泛的用例,使其成为基于区块链的应用程序和服务的通用平台。在 Coinbase 的推广下,截至撰写本文时,该链也获得了强劲的采用,交易量接近 7200 万笔。

用户可以在 sql.clickhouse.com 访问此数据集,该数据集会实时更新。我们提供区块、日志、交易和追踪的表,其范围从小于 1000 万行和几 GiB 到超过 10 亿行和接近 1TiB 未压缩。

SELECT
    table,
    formatReadableQuantity(sum(rows)) AS total_rows,
    round(sum(rows) / 42) AS events_per_day,
    formatReadableSize(sum(data_compressed_bytes)) AS compressed_size,
    formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size,
    round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio
FROM system.parts
WHERE (database = 'base') AND active
GROUP BY table
ORDER BY sum(rows) ASC

┌─table───────────────┬─total_rows─────┬─events_per_day─┬─compressed_size─┬─uncompressed_size─┬─ratio─┐
│ base_blocks         │ 7.46 million   │         1775462.11 GiB        │ 7.60 GiB          │  3.61 │
│ base_transactions   │ 72.89 million  │        17355597.02 GiB        │ 56.19 GiB         │     8 │
│ base_decoded_logs   │ 405.76 million │        966085222.03 GiB       │ 336.46 GiB        │ 15.27 │
│ base_raw_logs       │ 408.87 million │        973490113.53 GiB       │ 216.64 GiB        │ 16.01 │
│ base_decoded_traces │ 1.14 billion   │       2715110351.70 GiB       │ 1.04 TiB          │ 20.64 │
│ base_raw_traces     │ 1.25 billion   │       2968720538.38 GiB       │ 816.71 GiB        │ 21.28 │
└─────────────────────┴────────────────┴────────────────┴─────────────────┴───────────────────┴───────┘

6 rows in set. Elapsed: 0.008 sec.

用户可以使用实时响应在集群上执行分析查询。例如,计算自 6 月以来每天的交易数量。

SELECT
    toStartOfDay(block_timestamp) AS day,
    COUNT(*) AS txns,
    ROUND(AVG(txns) OVER (ORDER BY day ASC ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)) AS `7d avg`
FROM base_transactions
WHERE day > '2023-07-12'
GROUP BY 1
ORDER BY 1 DESC

┌─────────────────day─┬────txns─┬──7d avg─┐
│ 2023-12-04 00:00:00165727252691 │
│ 2023-12-03 00:00:00283293270246 │
│ 2023-12-02 00:00:00302197275016 │
│ 2023-12-01 00:00:00236117277115 │
│ 2023-11-30 00:00:00263169286202 │
│ 2023-11-29 00:00:00265525290758 │

...

│ 2023-07-17 00:00:005916262133 │
│ 2023-07-16 00:00:006762962876 │
│ 2023-07-15 00:00:007791261291 │
│ 2023-07-14 00:00:006185952981 │
│ 2023-07-13 00:00:004410344103 │
└─────────────────────┴─────────┴─────────┘

145 rows in set. Elapsed: 0.070 sec. Processed 72.90 million rows, 291.58 MB (1.04 billion rows/s., 4.15 GB/s.)

我们建议用户浏览 Dune 仪表板 此处,以获取查询灵感。虽然 Dune 不提供实时查询功能(上述查询为 0.070 秒),但其查询可以轻松转换为 ClickHouse 语法并在上述服务上执行。

结论

我们在本文中介绍了 Goldsky 的架构,探讨了他们为什么选择使用 Redpanda、Apache Flink 和 ClickHouse 来进行 ClickHouse 的多租户部署。虽然流式传输概念自然地与区块链数据和 Top-N、撤回和限时连接等问题对齐,但 ClickHouse 可用于通过提供跨子集或整个区块链的实时查询功能来进一步增强此架构。这些技术共同自然地互补,并使 Goldsky 能够交付一流的区块链分析服务。作为此服务的证明,并为了我们社区的利益,我们利用 Goldsky 免费提供对 Base 区块链的分析。请继续关注我们为免费公开其他区块链所做的努力!

立即开始使用 ClickHouse Cloud,并获得 300 美元的信用额度。在 30 天试用期结束时,继续使用按需付费计划,或联系我们以了解有关我们基于用量的折扣的更多信息。访问我们的定价页面了解详情。

分享这篇文章

订阅我们的新闻通讯

随时了解功能发布、产品路线图、支持和云产品!
正在加载表单...
关注我们
X imageSlack imageGitHub image
Telegram imageMeetup imageRss image
©2025ClickHouse, Inc. 总部位于加利福尼亚州湾区和荷兰阿姆斯特丹。