跳至主要内容

如何在 ClickHouse 中实现数据读取一致性?

·阅读时间:2 分钟

问题

我正在将数据写入 ClickHouse 云,并且需要能够在读取数据时保证获取最新的完整信息。

答案

连接到同一节点

如果您使用的是本地协议或会话来进行写入/读取操作,则应该连接到同一副本:在这种情况下,您正在直接从写入的节点读取,因此您的读取始终是一致的。

连接到随机节点

如果您无法保证连接到同一节点(例如,通过 HTTPS 调用连接到节点,这些调用通过负载均衡器进行随机分配),您可以执行以下操作之一:

A)

  1. 写入您的数据
  2. 连接到新的副本
  3. 运行 SYSTEM SYNC REPLICA db.table_name LIGHTWEIGHT
  4. 读取最新的数据

请参阅 SYSTEM 命令 参考

B) 随时使用顺序一致性进行读取

SELECT 
...
SETTINGS select_sequential_consistency = 1

请注意,使用 ClickHouse 云及其默认的 SharedMergeTree 引擎时,无需使用 insert_quorum_parallel(这是默认设置)。

使用 SYSTEM SYNC REPLICASselect_sequential_consistency 会增加 ClickHouse Keeper 的负载,并可能降低性能,具体取决于服务的负载。

建议的方法是使用相同会话或本地协议(粘性连接)进行写入/读取操作。