DoubleCloud 即将停止运营。限时免费迁移服务,迁移至 ClickHouse。立即联系我们。 ->->

博客 / 工程

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

author avatar
ClickHouse 团队
2023 年 12 月 20 日

介绍

作为一家根植于开源的企业,我们发现我们的用户往往是最先识别和开发新架构模式或技术的应用的人。虽然我们可能是 ClickHouse 的专家,但我们不可能尝试所有可能的集成技术,也不可能用所有代表所有用例的数据集进行实验。因此,每次我们进行客户访谈时,我们都非常高兴听到新兴的部署模式,特别是与其他流行的 OSS 项目的结合。与我们的客户 Goldsky 交流后,我们了解到了一种模式,我们决定分享他们针对 Redpanda、Apache Flink 和 ClickHouse 的部署架构。我们认为这对于需要将数据集的转换子集交付给多个最终客户的用户来说可能具有广泛的应用。

为了突出显示此架构的功能,Goldsky 慷慨地从广泛使用的 Base 区块链中分享了数据,这些数据存储在公开可访问的 ClickHouse 实例中。这使那些希望使用区块链数据开发功能、产品或平台的用户能够轻松地使用此免费且持续更新的数据源创建概念验证,这要归功于 Goldsky 平台。通过消除对摄取管道、基础设施设置或通过 BigQuery 直接使用此数据所产生的成本管理问题的担忧,我们旨在使此概念验证成为一个有价值的示例,它说明了在使用 ClickHouse 和 Goldsky 进行区块链分析时所实现的效率。

Goldsky

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

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

虽然这些处理功能都内置于 Goldsky 服务中,但这从数据工程的角度来看提出了一个挑战 - 如何有效地将相同的数据集流式传输到可能数万个 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 性能的同时提供,速度可达每秒 500k 个事件。

有关 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 亿行和近 1 TiB 未压缩数据不等。

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:00 │ 165727 │ 252691 │ │ 2023-12-03 00:00:00 │ 283293 │ 270246 │ │ 2023-12-02 00:00:00 │ 302197 │ 275016 │ │ 2023-12-01 00:00:00 │ 236117 │ 277115 │ │ 2023-11-30 00:00:00 │ 263169 │ 286202 │ │ 2023-11-29 00:00:00 │ 265525 │ 290758 │ ... │ 2023-07-17 00:00:00 │ 59162 │ 62133 │ │ 2023-07-16 00:00:00 │ 67629 │ 62876 │ │ 2023-07-15 00:00:00 │ 77912 │ 61291 │ │ 2023-07-14 00:00:00 │ 61859 │ 52981 │ │ 2023-07-13 00:00:00 │ 44103 │ 44103 │ └─────────────────────┴─────────┴─────────┘ 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 的架构,探讨了他们为什么选择在 ClickHouse 的多租户部署中使用 Redpanda、Apache Flink 和 ClickHouse。虽然流式概念自然与区块链数据和 Top-N、撤回和时间限制连接等问题相一致,但 ClickHouse 可用于通过提供跨子集或整个区块链的实时查询功能来进一步增强这种架构。这些技术自然相互补充,使 Goldsky 能够提供一流的区块链分析服务。作为此服务的证明,以及为了我们社区的利益,我们利用 Goldsky在 Base 区块链上免费提供分析服务。敬请关注我们公开其他区块链的免费服务的努力!

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

分享此帖子

订阅我们的时事通讯

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