内容提要
PeerDB推出了ClickHouse目标连接器的Beta版,实现了从Postgres到ClickHouse的无缝数据复制,具有低延迟和高吞吐量。这使得在不影响事务性能的情况下对运营数据进行实时分析,并创建了高效的操作数据仓库或HTAP环境。文章提供了使用PeerDB进行从Postgres到ClickHouse的低延迟复制的实际演示,并解释了构建ClickHouse连接器时所做的设计选择。PeerDB旨在将PostgreSQL中的数据类型映射到ClickHouse中的本机对应类型,并将PostgreSQL中的原始CDC更改以Avro文件的形式暂存于S3中。
延伸解读
实时分析场景下的延迟与成本权衡
PeerDB 演示中实现了约 10 秒的复制延迟和每秒 2500 行的吞吐量,这得益于 ClickHouse 对实时数据摄入的灵活处理。文章指出,若使用 Snowflake 或 BigQuery 等数据仓库,如此短的同步间隔会导致它们长时间处于活跃状态,从而产生高昂成本。因此,在构建实时分析或 HTAP 环境时,选择 ClickHouse 作为目标端可以在保证数据新鲜度的同时控制成本,但需注意其 Beta 阶段的成熟度。
CDC 复制机制与数据一致性处理
PeerDB 的复制过程分为初始加载和变更数据捕获(CDC)两个阶段。初始加载通过并行快照加速,CDC 则基于 Postgres 的 WAL 和逻辑解码持续捕获变更。在 ClickHouse 端,PeerDB 使用 ReplacingMergeTree 引擎,将 INSERT 和 UPDATE 作为带版本号的新行插入,DELETE 则标记为删除行,最终通过主键去重实现数据合并。这种设计保证了最终一致性,但读者需注意去重是周期性的,查询时可能短暂看到重复数据。
数据类型映射的现状与限制
PeerDB 致力于将 Postgres 数据类型映射到 ClickHouse 的原生类型,例如数值、字符串和日期类型都能对应,数组映射为 Array 类型。然而,当前 JSON、JSONB 和 HSTORE 类型仅被映射为 ClickHouse 的 String 类型,这意味着在 ClickHouse 中无法直接使用 JSON 函数进行查询。文章提到未来会改进类型支持,因此对于依赖 JSON 高级功能的用户,需关注后续版本更新或考虑在分析层进行额外处理。
部署与运维的注意事项
使用 PeerDB 进行 Postgres 到 ClickHouse 复制时,用户可以选择 PeerDB 开源版或云版。开源版要求用户自行指定 S3 阶段来暂存 Avro 格式的原始 CDC 变更,而云版则自动管理。此外,同步间隔可设置为短至 10 秒,但需确保 ClickHouse 集群能够承受相应的写入压力。在创建 Peer 和 Mirror 时,通过 UI 操作较为便捷,但生产环境需考虑网络延迟、S3 成本以及监控复制延迟和吞吐量。
Q&A
PeerDB 的 ClickHouse 目标连接器是什么?
PeerDB 推出了 ClickHouse 目标连接器的 Beta 版,可以实现从 Postgres 到 ClickHouse 的无缝数据复制,具有低延迟和高吞吐量。
Postgres 到 ClickHouse 的复制有哪些主要使用场景?
主要使用场景包括:1) 运营分析或 HTAP,在不影响事务性能的情况下对运营数据进行实时分析;2) 将 ClickHouse 作为数据仓库,利用其成本效益和列式存储进行大规模数据分析。
PeerDB 如何实现 Postgres 到 ClickHouse 的复制?
PeerDB 通过创建 Postgres 和 ClickHouse 的 Peer,然后创建 Mirror 来实现复制。Mirror 包括初始加载(快照)和变更数据捕获(CDC),通过 Postgres 的 WAL 和逻辑解码实现。
PeerDB 复制到 ClickHouse 的延迟和吞吐量如何?
PeerDB 可以保持约 10 秒的延迟,吞吐量约为每秒 2500 行。在演示中,PeerDB 每 13 秒复制 35000 行,延迟接近 10 秒。
PeerDB 在 ClickHouse 中创建的表使用什么引擎?
PeerDB 在 ClickHouse 中自动创建的表使用 ReplacingMergeTree 引擎,通过 _peerdb_version 列处理去重,并支持 INSERT、UPDATE 和 DELETE 操作。
PeerDB 如何处理 Postgres 到 ClickHouse 的数据类型映射?
PeerDB 将 PostgreSQL 的数据类型映射到 ClickHouse 的本机对应类型。数值、字符串和日期类型映射到相应类型,ARRAY 映射到 Array 类型,JSON、JSONB 和 HSTORE 目前映射到 String。