设置ClickHouse的限制和限额
【摘要】 在 ClickHouse 中,设置限制和限额(Quotas and Limits)是控制资源使用、防止查询滥用和保障集群稳定性的关键手段。以下是详细的配置方法和实践建议: 一、核心限制类型ClickHouse 支持多种资源限制,主要包括:查询资源限制内存、CPU 时间、执行时间、结果集大小等。并发控制最大并发查询数、用户级并发限制。分布式资源限制跨节点查询的资源分配。写入限制批量写入大小、速...
在 ClickHouse 中,设置限制和限额(Quotas and Limits)是控制资源使用、防止查询滥用和保障集群稳定性的关键手段。以下是详细的配置方法和实践建议:
一、核心限制类型
ClickHouse 支持多种资源限制,主要包括:
- 查询资源限制
- 内存、CPU 时间、执行时间、结果集大小等。
- 并发控制
- 最大并发查询数、用户级并发限制。
- 分布式资源限制
- 跨节点查询的资源分配。
- 写入限制
- 批量写入大小、速率限制。
二、配置方式
1. 用户级配额(Quotas)
通过 quotas 配置文件或 SQL 动态设置,限制用户或角色的资源使用。
(1)配置文件方式
在 config.xml 或 users.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_efficient 和 max_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>
五、最佳实践
- 分级配额:为不同用户角色(如分析师、ETL 作业)设置差异化配额。
- 默认限制:在
users.xml中为default用户设置基础限制。 - 监控告警:通过
system.asynchronous_metrics和system.metric_log监控资源使用。 - 逐步放宽:初始设置严格限制,根据业务需求逐步调整。
六、常见问题
Q:配额不生效怎么办?
- 检查用户是否正确关联配额(
SELECT * FROM system.users)。 - 确认配额名称拼写无误(区分大小写)。
- 查看
system.quotas_usage确认配额是否被触发。
Q:如何限制写入速率?
- 使用
insert_throttle参数(单位:字节/秒):SET insert_throttle = 1000000; -- 限制写入速率 1MB/s
Q:分布式查询超时如何处理?
- 调整
distributed_ddl_timeout和send_timeout:<remote_servers> <default> <send_timeout>300</send_timeout> <!-- 发送超时 300 秒 --> </default> </remote_servers>
通过合理配置限制和配额,可以显著提升 ClickHouse 集群的稳定性和资源利用率。建议结合业务负载定期优化参数。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)