问题
我正在将数据写入 ClickHouse Cloud,需要确保在读取数据时获取的是最新且完整的信息。
答案
连接到同一节点
如果你使用的是 原生协议,或者通过会话进行写入/读取,那么你就应该连接到同一个副本:在这种情况下,你会直接从写入所在的节点读取数据,因此读取结果始终是一致的。
连接到任意节点
如果你无法保证自己始终连接的是同一个节点 (例如,通过 HTTPS 发起调用,而这些调用会被负载均衡器分发到不同节点) ,你可以选择:
A)
- 写入数据
- 连接到一个新的副本
- 运行
SYSTEM SYNC REPLICA db.table_name LIGHTWEIGHT - 读取最新数据
参见 SYSTEM 命令的参考文档
或者
B) 在任何时候都以顺序一致性读取
SELECT
...
SETTINGS select_sequential_consistency = 1请注意,使用 ClickHouse Cloud 及其默认的 SharedMergeTree 表引擎时,无需使用 insert_quorum_parallel——对 SharedMergeTree 的所有插入默认都是仲裁插入 (这是其设计使然) 。
使用 SYSTEM SYNC REPLICAS 或 select_sequential_consistency 会增加 ClickHouse Keeper 的负载,并且会因服务负载情况而导致性能变慢。
推荐的做法是使用同一会话或原生协议 (粘性连接) 进行写入/读取。