SharedMergeTree表引擎

本文主要介绍云数据库ClickHouse企业版中的SharedMergeTree表引擎。

SharedMergeTree简介

SharedMergeTree表引擎仅在云数据库ClickHouse企业版中提供。

SharedMergeTree表引擎系列是ReplicatedMergeTree引擎的云原生替代方案,适配共享对象存储OSS,每个特定的MergeTree引擎类型都有对应的SharedMergeTree引擎,例如ReplacingSharedMergeTree替代ReplacingReplicatedMergeTree。

SharedMergeTree表引擎提高了云数据库ClickHouse企业版的性能。对于终端用户来说,无需做任何改变即可使用SharedMergeTree引擎系列,而不是基于ReplicatedMergeTree的引擎。它的优点如下:

  • 插入吞吐量提高。

  • 后台合并的吞吐量提高。

  • Mutation操作的吞吐量提高。

  • 更快的扩容和缩容操作。

  • 支持SELECT查询更轻量的数据强一致性。

SharedMergeTree带来的一个重要改进是与ReplicatedMergeTree相比,它提供了更彻底的计算和存储分离。下图展示了ReplicatedMergeTree如何分离计算和存储:image.png

正如您所见,尽管存储在ReplicatedMergeTree中的数据位于对象存储中,但元数据仍存储在每个clickhouse-server上。这意味着对于每个复制操作,元数据也需要在所有副本上进行复制。

image.png与ReplicatedMergeTree不同,SharedMergeTree不需要副本之间进行通信。相反,所有通信都通过共享存储和ClickHouse Keeper进行。SharedMergeTree实现了异步无主复制,并使用ClickHouse Keeper进行协调和元数据存储。这意味着随着服务的扩展,不需要复制元数据。这可以加快复制、变更、合并和扩展操作。SharedMergeTree允许每个表有数百个副本,使得无需分片即可进行动态扩展。这也意味着在云数据库ClickHouse企业版中,使用分布式查询执行方法可以利用更多的计算资源来执行查询。

系统监控

用于系统监控的ReplicatedMergeTree的大部分系统表(system table)在SharedMergeTree中也存在,唯独没有system.replication_queuesystem.replicated_fetches,因为没有数据和元数据的复制。然而,SharedMergeTree对这两个表有相应的替代表。

  • system.virtual_parts:这个表作为SharedMergeTree对system.replication_queue的替代,它存储有关最新一组data parts以及正在进行的合并、变更和删除分区操作的未来分区信息。

  • system.shared_merge_tree_fetches:这个表是SharedMergeTree对system.replicated_fetches的替代。它包含关于正在加载入内存的主键和校验码信息。

使用SharedMergeTree

SharedMergeTree已经是企业版(development tier)中默认的表引擎,对于支持SharedMergeTree表引擎的实例,您不需要做任何额外变更。您可以像以前一样创建表,它会自动使用基于SharedMergeTree的表引擎,该引擎与您在CREATE TABLE查询中指定的引擎相对应。

  • 您可以通过使用SharedMergeTree表引擎可以创建my_table表。

    CREATE TABLE my_table(
     key UInt64,
     value String
    )
    ENGINE = MergeTree
    ORDER BY key 
  • 由于default_table_engine=MergeTree您不必再特别设置ENGINE=MergeTree。下面的查询语句和上面的完全一样。

    CREATE TABLE my_table(
     key UInt64,
     value String
    )
    ORDER BY key 
  • 如果您使用Replacing、Collapsing、Aggregating、Summing、VersionedCollapsing、Graphite MergeTree表,它们将自动转换为相应的基于SharedMergeTree的表引擎。

    CREATE TABLE myFirstReplacingMT
    (
        `key` Int64,
        `someCol` String,
        `eventTime` DateTime
    )
    ENGINE = ReplacingMergeTree
    ORDER BY key;
  • 您可以使用SHOW CREATE TABLE查看用于创建表的语句。

    SHOW CREATE TABLE myFirstReplacingMT;
    CREATE TABLE default.myFirstReplacingMT 
    ( `key` Int64, `someCol` String, `eventTime` DateTime ) 
    ENGINE = SharedReplacingMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}') 
    ORDER BY key 
    SETTINGS index_granularity = 8192

引擎配置

您需要关注以下引擎配置发生的变化:

  • insert_quorum:所有对SharedMergeTree的insert都是quorum insert(写入共享对象存储),因此在使用SharedMergeTree表引擎时不需要此设置。

  • insert_quorum_parallel:所有对SharedMergeTree的insert都是quorum insert(写入共享对象存储)。

  • select_sequential_consistency:不需要quorum inserts,会引起在SELECT查询中向ClickHouse Keeper增加附加的请求。