Help us learn about your current experience with the documentation. Take the survey.

ClickHouse 中的分层存储

ClickHouse 中的 MergeTree 表引擎支持分层存储。 有关设置和进一步说明的详细信息,请参阅 使用多个块设备进行数据存储 的文档。

引用 MergeTree 文档 中的内容:

MergeTree 系列表引擎可以将数据存储在多个块设备上。例如, 当某个表的数据隐式地分为"热"和"冷"时,这会很有用。 最新的数据经常被请求,但只需要少量的存储空间。 相反,胖尾历史数据很少被请求。

当与 Amazon S3 等远程存储后端一起使用时, 这形成了一种非常高效的存储方案。它支持存储策略, 允许数据在本地磁盘上保留一段时间,然后将其移动到对象存储中。

一个 示例配置 如下所示:

<storage_configuration>
    <disks>
        <fast_ssd>
            <path>/mnt/fast_ssd/clickhouse/</path>
        </fast_ssd>
        <gcs>
            <support_batch_delete>false</support_batch_delete>
            <type>s3</type>
            <endpoint>https://storage.googleapis.com/${BUCKET_NAME}/${ROOT_FOLDER}/</endpoint>
            <access_key_id>${SERVICE_ACCOUNT_HMAC_KEY}</access_key_id>
            <secret_access_key>${SERVICE_ACCOUNT_HMAC_SECRET}</secret_access_key>
            <metadata_path>/var/lib/clickhouse/disks/gcs/</metadata_path>
        </gcs>
     ...
    </disks>
    ...
    <policies>

        <move_from_local_disks_to_gcs> <!-- policy name -->
            <volumes>
                <hot> <!-- volume name -->
                    <disk>fast_ssd</disk>  <!-- disk name -->
                </hot>
                <cold>
                    <disk>gcs</disk>
                </cold>
            </volumes>
            <move_factor>0.2</move_factor>
            <!-- The move factor determines when to move data from hot volume to cold.
                 See ClickHouse docs for more details. -->
        </moving_from_ssd_to_hdd>
    ....
</storage_configuration>

在此存储策略中,定义了两个卷 hotcold。当 hot 卷的占用率达到 disk_size * move_factor 后,数据将被移动到 Google Cloud Storage (GCS)。

如果此存储策略不是默认策略,可以通过附加存储策略来创建表。例如:

CREATE TABLE key_value_table (
    event_date Date,
    key String,
    value String,
) ENGINE = MergeTree
ORDER BY (key)
PARTITION BY toYYYYMM(event_date)
SETTINGS storage_policy = 'move_from_local_disks_to_gcs'

在此存储策略中,移动是隐式发生的。也可以将 数据在本地磁盘上保留固定时间,然后将它们作为 数据移动。

这种方法可以通过 表 TTL 实现, MergeTree 表引擎也支持此功能。

ClickHouse 文档在 实现热-温-冷架构 的示例中详细展示了此功能。

对于上面显示的示例,可以采用类似的方法。首先调整存储策略:

<storage_configuration>
    ...
    <policies>
        <local_disk_and_gcs> <!-- policy name -->
            <volumes>
                <hot> <!-- volume name -->
                    <disk>fast_ssd</disk>  <!-- disk name -->
                </hot>
                <cold>
                    <disk>gcs</disk>
                </cold>
            </volumes>
        </local_disk_and_gcs>
    ....
</storage_configuration>

然后按如下方式创建表:

CREATE TABLE another_key_value_table (
    event_date Date,
    key String,
    value String,
) ENGINE = MergeTree
ORDER BY (key)
PARTITION BY toYYYYMM(event_date)
TTL
    event_date TO VOLUME 'hot',
    event_date + INTERVAL 1 YEAR TO VOLUME 'cold'
SETTINGS storage_policy = 'local_disk_and_gcs';

这样创建的表会将超过 1 年的数据(基于 event_date 列评估)移动到 GCS。这种存储策略对于仅访问最新数据的追加表(如审计事件)很有用。 您也可以完全删除数据,这可能是监管要求。

本指南中没有提及修改 TTL,但这也是可能的。 有关详细信息,请参阅 ClickHouse 文档中的 修改 TTL