Clickhouse配置参数优化
以下是个人在工作上集合官网参数列表进行参数优化调整。
一、MergeTree引擎相关的参数
- parts_to_delay_insert
如果单个分区中的活动部分数量超过 parts_to_delay_insert
值,则人工放慢 INSERT
操作。
注意:ClickHouse 会人为延长 INSERT
操作(增加 ‘sleep’),以便后台合并进程可以比添加的速度更快地合并部分。
- parts_to_throw_insert
如果单个分区中的活动部分数量超过 parts_to_throw_insert
值,则 INSERT
被打断,并抛出 Too many parts (N). Merges are processing significantly slower than inserts
异常。
注意:在 23.6 版本之前,此设置被设置为 300。您可以设置更高的不同值,它会减少出现 Too many parts
错误的概率,但同时 SELECT
性能可能会降低。
- max_delay_to_insert
在计算 INSERT
延迟时使用的值(单位为秒),如果单个分区中活动部分的数量超过 parts_to_delay_insert 值。
- max_suspicious_broken_parts
如果单个分区中的损坏部分数量超过 max_suspicious_broken_parts
值,则拒绝自动删除。
- merge_max_block_size
从合并的部分读取到内存中的行数。
注意:合并从部分中以 merge_max_block_size
行的块读取行,然后合并并将结果写入新部分。读取的块存放在 RAM 中,因而 merge_max_block_size
会影响合并所需 RAM 的大小。因此,对于非常宽的行的表,合并可能会消耗大量 RAM(如果平均行大小为 100kb,则在合并 10 个部分时,(100kb * 10 * 8192) = ~ 8GB 的 RAM)。通过减少 merge_max_block_size
,可以减少合并所需的 RAM,但会降低合并速度。
具体配置示例: /etc/clickhouse-server/config.xml
<merge_tree>
<max_suspicious_broken_parts>5</max_suspicious_broken_parts>
<parts_to_delay_insert>600</parts_to_delay_insert>
<parts_to_throw_insert>500</parts_to_throw_insert>
<max_delay_to_insert>2</max_delay_to_insert>
<merge_max_block_size>8192</merge_max_block_size>
</merge_tree>
注意:生产环境建议轮询重启Clickhouse-server服务
二、通用配置优化
- max_concurrent_queries
默认值:100
限制同时执行查询的总数量。请注意,还必须考虑对 INSERT
和 SELECT
查询的限制,以及用户的最大查询数量。
注意:此设置可以在运行时修改,并将立即生效。已经在运行的查询将保持不变。值为 0
(默认值)表示无限制。
- max_connections
默认值:4096
最大服务器连接数。
- background_pool_size
默认值:16
设置执行 MergeTree 引擎表的后台合并和变更的线程数。默认是16,可以根据CPU核数来确定
备注:
-
此设置也可以在服务器启动时从
default
配置文件配置,以保持与 ClickHouse 服务器启动时的向后兼容性。 -
您只能在运行时增加线程数。
-
要降低线程数,您必须重新启动服务器。
-
通过调整此设置,您可以管理 CPU 和磁盘负载。
- background_schedule_pool_size
默认值:512
用于持续执行复制表、Kafka 流和 DNS 缓存更新的一些轻量级定期操作的最大线程数。
- async_insert_threads
默认值:16
解析和插入数据的最大线程数。零表示禁用异步模式
- background_buffer_flush_schedule_pool_size
默认值:16
用于后台执行 Buffer-engine tables刷新操作的最大线程数。
- background_common_pool_size
默认值:8
用于后台执行各种操作(主要是垃圾收集)的 *MergeTree-engine表的最大线程数。
- background_distributed_schedule_pool_size
默认值:16
用于执行分布式发送的最大线程数。
- background_fetches_pool_size
默认值:16
从另一个副本中获取数据片段的最大线程数,用于后台中的 *MergeTree-engine 表。
- background_message_broker_schedule_pool_size
默认值:16
用于执行消息流的后台操作的最大线程数。
- background_move_pool_size
默认值:8
用于后台中将数据片段移动到另一个磁盘或卷的最大线程数,用于 *MergeTree-engine 表。
- database_catalog_drop_table_concurrency
默认值:16
用于删除表的线程池的大小。
- keep_alive_timeout
ClickHouse 等待 HTTP 协议的传入请求的秒数,然后关闭连接。
- listen_host
请求可以来自的主机的限制。
- max_partition_size_to_drop
默认值:50GB左右,如果解除限制设置为0
删除分区限制。
注意:如果 MergeTree 表的大小超过 max_partition_size_to_drop (以字节为单位),则无法通过 DROP PARTITION 查询删除分区。 此设置不需要重新启动 ClickHouse 服务器即可应用。
- max_table_size_to_drop
删除表的查询时间限制。值为 0 的意思是您可以删除所有表而没有任何限制。
- max_partitions_per_insert_block
默认值:100 零表示没有限制
限制单个插入块中最大分区数量,如果块包含过多分区,则抛出异常。
注意:在插入数据时,ClickHouse 会计算插入块中的分区数。如果分区数量超过 max_partitions_per_insert_block,则会抛出异常
- max_threads
查询处理线程的最大数量。该参数适用于并行进行查询处理管道相同阶段的线程。 例如,在从表中读取时,如果可能同时评估包含函数的表达、筛选 WHERE 以及对 GROUP BY 进行预聚合,使用至少 ‘max_threads’ 数量的线程,则会使用 ‘max_threads’。
注意:max_threads越小,查询消耗的内存就越少。
- max_memory_usage
在单台服务器上执行查询时可使用的最大 RAM 量。 0
的值表示无限制。
具体配置示例: /etc/clickhouse-server/config.xml
<clickhouse>
<max_concurrent_queries>300</max_concurrent_queries>
<max_connections>4096</max_connections>
<background_pool_size>32</background_pool_size>
<background_schedule_pool_size>512</background_schedule_pool_size>
<async_insert_threads>32</async_insert_threads>
<background_buffer_flush_schedule_pool_size>32</background_buffer_flush_schedule_pool_size>
<background_common_pool_size>32</background_common_pool_size>
<background_distributed_schedule_pool_size>32</background_distributed_schedule_pool_size>
<background_fetches_pool_size>32</background_fetches_pool_size>
<background_message_broker_schedule_pool_size>32</background_message_broker_schedule_pool_size>
<background_move_pool_size>16</background_move_pool_size>
<database_catalog_drop_table_concurrency>32</database_catalog_drop_table_concurrency>
<keep_alive_timeout>60</keep_alive_timeout>
<listen_host>0.0.0.0</listen_host>
<max_partition_size_to_drop>0</max_partition_size_to_drop>
<max_table_size_to_drop>0</max_table_size_to_drop>
<max_partitions_per_insert_block>1000</max_partitions_per_insert_block>
<max_threads>32</max_threads>
<max_memory_usage>5368709120</max_memory_usage>
</clickhouse>
三、分布式表相关配置
- distributed_ddl
管理在集群上执行 distributed ddl 查询(CREATE、DROP、ALTER、RENAME)。 仅在启用 ZooKeeper 时有效。
<distributed_ddl> 中的可配置设置包括:
设置 | 描述 | 默认值 |
---|---|---|
path | keeper中用于DDL查询的task_queue路径 | |
profile | 用于执行ddl查询的配置文件 | |
pool_size | 可以同时运行多少个on cluster查询 | |
max_tasks_in_queue | 队列可以存在的最大任务数 | 1000 |
task_max_lifetime | 如果节点的年龄超过此值则删除节点。 | 一周(单位:秒) |
cleanup_delay_period | 如果最后一次清理在 cleanup_delay_period 秒之前未进行,则在接收到新节点事件后开始清理。 | 60s |
具体配置示例: /etc/clickhouse-server/config.xml
<distributed_ddl>
<!-- Path in ZooKeeper to queue with DDL queries -->
<path>/clickhouse/task_queue/ddl</path>
<profile>default</profile>
<pool_size>1</pool_size>
<task_max_lifetime>604800</task_max_lifetime>
<cleanup_delay_period>60</cleanup_delay_period>
<!-- Controls how many tasks could be in the queue -->
<max_tasks_in_queue>1000</max_tasks_in_queue>
</distributed_ddl>
- [zoo]keeper配置相关
该配置用于连接[zoo]keeper进行元数据管理
具体配置示例: /etc/clickhouse-server/config.xml
<zookeeper>
<node>
<host>example1</host>
<port>2181</port>
</node>
<node>
<host>example2</host>
<port>2181</port>
</node>
<node>
<host>example3</host>
<port>2181</port>
</node>
</zookeeper>
后续参数有优化将持续更新。