设置ClickHouse的限制和限额

举报
福州司马懿 发表于 2025/10/22 16:48:00 2025/10/22
【摘要】 在 ClickHouse 中,设置限制和限额(Quotas and Limits)是控制资源使用、防止查询滥用和保障集群稳定性的关键手段。以下是详细的配置方法和实践建议: 一、核心限制类型ClickHouse 支持多种资源限制,主要包括:查询资源限制内存、CPU 时间、执行时间、结果集大小等。并发控制最大并发查询数、用户级并发限制。分布式资源限制跨节点查询的资源分配。写入限制批量写入大小、速...

在 ClickHouse 中,设置限制和限额(Quotas and Limits)是控制资源使用、防止查询滥用和保障集群稳定性的关键手段。以下是详细的配置方法和实践建议:


一、核心限制类型

ClickHouse 支持多种资源限制,主要包括:

  1. 查询资源限制
    • 内存、CPU 时间、执行时间、结果集大小等。
  2. 并发控制
    • 最大并发查询数、用户级并发限制。
  3. 分布式资源限制
    • 跨节点查询的资源分配。
  4. 写入限制
    • 批量写入大小、速率限制。

二、配置方式

1. 用户级配额(Quotas)

通过 quotas 配置文件或 SQL 动态设置,限制用户或角色的资源使用。

(1)配置文件方式
config.xmlusers.xml 中定义配额规则(需重启服务生效):

<quotas>
    <default>
        <interval>
            <duration>3600</duration> <!-- 1小时周期 -->
            <queries>1000</queries>   <!-- 最大查询数 -->
            <errors>100</errors>      <!-- 最大错误数 -->
            <result_rows>1000000000</result_rows> <!-- 最大返回行数 -->
            <read_rows>10000000000</read_rows>    <!-- 最大扫描行数 -->
            <execution_time>300</execution_time>  <!-- 最大执行时间(秒) -->
        </interval>
    </default>
</quotas>

(2)SQL 动态创建配额
ClickHouse 20.8+ 支持通过 SQL 创建配额(无需重启):

CREATE QUOTA quota_1h FOR INTERVAL 1 HOUR MAX 
    QUERIES = 1000,
    ERRORS = 100,
    RESULT_ROWS = 1000000000,
    READ_ROWS = 10000000000,
    EXECUTION_TIME = 300;

(3)关联用户/角色
将配额分配给用户或角色:

-- 创建用户并关联配额
CREATE USER user1 IDENTIFIED WITH plaintext_password BY 'password' QUOTA quota_1h;

-- 或修改现有用户
ALTER USER user1 QUOTA quota_1h;

2. 系统级限制

通过 settings 参数在会话或查询级别限制资源。

(1)常用限制参数

参数 说明 示例值
max_memory_usage 单查询最大内存(字节) 10000000000 (10GB)
max_bytes_before_external_group_by 聚合溢出到磁盘的阈值 5000000000 (5GB)
max_execution_time 查询最大执行时间(秒) 60
max_concurrent_queries 最大并发查询数 100
distributed_product_mode 分布式 JOIN 行为 global (避免数据倾斜)

(2)会话级别设置
在连接时指定限制:

CLICKHOUSE_CLIENT_SETTING='max_memory_usage=5000000000' clickhouse-client -u user1

(3)查询级别设置
在 SQL 中覆盖默认值:

SET max_memory_usage = 5000000000;
SELECT count() FROM large_table;

或直接在查询中指定:

SELECT count() FROM large_table SETTINGS max_memory_usage=5000000000;

3. 分布式查询限制

(1)限制数据传输
通过 distributed_aggregation_memory_efficientmax_block_size 控制:

SET distributed_aggregation_memory_efficient = 1;
SET max_block_size = 65536; -- 减少网络传输块大小

(2)控制节点间交互
config.xml 中配置:

<distributed_ddl>
    <path>/clickhouse/task_queue/ddl/</path>
    <pool_size>16</pool_size> <!-- DDL 任务线程池大小 -->
</distributed_ddl>

三、关键场景配置示例

场景 1:限制单个查询内存

-- 创建配额:每小时最多 10GB 内存,执行时间不超过 5 分钟
CREATE QUOTA quota_mem_time FOR INTERVAL 1 HOUR MAX 
    MEMORY_USAGE = 10000000000,
    EXECUTION_TIME = 300;

-- 关联用户
ALTER USER analyst QUOTA quota_mem_time;

场景 2:防止扫描过多数据

-- 创建配额:每小时最多扫描 100 亿行
CREATE QUOTA quota_scan FOR INTERVAL 1 HOUR MAX 
    READ_ROWS = 10000000000;

-- 在查询中强制限制(优先使用配额)
SET max_read_rows = 10000000; -- 临时覆盖配额

场景 3:分布式表 JOIN 优化

-- 强制使用 GLOBAL JOIN 避免数据倾斜
SET distributed_product_mode = 'global';

-- 限制 JOIN 内存
SET join_overflow_mode = 'throw'; -- 内存不足时抛出异常
SET max_bytes_in_join = 1000000000; -- JOIN 最大内存 1GB

四、监控与调整

1. 查看当前限制

-- 查看用户配额使用情况
SELECT * FROM system.quotas WHERE user_name = 'user1';

-- 查看当前会话设置
SELECT * FROM system.settings WHERE name LIKE '%max_memory%';

2. 动态调整配额

-- 修改现有配额
ALTER QUOTA quota_1h ON CLUSTER default SET 
    INTERVAL 1 HOUR MAX QUERIES = 2000;

3. 慢查询熔断

config.xml 中配置:

<query_profiler_real_time_period_ns>100000000</query_profiler_real_time_period_ns>
<max_execution_time>60</max_execution_time>

五、最佳实践

  1. 分级配额:为不同用户角色(如分析师、ETL 作业)设置差异化配额。
  2. 默认限制:在 users.xml 中为 default 用户设置基础限制。
  3. 监控告警:通过 system.asynchronous_metricssystem.metric_log 监控资源使用。
  4. 逐步放宽:初始设置严格限制,根据业务需求逐步调整。

六、常见问题

Q:配额不生效怎么办?

  • 检查用户是否正确关联配额(SELECT * FROM system.users)。
  • 确认配额名称拼写无误(区分大小写)。
  • 查看 system.quotas_usage 确认配额是否被触发。

Q:如何限制写入速率?

  • 使用 insert_throttle 参数(单位:字节/秒):
    SET insert_throttle = 1000000; -- 限制写入速率 1MB/s
    

Q:分布式查询超时如何处理?

  • 调整 distributed_ddl_timeoutsend_timeout
    <remote_servers>
        <default>
            <send_timeout>300</send_timeout> <!-- 发送超时 300 秒 -->
        </default>
    </remote_servers>
    

通过合理配置限制和配额,可以显著提升 ClickHouse 集群的稳定性和资源利用率。建议结合业务负载定期优化参数。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。