- 更高的 insert 吞吐量
- 更高的后台合并吞吐量
- 更高的变更吞吐量
- 更快的扩容和缩容操作
- 以更轻量的方式为 select 查询提供强一致性
内部信息
用于查看 ReplicatedMergeTree 内部信息的大多数系统表,在 SharedMergeTree 中也同样存在;不过由于这里不会发生数据和元数据复制,system.replication_queue 和 system.replicated_fetches 这两个表除外。SharedMergeTree 为这两个表提供了相应的替代表。
system.virtual_parts
该表是 SharedMergeTree 中 system.replication_queue 的替代表。它存储当前最新一组 parts 的信息,以及正在进行中的未来 parts (例如合并、变更和已删除分区) 的信息。
system.shared_merge_tree_fetches
该表是 SharedMergeTree 中 system.replicated_fetches 的替代表。它包含当前正在进行的、将主键和校验和拉取到内存中的操作信息。
启用 SharedMergeTree
SharedMergeTree 默认处于启用状态。
对于支持 SharedMergeTree 表引擎的服务,无需手动启用任何功能。你可以像以前一样创建表,系统会根据你在 CREATE TABLE 查询中指定的引擎,自动使用对应的 SharedMergeTree 表引擎。
my_table。
在 ClickHouse Cloud 中,default_table_engine=MergeTree,因此无需指定 ENGINE=MergeTree。以下查询与上述查询完全相同。
SHOW CREATE TABLE 查看其 CREATE TABLE 语句中使用的是哪种表引擎:
设置
某些设置项的行为已发生显著变化:insert_quorum— 所有写入 SharedMergeTree 的 insert 都是 quorum 插入 (写入共享存储) ,因此使用 SharedMergeTree 表引擎时不需要此设置。insert_quorum_parallel— 所有写入 SharedMergeTree 的 insert 都是 quorum 插入 (写入共享存储) ,因此使用 SharedMergeTree 表引擎时不需要此设置。select_sequential_consistency— 不要求 quorum 插入,但会在执行SELECT查询时给 clickhouse-keeper 带来额外负载
一致性
与 ReplicatedMergeTree 相比,SharedMergeTree 提供了更好的轻量级一致性。向 SharedMergeTree 插入数据时,无需提供insert_quorum 或 insert_quorum_parallel 之类的设置。插入操作默认为 quorum 插入,这意味着元数据会存储在 ClickHouse-Keeper 中,并复制到至少达到 quorum 的 ClickHouse Keeper 节点。集群中的每个副本都会异步从 ClickHouse-Keeper 拉取新信息。
大多数情况下,你不应该使用 select_sequential_consistency 或 SYSTEM SYNC REPLICA LIGHTWEIGHT。异步复制已经足以覆盖大多数场景,而且延迟很低。只有在极少数你确实必须避免读取到过时数据的情况下,才建议按以下优先顺序处理:
-
如果你的读写查询是在同一会话中执行,或者都落在同一个节点上,则不需要使用
select_sequential_consistency,因为该副本已经拥有最新的元数据。 -
如果你写入一个副本、却从另一个副本读取,可以使用
SYSTEM SYNC REPLICA LIGHTWEIGHT强制该副本从 ClickHouse-Keeper 拉取元数据。 -
将
select_sequential_consistency作为查询设置的一部分使用。
ALTER 与变更可见性
SharedMergeTree 通过 ClickHouse Keeper 协调元数据变更。副本以异步方式拉取变更后的元数据,因此元数据变更不一定会立即在所有副本上可见。在同一节点的同一会话中执行的读取已会使用最新的元数据。如果需要在元数据变更后立即在另一个副本上执行读取,请使用 SYSTEM SYNC REPLICA LIGHTWEIGHT,让该副本从 ClickHouse Keeper 拉取元数据。
会产生变更的 ALTER 操作会执行后台任务,在共享存储中创建新的 parts,并通过 ClickHouse Keeper 协调其可见性。这与 ReplicatedMergeTree 中逐副本重写或传输数据的过程不同。
在 ClickHouse Cloud 中,alter_sync 默认为 0;如果客户端需要等待元数据操作或非元数据类的 MODIFY COLUMN 重写完成,请设置该参数。对于 UPDATE、DELETE 和 MATERIALIZE ... 操作,请使用 mutations_sync 控制是否等待,并通过 system.mutations 监控进度。