跳到主要内容
跳到主要内容
编辑此页面

ClickPipes for Postgres 常见问题解答

空闲状态如何影响我的 Postgres CDC ClickPipe?

如果您的 ClickHouse Cloud 服务处于空闲状态,您的 Postgres CDC ClickPipe 将继续同步数据,您的服务将在下一个同步间隔唤醒以处理传入的数据。一旦同步完成并达到空闲时间段,您的服务将返回空闲状态。

例如,如果您的同步间隔设置为 30 分钟,并且您的服务空闲时间设置为 10 分钟,则您的服务将每 30 分钟唤醒一次,并活动 10 分钟,然后返回空闲状态。

ClickPipes for Postgres 中如何处理 TOAST 列?

请参阅处理 TOAST 列页面以获取更多信息。

ClickPipes for Postgres 中如何处理生成列?

请参阅Postgres 生成列:陷阱和最佳实践页面以获取更多信息。

表是否需要具有主键才能成为 Postgres CDC 的一部分?

是的,对于 CDC,表必须具有主键或 REPLICA IDENTITY。REPLICA IDENTITY 可以设置为 FULL 或配置为使用唯一索引。

Postgres CDC 是否支持分区表?

是的,分区表开箱即用即可支持,只要它们定义了 PRIMARY KEY 或 REPLICA IDENTITY。PRIMARY KEY 和 REPLICA IDENTITY 必须同时存在于父表及其分区上。您可以在此处阅读更多相关信息。

我可以连接没有公共 IP 或位于私有网络中的 Postgres 数据库吗?

是的!ClickPipes for Postgres 提供两种连接到私有网络中数据库的方式

  1. SSH 隧道

    • 适用于大多数使用场景
    • 请参阅此处的设置说明
    • 跨所有区域工作
  2. AWS PrivateLink

    • 在三个 AWS 区域可用
      • us-east-1
      • us-east-2
      • eu-central-1
    • 有关详细的设置说明,请参阅我们的 PrivateLink 文档
    • 对于 PrivateLink 不可用的区域,请使用 SSH 隧道

如何处理 UPDATE 和 DELETE?

ClickPipes for Postgres 将来自 Postgres 的 INSERT 和 UPDATE 都捕获为新行,并在 ClickHouse 中使用不同的版本(使用 _peerdb_ 版本列)。ReplacingMergeTree 表引擎根据排序键(ORDER BY 列)在后台定期执行重复数据删除,仅保留最新 _peerdb_ 版本的行。

来自 Postgres 的 DELETE 会作为标记为已删除的新行传播(使用 _peerdb_is_deleted 列)。由于重复数据删除过程是异步的,您可能会暂时看到重复项。为了解决这个问题,您需要在查询层处理重复数据删除。

有关更多详细信息,请参阅

是否支持模式更改?

请参阅ClickPipes for Postgres:模式更改传播支持页面以获取更多信息。

ClickPipes for Postgres CDC 的费用是多少?

在预览期间,ClickPipes 是免费的。GA 后,定价仍在确定中。目标是使定价合理且与外部 ETL 工具相比具有高度竞争力。

我的复制槽位大小正在增长或没有减少;可能是什么问题?

如果您注意到 Postgres 复制槽位的大小不断增加或没有减少,通常意味着 WAL(预写日志)记录没有被您的 CDC 管道或复制过程足够快地消费(或“重放”)。以下是最常见的原因以及您如何解决这些问题。

  1. 数据库活动突然激增

    • 大型批量更新、批量插入或重要的模式更改可能会快速生成大量 WAL 数据。
    • 复制槽位将保存这些 WAL 记录,直到它们被消费,从而导致大小暂时性激增。
  2. 长时间运行的事务

    • 打开的事务强制 Postgres 保留自事务开始以来生成的所有 WAL 段,这可能会显着增加槽位大小。
    • statement_timeoutidle_in_transaction_session_timeout 设置为合理的值,以防止事务无限期地保持打开状态
      SELECT 
      pid,
      state,
      age(now(), xact_start) AS transaction_duration,
      query AS current_query
      FROM
      pg_stat_activity
      WHERE
      xact_start IS NOT NULL
      ORDER BY
      age(now(), xact_start) DESC;
      使用此查询来识别异常长时间运行的事务。
  3. 维护或实用程序操作(例如,pg_repack

    • 诸如 pg_repack 之类的工具可以重写整个表,在短时间内生成大量的 WAL 数据。
    • 在流量较慢的时段安排这些操作,或者在它们运行时密切监控您的 WAL 使用情况。
  4. VACUUM 和 VACUUM ANALYZE

    • 尽管这些操作对于数据库健康是必要的,但它们可能会产生额外的 WAL 流量——尤其是当它们扫描大型表时。
    • 考虑使用自动清理调整参数或在非高峰时段安排手动 VACUUM 操作。
  5. 复制消费者未主动读取槽位

    • 如果您的 CDC 管道(例如,ClickPipes)或其他复制消费者停止、暂停或崩溃,WAL 数据将在槽位中累积。
    • 确保您的管道持续运行,并检查日志中是否存在连接或身份验证错误。

有关对此主题的深入探讨,请查看我们的博客文章:克服 Postgres 逻辑解码的陷阱

Postgres 数据类型如何映射到 ClickHouse?

ClickPipes for Postgres 旨在尽可能本地地将 Postgres 数据类型映射到 ClickHouse 端。本文档提供了每个数据类型及其映射的完整列表:数据类型矩阵

我可以定义自己的数据类型映射,同时从 Postgres 复制数据到 ClickHouse 吗?

目前,我们不支持定义自定义数据类型映射作为管道的一部分。但是,请注意 ClickPipes 使用的默认数据类型映射是高度本地的。Postgres 中的大多数列类型都尽可能接近其在 ClickHouse 上的本地等效项进行复制。例如,Postgres 中的整数数组类型在 ClickHouse 上被复制为整数数组类型。

如何从 Postgres 复制 JSON 和 JSONB 列?

JSON 和 JSONB 列在 ClickHouse 中被复制为 String 类型。由于 ClickHouse 支持原生 JSON 类型,您可以根据需要通过 ClickPipes 表创建一个物化视图来执行转换。或者,您可以直接在 String 列上使用 JSON 函数。我们正在积极开发一项功能,该功能将 JSON 和 JSONB 列直接复制到 ClickHouse 中的 JSON 类型。此功能预计在几个月内可用。

当镜像暂停时,插入会发生什么?

当您暂停镜像时,消息会在源 Postgres 上的复制槽位中排队,确保它们被缓冲且不会丢失。但是,暂停和恢复镜像将重新建立连接,这可能需要一些时间,具体取决于源。

在此过程中,同步(从 Postgres 拉取数据并将其流式传输到 ClickHouse 原始表)和规范化(从原始表到目标表)操作都会中止。但是,它们保留了持久恢复状态所需的状态。

  • 对于同步,如果它在中途取消,则 Postgres 中的 confirmed_flush_lsn 不会前进,因此下一次同步将从与中止同步相同的位置开始,从而确保数据一致性。
  • 对于规范化,ReplacingMergeTree 插入顺序处理重复数据删除。

总而言之,虽然同步和规范化过程在暂停期间终止,但这样做是安全的,因为它们可以在不丢失数据或不一致的情况下恢复。

ClickPipe 创建是否可以自动化或通过 API 或 CLI 完成?

目前,您只能通过 UI 创建 ClickPipe。但是,我们正在积极开发公开 OpenAPI 和 Terraform 端点。我们预计这将在不久的将来(一个月内)发布。如果您有兴趣成为此功能的设计合作伙伴,请联系 [email protected]

如何加快我的初始加载速度?

您无法加快已在运行的初始加载速度。但是,您可以通过调整某些设置来优化未来的初始加载。默认情况下,这些设置配置为 4 个并行线程,每个分区的快照行数设置为 100,000。这些是高级设置,通常足以满足大多数使用场景。

对于 Postgres 版本 13 或更低版本,CTID 范围扫描速度较慢,这些设置变得更加关键。在这种情况下,请考虑以下过程以提高性能

  1. 删除现有管道:这是应用新设置所必需的。
  2. 删除 ClickHouse 上的目标表:确保删除先前管道创建的表。
  3. 创建具有优化设置的新管道:通常,将每个分区的快照行数增加到 100 万到 1000 万之间,具体取决于您的特定要求和 Postgres 实例可以处理的负载。

这些调整应显着提高初始加载的性能,尤其是对于较旧的 Postgres 版本。如果您使用的是 Postgres 14 或更高版本,由于改进了对 CTID 范围扫描的支持,这些设置的影响较小。

在设置复制时,我应该如何限定我的发布范围?

您可以让 ClickPipes 管理您的发布(需要写入权限)或自行创建它们。使用 ClickPipe 管理的发布,当您编辑管道时,我们会自动处理表的添加和删除。如果自行管理,请仔细限定您的发布范围,使其仅包含您需要复制的表 - 包括不必要的表会减慢 Postgres WAL 解码速度。重要的是,如果您不复制没有主键的表,请排除它们,以避免潜在的复制速度减慢。