数据表报错Too many parts解决方法
问题排查步骤
- 磁盘或其他存储介质问题导致merge过慢或者中止。
登录Manager页面,检查是否存在磁盘容量不足或其他磁盘告警,如果存在,请按照告警指导处理。
如果是磁盘容量不足,也可以联系客户删除部分过期数据,释放空间,快速恢复业务。
- Zookeeper异常导致merge无法正常执行。
登录Manager页面,检查ZooKeeper是否存在服务不可用、ClickHouse服务在ZooKeeper的数量配额使用率超过阈值等相关告警,如果存在,请按照告警指导处理。
- 执行如下SQL排查是否存在副本同步队列任务积压:
select FQDN() as node,type,count() from clusterAllReplicas(default_cluster, system.replication_queue) group by node,type;
如果存在积压,请查看副本队列中的任务是否报错,并根据报错信息处理。
- 执行如下SQL排查是否存在节点间表结构不一致。
select FQDN(), create_table_query from clusterAllReplicas(default_cluster,system.tables) where name = '${table_name}' group by FQDN(),create_table_query;
如果存在,请将不一致的表结构修改一致。
- 执行如下SQL排查是否存在mutation任务异常:
select FQDN(), database, table, mutation_id, create_time, command from clusterAllReplicas(default_cluster, system.mutations) where is_done = '0' order by create_time asc;
如果mutation任务正常,等待mutation任务完成,如果mutation任务异常,清理异常的mutation任务。
- 业务写入压力过大导致merge速度小于insert速度。
可以用以下SQL语句检查报错节点最近一小时的写入条数和频次:
select tables,written_rows,count() from system.query_log where type='QueryFinish' and query_start_time between (toUnixTimestamp(now()) - 3600) AND toUnixTimestamp(now()) and query_kind = 'Insert' group by tables,written_rows order by written_rows limit 10;
业务上建议一次写入一个分区,写入频率不要太快,不要小批量数据的插入,适当增大每次插入的时间间隔。
- 如果没有触发Merge,或者Merge较慢,需要调整参数加快Merge。
加速Merge,需要调整如下参数,请参考加速Merge操作:
配置项
参考值
max_threads
CPU核数*2
background_pool_size
CPU核数
merge_max_block_size
8192的整数倍,根据CPU内存资源大小调整
cleanup_delay_period
适当小于默认值 30
修改parts_to_throw_insert值
增大Too many parts的触发阈值,除非特殊场景,不建议修改此配置。此配置在一定程度起到潜在问题预警的作用,如果集群硬件资源不足,此配置调整不合理,会导致服务潜在问题不能及时被发现,可能进一步引起其他故障,恢复难度增加。
- MRS 3.2.0之前版本:登录FusionInsight Manager界面,选择“集群 > ClickHouse > 配置 > 全部配置 > ClickHouseServer > 自定义 > clickhouse-config-customize”,添加表1中参数,保存配置,重启服务。
- MRS 3.2.0及之后版本:登录FusionInsight Manager界面,选择“集群 > ClickHouse > 配置 > 全部配置”,搜索并修改参数“merge_tree.parts_to_throw_insert”的值,保存配置,重启服务。
验证修改结果:
登录ClickHouse客户端,执行命令select * from system.merge_tree_settings where name = 'parts_to_throw_insert';