磁盘降配

更新时间:
复制 MD 格式

本文为您介绍云数据库ClickHouse社区兼容版集群如何降低磁盘空间。

前提条件

  • 集群为社区兼容版集群。

  • 集群状态为运行中。

  • 集群没有未完成支付的续费订单。

    说明

    您可以登录云数据库ClickHouse控制台,在页面右上角,选择费用 > 费用与成本在左侧导航栏,选择订购订单>我的订单,完成订单支付或作废该订单。

注意事项

  • 单节点存储空间最小支持100 GB,最大支持32000 GB。

  • MergeTree类型引擎表在磁盘降配后,会将原有历史数据迁移写入新的集群中并自动完成重分布。

    支持迁移的内容:

    • 库、数据字典、物化视图。

    • 表结构:除了KafkaRabbitMQ引擎表以外的所有表结构。

    • 数据:增量迁移MergeTree族表的数据。

    不支持迁移的内容:

    • KafkaRabbitMQ引擎表的表以及数据。

      重要

      配置变更时会迁移数据到新建实例,并最终切流到新建实例。为保证KafkaRabbitMQ数据不分流,请先清理源集群的KafkaRabbitMQ引擎表,待变更完成后再重新创建。

    • MergeTree类型表(例如外表、Log表等)的数据。

    重要

    以上不支持的内容,在磁盘降配过程中,您需根据操作步骤,手动处理。

  • 磁盘降配过程中,禁止进行DDL操作。如不遵循,降配最后,可能会出现数据校验不通过的现象,进而导致降配失败。

  • 磁盘降配后,内部节点IP会发生变化,如果依赖节点IP数据写入和访问,需重新获取集群的VPC网段IP,具体操作,请参见获取集群的VPC网段IP

  • 变更集群配置后,会持续一段时间高频merge操作,这会导致IO使用率上升,从而引起业务请求的延迟增加。建议您提前规划以应对业务请求延迟的潜在影响。具体merge操作时间的计算方法,请参见计算迁移结束后的merge时间

  • 磁盘降配过程中,集群CPU和内存使用率会升高,预计单节点占用资源小于520GB。

费用

变更集群配置后,费用将会发生变化,具体费用请以控制台为准。更多信息,请参见变更配置计费说明

操作步骤

步骤一:记录并清理 Kafka/RabbitMQ 引擎表

Kafka/RabbitMQ 引擎表无法通过控制台变配功能直接迁移。变配前,您必须记录这些表的 DDL 语句并将其从集群中删除,以避免干扰变配任务。

  1. 登录集群并执行以下语句查询所有 Kafka 和 RabbitMQ 引擎表及其下游依赖。

    /*
    create_table_query:表定义语句
    dependencies_database:依赖该表的数据库
    dependencies_table:依赖该表的表名
    通过 dependencies_database 和 dependencies_table 可以确定依赖 Kafka/RabbitMQ 表的物化视图
    */
    SELECT * FROM system.tables WHERE engine IN ('RabbitMQ', 'Kafka');
  2. 查看物化视图定义,检查其目标表是否为隐式表。

    /*
    查看物化视图定义。
    如果物化视图的目标表为隐式表,需特别注意:
    删除物化视图时会同时删除隐式表,导致数据丢失。
    示例:如果 CREATE MATERIALIZED VIEW [db.]table_name [TO[db.]name] 未指定 TO 子句,
    系统会自动创建隐式表,格式可能为 '.inner_id.<TABLE_UUID>' 或 '.inner.<TABLE>'
    */
    SELECT * FROM system.tables WHERE database='<DATABASE>' AND name = '<MATERIALIZED_VIEW_NAME>';
  3. 如果物化视图创建时未使用 TO 子句,系统会自动生成以 .inner.inner_id 为前缀的隐式目标表。变配时这些隐式表会迁移到新集群节点,但由于内部命名机制,直接重建原物化视图可能导致命名冲突。因此,您必须先将隐式目标表重命名为常规表名。

    -- 将隐式目标表重命名为常规表名(在所有节点上执行)
    RENAME TABLE <database>.`.inner_id.<uuid>` TO <database>.<new_target_table_name> ON CLUSTER default;
  4. 删除物化视图和 Kafka/RabbitMQ 引擎表。

    重要

    必须先删除引用 Kafka/RabbitMQ 表的物化视图,然后再删除 Kafka/RabbitMQ 引擎表。否则变配操作会失败。

    -- 先删除物化视图
    DROP TABLE <database>.<materialized_view_name> ON CLUSTER default;
    
    -- 再删除 Kafka/RabbitMQ 引擎表
    DROP TABLE <database>.<kafka_or_rabbitmq_table_name> ON CLUSTER default;
重要

请务必保存所有记录的 DDL 语句。后续需要在升级后的集群上重建这些表。如果执行了 RENAME 操作,重建物化视图时请使用 TO 子句指向重命名后的目标表。更多信息,请参见 CREATE MATERIALIZED VIEW

步骤二:备份MergeTree类型表的业务数据

  1. 登录集群,通过以下语句,查看需要迁移数据的非MergeTree类型的表。

    SELECT
        `database` AS database_name,
        `name` AS table_name,
        `engine`
    FROM `system`.`tables`
    WHERE (`engine` NOT LIKE '%MergeTree%') AND (`engine` != 'Distributed') AND (`engine` != 'MaterializedView') AND (`engine` NOT IN ('Kafka', 'RabbitMQ')) AND (`database` NOT IN ('system', 'INFORMATION_SCHEMA', 'information_schema')) AND (`database` NOT IN (
        SELECT `name`
        FROM `system`.`databases`
        WHERE `engine` IN ('MySQL', 'MaterializedMySQL', 'MaterializeMySQL', 'Lazy', 'PostgreSQL', 'MaterializedPostgreSQL', 'SQLite')
    ))
  2. 备份数据。

    您需将以上MergeTree类型的业务数据进行备份。具体操作,请参见备份数据至OSS

步骤三:控制台磁盘降配操作

  1. 登录云数据库ClickHouse控制台

  2. 在页面左上角,选择集群所在地域。

  3. 集群列表页面,选择社区版实例列表

  4. 在目标集群ID操作列,单击变更配置

  5. 变更配置弹窗中,选择磁盘降配,单击确定

  6. 在弹出的磁盘降配检测窗口,查看检测状态。

    • 检测成功:单击下一步

    • 检测失败:根据页面提示进行相应修改,修改完成后单击重试检测。检测成功后,单击下一步

      在磁盘降配的过程中,检测失败的原因主要有以下几种。

      • 缺失唯一的分布式表:表示本地表没有创建分布式表,需要再创建一个对应的分布式表。

      • 对应的分布式表不唯一:表示本地表有不止一个分布式表,请删除多余的分布式表,仅保留一个即可。

      • Kafka/RabbitMQ引擎表不支持:表示存在Kafka/RabbitMQ引擎表,请删除。

      • 多副本实例存在非Replicated*MergeTree表:表示数据在多副本之间不一致,扩缩容在迁移数据期间会出现异常。

      • 分布式表和本地表的列不一致:表示需要您修改分布式表和本地表的列一致,否则扩缩容在迁移数据期间会出现异常。

      • 该表在部分节点缺失:您需要在不同分片创建同名的表。针对物化视图inner表,建议重命名inner表,然后重建物化视图,指向重命名后的inner表。具体操作,请参见物化视图inner表在不同分片不一致

  7. 变配页面,根据您的业务需求,配置存储空间以及停写时间

    1. 存储空间:单节点存储空间最小支持100 GB,最大支持32000 GB。

    2. 停写时间:磁盘降配会发生数据迁移,为了保证迁移的成功率,集群需停写。

      说明

      停写时间有以下要求:

      • 建议将停写时间至少设置为30分钟。

      • 磁盘降配必须在配置变更创建后的5天内结束,因此,停写时间的结束日期必须小于或等于当前日期+5

      • 为了降低迁移对您业务的影响,建议您设置的停写时间范围处于您的业务低峰时段。

  8. 单击立即购买,并根据页面提示完成支付。

  9. 支付完成页面,单击管理控制台

  10. 社区版实例列表状态列,可查看目标集群的状态。当集群状态由水平变配中转变为运行中时,磁盘降配成功。

说明

磁盘降配预计等待30分钟以上,等待时长和数据量相关,具体任务执行状态以控制台显示的集群状态为准。

如果集群中包含 Kafka/RabbitMQ 引擎表:当降配任务进入数据迁移阶段(表结构迁移完成后),请执行步骤四,在集群上重建 Kafka/RabbitMQ 引擎表,使增量数据恢复流动并同步到新节点。

在配置的停写窗口到来之前,请执行步骤五,删除集群上的 Kafka/RabbitMQ 引擎表及其下游物化视图,以防止停写期间消息堆积导致数据不一致。

步骤四:数据迁移阶段重建 Kafka/RabbitMQ 引擎表

当升级任务进入数据迁移阶段(表结构迁移完成后),使用之前保存的 DDL 语句重建 Kafka/RabbitMQ 引擎表及其下游物化视图。重建后,增量数据恢复流动并自动同步到新集群节点。

重要

如果您在步骤一中对隐式目标表执行了 RENAME 操作,请在重建物化视图时使用 TO 子句指向重命名后的目标表。关于 TO 子句的更多信息,请参见 CREATE MATERIALIZED VIEW.

-- Rebuild Kafka/RabbitMQ engine tables
CREATE TABLE <database>.<kafka_or_rabbitmq_table_name> (...)
ENGINE = Kafka/RabbitMQ
SETTINGS ...;

-- Rebuild materialized view (using TO clause pointing to the renamed target table)
CREATE MATERIALIZED VIEW <database>.<materialized_view_name> TO <database>.<new_target_table_name>
AS SELECT ... FROM <database>.<kafka_or_rabbitmq_table_name>;

步骤五:停写前删除 Kafka/RabbitMQ 引擎表

在配置的停写窗口到来之前,删除集群上的 Kafka/RabbitMQ 引擎表及其下游物化视图,以停止增量数据写入并确保最终数据同步的一致性。

-- Delete materialized views first
DROP TABLE <database>.<materialized_view_name> ON CLUSTER default;

-- Then delete Kafka/RabbitMQ engine tables
DROP TABLE <database>.<kafka_or_rabbitmq_table_name> ON CLUSTER default;

步骤六:降配完成后重建 Kafka/RabbitMQ 引擎表

降配任务完成后,使用之前保存的 DDL 语句在已降配的集群上重建 Kafka/RabbitMQ 引擎表及其下游物化视图,以恢复增量数据消费管道。

重要

如果您在步骤一中对隐式目标表执行了 RENAME 操作,请在重建物化视图时使用 TO 子句指向重命名后的目标表。关于 TO 子句的更多信息,请参见 CREATE MATERIALIZED VIEW.

-- Rebuild Kafka/RabbitMQ engine tables
CREATE TABLE <database>.<kafka_or_rabbitmq_table_name> (...)
ENGINE = Kafka/RabbitMQ
SETTINGS ...;

-- Rebuild materialized view (using TO clause pointing to the renamed target table)
CREATE MATERIALIZED VIEW <database>.<materialized_view_name> TO <database>.<new_target_table_name>
AS SELECT ... FROM <database>.<kafka_or_rabbitmq_table_name>;

步骤七:迁移非MergeTree类型表的业务数据

登录集群,通过OSS迁移步骤二:备份非MergeTree类型表的业务数据备份的数据。具体操作,请参见OSS导入数据