数据如何复制?
PostgreSQL 逻辑解码
ReplacingMergeTree
_peerdb_version) ;而删除则表示为插入该行的一个较新版本,并将 _peerdb_is_deleted 标记为 true。ReplacingMergeTree 引擎会在后台对数据进行去重和合并,并为给定主键 (id) 保留该行的最新版本,从而能够以版本化插入的方式高效处理 UPDATE 和 DELETE。
下面是 ClickPipes 在 ClickHouse 中创建表时执行的 CREATE TABLE 语句示例。
示例说明
users 表。
步骤 1 展示了 PostgreSQL 中 2 行数据的初始快照,以及 ClickPipes 将这 2 行数据初始加载到 ClickHouse 的过程。可以看到,这两行数据都会原样复制到 ClickHouse。
步骤 2 展示了对 users 表执行的三个操作:插入一行新数据、更新一行现有数据,以及删除另一行数据。
步骤 3 展示了 ClickPipes 如何将 INSERT、UPDATE 和 DELETE 操作以带版本的插入方式复制到 ClickHouse。UPDATE 会表现为 ID 2 对应行的一个新版本,而 DELETE 会表现为 ID 1 的一个新版本,并通过 _is_deleted 标记为 true。因此,与 PostgreSQL 相比,ClickHouse 中会多出三行数据。
因此,运行类似 SELECT count(*) FROM users; 这样的简单查询时,ClickHouse 和 PostgreSQL 中的结果可能会不同。根据 ClickHouse merge 文档,过期的行版本最终会在合并过程中被丢弃。但是,合并发生的时机无法预测,这意味着在合并完成之前,ClickHouse 中的查询可能会返回不一致的结果。
如何确保 ClickHouse 和 PostgreSQL 中的查询结果完全一致?
使用 FINAL 关键字去重
- 简单计数查询:统计 posts 的数量。
- 使用 JOIN 的简单聚合:累计浏览量最高的前 10 位用户。
FINAL 设置
ROW policy
_peerdb_is_deleted = 0 过滤器,一个简单的方法是使用 ROW policy。 下面是一个示例:创建行策略,从而在对表 votes 的所有查询中排除已删除的行。
行策略会应用于一组用户和角色。在此示例中,它会应用于所有用户和角色。也可以将其调整为仅应用于特定用户或角色。
像在 Postgres 中那样查询
视图
可刷新materialized view
deduplicated_posts 表了。