在过去几个月里,为用户提供一种快速简便的方法来将数据从 Postgres 复制到 ClickHouse 一直是我们的首要任务。上个月,我们 收购 了 PeerDB,这是一家专门从事 Postgres CDC 的公司。我们正在积极将 PeerDB 集成到 ClickPipes 中,以添加 Postgres 作为源连接器。同时,PeerDB 是将数据从 Postgres 移到 ClickHouse 的推荐解决方案。
在过去的几个月里,PeerDB 团队有机会与多个 ClickHouse 客户合作,帮助他们将数十亿行和数 TB 的数据从 Postgres 复制到 ClickHouse。在本篇博文中,我们将深入探讨最近发布的一些主要功能,以使复制体验更加稳定可靠。这些功能专注于增强从 Postgres 到 ClickHouse 的复制速度、稳定性和安全性。
高效刷新复制槽
PeerDB 使用 Postgres 逻辑复制槽来实现更改数据捕获 (CDC)。逻辑复制槽提供 Postgres 数据库中发生的 INSERT、UPDATE 和 DELETE 操作流。建议 始终使用复制槽。如果复制槽没有持续使用,WAL 文件可能会累积,从而存在使 Postgres 数据库崩溃的风险。
为了确保逻辑复制槽始终被使用,我们实现了一个 功能,该功能始终读取复制槽并将更改刷新到内部存储阶段 (S3)。然后,一个异步进程从 S3 使用这些更改并将它们应用于 ClickHouse。将更改刷新到内部存储阶段确保 S3 即使在目标 (ClickHouse) 停机时也能确保使用复制槽。
改进 ClickHouse 的内存处理
在将数据从 Postgres 复制到 ClickHouse 时,客户偶尔会在 ClickHouse 上遇到与内存相关的问题。当客户使用 ClickHouse 的免费试用版并配置了资源较少的实例 (RAM 和计算) 时,这种情况更为常见。PeerDB 通过 INSERT
查询和 INSERT SELECT
查询批量写入行到 ClickHouse。我们看到了两种类型的问题
-
某些查询失败,因为它们消耗的内存超过了 ClickHouse 服务器上分配的内存。
-
某些查询会被 ClickHouse 的过度分配跟踪器 终止。
我们尝试彻底了解 ClickHouse 提供的各种 数据库设置,这些设置会影响内存使用情况。基于此,我们 修改 了以下设置
-
max_block_size
:这对于我们的INSERT SELECT
查询很有用,其中此设置决定了SELECT
加载多少个块并插入。我们减少了它,希望更多的块可以减少执行查询时的内存峰值。 -
max_insert_block_size
:与max_block_size
类似,但它适用于我们的INSERT
查询。我们出于与上述相同的原因减少了它。 -
max_threads
:此设置控制 ClickHouse 用于处理查询的线程数。根据文档,此数字越低,消耗的内存越少。因此,我们减少了此参数。 -
memory_overcommit_ratio_denominator
:这与前面提到的过度分配跟踪器相关。我们通过将其设置为 0 来禁用查询的此设置。 -
dial_timeout
:有时查询需要超过 1 分钟,因此我们 将dial_timeout
增加到更高的值。
这些更改极大地减少了较小 ClickHouse 集群上的与内存相关的问题。我们正在积极与核心团队合作,进一步微调 ClickHouse 特定的设置。此外,我们正在开发一个 功能,该功能通过将大型数据集分解成可管理的部分来提高对大型数据集的处理能力,从而实现更有效的处理和存储。
行级转换
几个月前,PeerDB 在将数据从 Postgres 复制到 Kafka 等队列时提供了 基于 Lua 的行级转换。我们现在已将此功能扩展到 ClickHouse。使用此功能,客户可以编写简单的 Lua 脚本执行行级转换,从而实现诸如屏蔽 PII 数据、生成列等用例。下面是此功能的快速演示,用于在将数据从 Postgres 复制到 ClickHouse 时屏蔽 PII 列
改进 PeerDB Cloud 的安全性
在 PeerDB,保护从 Postgres 到 ClickHouse 的数据复制至关重要。为了增强安全性,我们围绕 AWS S3 实施了一些关键措施,我们在将数据推送到 ClickHouse 之前使用它来内部暂存数据。
使用 IAM 角色的临时凭证
一项重大改进是使用具有严格访问控制的 AWS S3 存储桶。我们使用 IAM 角色生成临时凭证,而不是传统的、长期存在的用户生成的访问密钥(存在更高的被泄露风险)。这些凭证由 AWS 自动轮换,确保它们始终是最新的并且仅在短时间内有效,从而最大限度地降低未经授权访问的风险。
此外,随着 ClickHouse 24.3.1 版本中引入 AWS_SESSION_TOKEN 参数,我们的安全实践得到了进一步加强。此更新允许使用短期凭证,符合我们保护数据复制的方法。
基于属性的访问控制 (ABAC)
在多租户环境中,管理对 S3 存储桶的访问会带来一些挑战,例如确保租户隔离、防止未授权访问以及最大程度地减少角色激增。为了解决这些问题,我们采用了**基于属性的访问控制**(ABAC)。ABAC 允许我们根据用户角色、资源标签和环境变量定义动态的、细粒度的访问策略。这种方法不仅提供了增强的安全性,还通过消除创建大量角色的需要来提高可扩展性。通过使用 ABAC,我们确保只有授权的组件才能访问敏感数据,从而维护一个安全且可管理的系统。
结论
希望您喜欢阅读这篇博文。PeerDB 已经花费了多个周期来强化 Postgres CDC 体验到 ClickHouse,并且现在正在支持多个客户实时从 Postgres 复制数十亿条记录到 ClickHouse。如果您想尝试使用 PeerDB 和 ClickHouse,请查看下面的链接或直接联系我们!