本文为您介绍云数据库ClickHouse社区兼容版集群如何降低磁盘空间。
前提条件
集群为社区兼容版集群。
集群状态为运行中。
集群没有未完成支付的续费订单。
说明您可以登录云数据库ClickHouse控制台,在页面右上角,选择费用 > 费用与成本,在左侧导航栏,选择订购订单>我的订单,完成订单支付或作废该订单。
注意事项
单节点存储空间最小支持100 GB,最大支持32000 GB。
MergeTree类型引擎表在磁盘降配后,会将原有历史数据迁移写入新的集群中并自动完成重分布。
支持迁移的内容:
库、数据字典、物化视图。
表结构:除了Kafka和RabbitMQ引擎表以外的所有表结构。
数据:增量迁移MergeTree族表的数据。
不支持迁移的内容:
Kafka和RabbitMQ引擎表的表以及数据。
重要配置变更时会迁移数据到新建实例,并最终切流到新建实例。为保证Kafka和RabbitMQ数据不分流,请先清理源集群的Kafka和RabbitMQ引擎表,待变更完成后再重新创建。
非MergeTree类型表(例如外表、Log表等)的数据。
重要以上不支持的内容,在磁盘降配过程中,您需根据操作步骤,手动处理。
磁盘降配过程中,禁止进行DDL操作。如不遵循,降配最后,可能会出现数据校验不通过的现象,进而导致降配失败。
磁盘降配后,内部节点IP会发生变化,如果依赖节点IP数据写入和访问,需重新获取集群的VPC网段IP,具体操作,请参见获取集群的VPC网段IP。
变更集群配置后,会持续一段时间高频merge操作,这会导致IO使用率上升,从而引起业务请求的延迟增加。建议您提前规划以应对业务请求延迟的潜在影响。具体merge操作时间的计算方法,请参见计算迁移结束后的merge时间。
磁盘降配过程中,集群CPU和内存使用率会升高,预计单节点占用资源小于5核20GB。
费用
变更集群配置后,费用将会发生变化,具体费用请以控制台为准。更多信息,请参见变更配置计费说明。
操作步骤
步骤一:记录并清理 Kafka/RabbitMQ 引擎表
Kafka/RabbitMQ 引擎表无法通过控制台变配功能直接迁移。变配前,您必须记录这些表的 DDL 语句并将其从集群中删除,以避免干扰变配任务。
登录集群并执行以下语句查询所有 Kafka 和 RabbitMQ 引擎表及其下游依赖。
/* create_table_query:表定义语句 dependencies_database:依赖该表的数据库 dependencies_table:依赖该表的表名 通过 dependencies_database 和 dependencies_table 可以确定依赖 Kafka/RabbitMQ 表的物化视图 */ SELECT * FROM system.tables WHERE engine IN ('RabbitMQ', 'Kafka');查看物化视图定义,检查其目标表是否为隐式表。
/* 查看物化视图定义。 如果物化视图的目标表为隐式表,需特别注意: 删除物化视图时会同时删除隐式表,导致数据丢失。 示例:如果 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>';如果物化视图创建时未使用 TO 子句,系统会自动生成以
.inner或.inner_id为前缀的隐式目标表。变配时这些隐式表会迁移到新集群节点,但由于内部命名机制,直接重建原物化视图可能导致命名冲突。因此,您必须先将隐式目标表重命名为常规表名。-- 将隐式目标表重命名为常规表名(在所有节点上执行) RENAME TABLE <database>.`.inner_id.<uuid>` TO <database>.<new_target_table_name> ON CLUSTER default;删除物化视图和 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类型表的业务数据
登录集群,通过以下语句,查看需要迁移数据的非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') ))备份数据。
您需将以上非MergeTree类型的业务数据进行备份。具体操作,请参见备份数据至OSS。
步骤三:控制台磁盘降配操作
在页面左上角,选择集群所在地域。
在集群列表页面,选择社区版实例列表。
在目标集群ID的操作列,单击变更配置。
在变更配置弹窗中,选择磁盘降配,单击确定。
在弹出的磁盘降配检测窗口,查看检测状态。
检测成功:单击下一步。
检测失败:根据页面提示进行相应修改,修改完成后单击重试检测。检测成功后,单击下一步。
在磁盘降配的过程中,检测失败的原因主要有以下几种。
缺失唯一的分布式表:表示本地表没有创建分布式表,需要再创建一个对应的分布式表。
对应的分布式表不唯一:表示本地表有不止一个分布式表,请删除多余的分布式表,仅保留一个即可。
Kafka/RabbitMQ引擎表不支持:表示存在Kafka/RabbitMQ引擎表,请删除。
多副本实例存在非Replicated的
*MergeTree表:表示数据在多副本之间不一致,扩缩容在迁移数据期间会出现异常。分布式表和本地表的列不一致:表示需要您修改分布式表和本地表的列一致,否则扩缩容在迁移数据期间会出现异常。
该表在部分节点缺失:您需要在不同分片创建同名的表。针对物化视图inner表,建议重命名inner表,然后重建物化视图,指向重命名后的inner表。具体操作,请参见物化视图inner表在不同分片不一致。
在变配页面,根据您的业务需求,配置存储空间以及停写时间。
存储空间:单节点存储空间最小支持100 GB,最大支持32000 GB。
停写时间:磁盘降配会发生数据迁移,为了保证迁移的成功率,集群需停写。
说明停写时间有以下要求:
建议将停写时间至少设置为30分钟。
磁盘降配必须在配置变更创建后的5天内结束,因此,停写时间的结束日期必须小于或等于
当前日期+5。为了降低迁移对您业务的影响,建议您设置的停写时间范围处于您的业务低峰时段。
单击立即购买,并根据页面提示完成支付。
在支付完成页面,单击管理控制台。
在社区版实例列表的状态列,可查看目标集群的状态。当集群状态由水平变配中转变为运行中时,磁盘降配成功。
磁盘降配预计等待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导入数据。