Clickhouse硬盘爆了!该如何进行排查和优化设置?

在这里插入图片描述

Hello大家好,在我们使用了clickhouse进行数据存储后,多多少少遇到一些棘手的问题,在此分享一下,希望对有同样情况的同学有所帮助。

我们平台使用clickhouse改造后,系统流畅度得到大幅提升,大家有兴趣可以来体验一下效果,Webfunny前端监控和埋点系统

如大家所知,Clickhouse数据有几大优点,很适合处理海量的数据,如:查询效率高、clickhouse号称10亿数据,毫秒级查询返回结果;数据压缩率高、它采用了列式存储,对数据压缩有天然优势,节省硬盘资源;集群化、clickhouse天生支持集群化,同时有分区和分片设计,已经涵盖了我们按天分表的设计。

因此我们义无反顾的采用clickhouse进行了webfunny平台数据大改造,改造后效果确实符合我们要求,但是迎来了第一个问题——硬盘“爆了”。
在这里插入图片描述

硬盘爆了、技术同学急了,什么情况?不是说存储压缩率高,节省硬盘吗?这还没弄几下,硬盘就爆满了!!!这咋整?今天我们就分三步来告诉大家怎么排查和优化设置:

第一步、对比查找硬盘消耗最多的东西是什么

进入linux服务器,查看总体消耗
硬盘消耗情况查看:df -h
在这里插入图片描述

在 Linux 系统中,/dev/vda3 通常是一个设备文件,代表一个磁盘分区,是无法通过cd命令进入的。
所以我们可以进入 cd / 然后执行 du -sh *`命令来查看硬盘占用细节。
经过一番排查,最终确定是clickhouse对硬盘的消耗最大。
在这里插入图片描述

第二步、排查数据库内部占用情况

通过对Table size进行排序,可以看出,数据的总量也不过就是在百兆以内,所以肯定不是业务表消耗的。

在这里插入图片描述

既然不是业务表,那么就应该是是系统表消耗的,所以我们在clickhouse官网上找到了关于系统表的描述,原文查看

在这里插入图片描述

官网描述中,介绍了有哪些系统表,已经他们的创建规则,所以我们对这些系统表进行注意排查,也许是我的数据库版本原因,有些日志表是找不到的
sql整理如下:

SELECT count(*) FROM system.query_log

SELECT count(*) FROM system.metric_log

SELECT count(*) FROM system.trace_log

SELECT count(*) FROM system.part_log

经排查,占用最多的是query_log这个系统表,虽然业务数据才几百兆,但是query_log却有几亿条,是大头,其他log也有百万到千万不等。

在这里插入图片描述

接着我们对query_log进行了清理,这一步耗时比较长,要耐心等一会,执行sql如下:

ALTER TABLE system.query_log DELETE 
WHERE query_start_time < '2024-10-26 00:00:00'

我们先清理的linux系统里的日志文件,然后执行删除sql,可以看到硬盘的消耗明显下降了,由此可以确定硬盘爆满的原因了。

在这里插入图片描述

第三步、优化配置和解决方法

clickhouse默认会采集所有的日志备用,但是很多时候我们不会去查看日志,对于不需要的经常去查看这些日志的同学,可以调整配置内容
clickhouse提供了官网配置文档,进入/etc/clickhouse-server/config.xml文件中可以调整各项参数
database: database the system log table belongs to. This option is deprecated now. All system log tables are under database system.
table: table to insert data.
partition_by: specify PARTITION BY expression.
ttl: specify table TTL expression. 这里是设置删除周期,它默认是30天,你可以设置为1天或者其他时间。
flush_interval_milliseconds: interval of flushing data to disk.
engine: provide full engine expression (starting with ENGINE = ) with parameters. This option conflicts with partition_by and ttl. If set together, the server will raise an exception and exit.
max_size_rows: 分区最大行数,个人认为,如果有必要可以设置小一点

<clickhouse>
    <query_log>
        <database>system</database>
        <table>query_log</table>
        <partition_by>toYYYYMM(event_date)</partition_by>
        <ttl>event_date + INTERVAL 30 DAY DELETE</ttl>
        <!--
        <engine>ENGINE = MergeTree PARTITION BY toYYYYMM(event_date) ORDER BY (event_date, event_time) SETTINGS index_granularity = 1024</engine>
        -->
        <flush_interval_milliseconds>7500</flush_interval_milliseconds>
        <max_size_rows>1048576</max_size_rows>
        <reserved_size_rows>8192</reserved_size_rows>
        <buffer_size_rows_flush_threshold>524288</buffer_size_rows_flush_threshold>
        <flush_on_crash>false</flush_on_crash>
    </query_log>
</clickhouse>

以上是clichouse硬盘爆满的整个过程分享,感兴趣的同学可以直接访问webfunny前端监控和前端埋点系统
在这里插入图片描述

### ClickHouse 中与校验 (Checksums) 相关的异常问题排查与解决 在分布式数据库系统中,校验通常用于验证数据的一致性完整性。对于 ClickHouse 而言,当遇到与校验相关的异常时,这可能表明存在数据损坏、网络传输错误或其他潜在问题。 #### 可能的原因分析 1. **数据文件损坏**: 如果存储的数据文件由于硬件故障或意外中断而受损,则可能导致校验不匹配的情况发生[^1]。 2. **版本兼容性问题**: 不同版本之间的升级可能会引入新的校验算法或者改变现有实现方式,从而引发冲突[^3]。 3. **网络传输错误**: 在分布式环境中,如果节点之间通过不稳定连接交换大量信息,则有可能因丢包等原因引起计算偏差[^2]。 #### 解决方案建议 针对上述提到的各种可能性,以下是几种可行的方法来应对 clickhouse 出现 checksum 错误: ##### 方法一:重新同步副本 如果是多副本架构下的某个特定分区出现了 issue ,尝试让该部分重新复制自其他健康的 mirror 。此操作可以通过手动触发 merge 或者调整配置参数 `force_restore_data` 来完成 。 ```sql ALTER TABLE your_table_name ON CLUSTER '{cluster}' MATERIALIZE TTL; ``` 注意这里使用了集群选项 `{cluster}` 表达式以便作用于整个分布体系之上。 ##### 方法二:更新至最新稳定版软件 考虑到官方团队持续改进产品功能并修复已知漏洞 , 定期迁移到较新发行版本往往能够有效规避一些难以预料的技术难题 . 特别是在涉及到底层改动较大的场景下更是如此 . 确保遵循标准迁移流程 : - 停止服务进程 ; - 备份当前状态 ; - 替换可执行文件及其依赖库 ; - 启动测试实例确认无误后再正式上线运行 . ##### 方法三:优化 IO 子系统性能表现 鉴于频繁磁盘读写动作容易诱发随机 bit flip 类型事故 , 故有必要审视一下服务器端资源配置状况 : - 使用 SSD 驱动器代替传统 HDD 设备以减少延迟时间 ; - 提高 RAID 控制卡缓存容量以及启用电池保护机制防止突然断电丢失未提交事务记录 ; - 对操作系统层面做出相应修改比如增大文件描述符限制数值等等 . 最后提醒一点就是密切监控各项指标变化趋势 , 利用 grafana+prometheus 组合构建可视化面板辅助决策制定过程. ```bash watch -n 1 'free && df -h' ``` 以上命令可以帮助快速了解内存及硬盘空间占用情况.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值