今天在线上运维过程中,遇到了一个TiDB写满操作系统磁盘的问题,最终通过查阅官方文档解决,这里记录一下。
01
背景
背景介绍:
早晨发现一例磁盘报警,登录到对应服务器上,看到如下的信息:
[root@ /data1]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 30G 1.6G 27G 6% / devtmpfs 32G 0 32G 0% /dev tmpfs 32G 12K 32G 1% /dev/shm tmpfs 32G 3.5M 32G 1% /run tmpfs 32G 0 32G 0% /sys/fs/cgroup /dev/sda2 30G 8.3G 20G 30% /usr /dev/sdb1 3.9T 343G 3.4T 10% /data1 /dev/sda5 30G 28G 0 100% /tmp
可以看到,/tmp目录被写满了。进入tmp目录,发现有这么一个文件,占用磁盘大小28G,具体信息如下:
[root@ /tmp]# ll drwxr-xr-x 3 tidb tidb 4096 Mar 16 10:16 1092_tidb
看到这个文件名字,包含1092和tidb字样,首先确定是tidb相关的,而且生成时间也是今天,说明是刚刚还有过写入。那么1092是什么意思呢?我们稍后解答
进入这个目录最底层,发现如下文件:
[root@ /tmp/1092_tidb/MC4wLjAuMDo0MDA1LzAuMC4wLjA6MTAwODE=/tmp-storage]# ll -rw------- 1 tidb tidb 1202978816 Mar 16 10:44 chunk.ListInDisk793242424 -rw------- 1 tidb tidb 1202716672 Mar 16 10:17 chunk.ListInDisk799449690 -rw------- 1 tidb tidb 1202978816 Mar 16 10:52 chunk.ListInDisk944002028 -rw------- 1 tidb tidb 1202978816 Mar 16 10:23 chunk.ListInDisk952535883 -rw------- 1 tidb tidb 1202978816 Mar 16 10:31 chunk.ListInDisk955718575 .....
看起来像是一些数据块文件。
以上是遇到的问题现象。现在我们要解决两个问题:
1、为什么/tmp磁盘会满?
2、这个1092_tidb是什么意思?
02
排查思路
本身对这个tmp目录比较敏感,就看了下TiDB的参数配置,查了查有没有对应的临时文件目录,结果还真查到了。
官网链接如下:https://docs.pingcap.com/zh/tidb/v4.0/tidb-configuration-file
可以看到如下内容:
通过上面2个参数的描述,我们知道了问题的答案。
为什么/tmp磁盘会满?
TiDB在内存不足以支撑某些查询的时候,会使用操作系统的临时目录,也就是/tmp目录,作为某些查询OOM之后的临时磁盘存储位置,/tmp目录下,紧跟着是操作系统用户id和"_tidb"的组合,而最后的一长串字符则是base64编码结果。
1092_tidb是什么意思?
由于我们的路径是1092_tidb,那我们现在看下tidb用户的用户id:
[root@ ]# cat /etc/passwd|grep tidb tidb:x:1092:1093::/usr/home/tidb:/bin/bash .....
这里可以看到,tidb的用户id确实是1092,结合上面的描述,我们知道1092_tidb就是这个临时文件的目录,而1092是tidb用户的id值。
同时,由于这个参数tmp-storage-path配置的路径,只有在oom-use-tmp-storage参数为true的时候,才生效。而我们线上的环境没有配置过这个参数,自然采用的是默认值,所以就写入了/tmp目录,造成磁盘写满。
03
解决办法
这个问题的解决方案,大概分为下面几个步骤吧:
1、编辑配置文件
利用tiup cluster edit-config cluster_name命令,动态编辑集群的配置文件,在server_configs.tidb这个组增加如下配置即可
server_configs:
tidb:
binlog.enable: false
binlog.ignore-error: false
enable-telemetry: false
log.slow-threshold: 300
tmp-storage-path: /data1/tidb-data
可以看到,临时目录我们改为了挂载盘/data1/tidb-data目录,保存退出之后,TiDB给出了后续的提示命令,如下:
Applied successfully, please use `tiup cluster reload tidb1-comment [-N <nodes>] [-R <roles>]` to reload config.
2、执行提示的命令
tiup cluster reload cluster_name -R tidb
tiup工具会自动帮我们滚动升级所有的tidb组件,滚动升级的过程中,可以看到如下更新字样:
Upgrading component tidb
Restarting instance 10.xx.xx.69:4005
Restart instance 10.xx.xx.69:4005 success
Restarting instance 10.xx.xx.62:4005
Restart instance 10.xx.xx.62:4005 success
Restarting instance 10.xx.xx.145:4005
Restart instance 10.xx.xx.145:4005 success
Reloaded cluster `cluster-name` successfully
3、检查新目录下的文件
可以看到,进入/data1/tidb-data目录之后,新的临时文件已经在当前目录生成。
[root@ /data1/tidb-data]# du -sh * 12K 1092_tidb .....
总结:
1、问题的发生都是有原因的,有些默认参数的配置其实并不是最合理的,需要结合具体场景去配置;
2、遇到问题,先查官方文档,官方文档上可能解决80%的问题,如果不能,可以去向论坛求救。
类似的临时文件参数问题,mysql也有一个案例,有兴趣可以看看:
Navicat for MySQL怎么连接数据库?- Navicat for MySQL连接数据库教程攻略