GaussDB(DWS)磁盘使用率相关问题定位指南

举报
你怎么不讲道理 发表于 2020/06/11 19:37:51 2020/06/11
【摘要】 1. 通过横向与纵向对比,确定占用空间异常的实例与最小级别目录。(横向对比:单实例或部分实例磁盘使用率异常时,对比不同实例上各目录大小差异;纵向对比:所有实例磁盘使用率异常增高时,与之前的磁盘使用情况进行对比) 2. 确认目录后按照对应场景处理 3. 磁盘使用率达到90%后,处理时需注意集群的只读状态;磁盘使用率达到100%后,直接联系华为工程师

磁盘使用率相关问题定位指南

一、定位思路

1.1 核心思想

确定是哪个目录占用空间异常,再具体处理

1.2定位三板斧

1.       通过横向与纵向对比,确定占用空间异常的实例与最小级别目录。(横向对比:单实例或部分实例磁盘使用率异常时,对比不同实例上各目录大小差异;纵向对比:所有实例磁盘使用率异常增高时,与之前的磁盘使用情况进行对比)

2.       确认目录后按照对应场景处理

3.       磁盘使用率达到90%后,处理时需注意集群的只读状态;磁盘使用率达到100%后,直接联系华为工程师

二、定位分析

2.1常用命令

查看磁盘使用率

df -h

查看某个目录占用空间大小

du -sh 目录

查看当前目录下各文件/目录占用空间大小

du -sh *

查看集群状态(包含实例目录)

cm_ctl query -Cvd

查看对应dn的端口号

cat dn目录/postgresql.conf |grep port

例:cat /srv/BigData/mppdb/data1/master1/postgresql.conf | grep port

2.2场景划分

目录结构概览(此处只列举常见目录,下层目录只以master为例展开)

2.2.1 archive目录占用空间较大

现象

单个或多个实例archive目录占用空间较大

根因

打开了日志归档参数archive_mode,导致archive目录下不断归档xlog,占用空间越来越大

应急

1)  关闭归档参数

gs_guc reload -Z coordinator -Z datanode -N all -I all -c "archive_mode=off"

2)  手动清理archive目录下的归档日志(归档日志并不影响集群运行,一般不建议打开。现网问题删除操作需与客户确认)

archive目录下文件数量过多时,可能无法使用rm -f *命令进行删除,可参看以下命令分批删除

find -name "*" | xargs -n 10 rm -f

2.2.2 pg_xlog目录占用空间较大且未打开归档

现象

pg_xlog占用空间大,pg_xlog目录下文件数量多,archive目录占用空间不大

分析

1)  遇到此场景时,优先查看集群状态,确认此dn的对端(例:dn6001的对端是dn6002)是否状态异常,若当前dn为从备,则查看同一dn环的主备是否有一个发生故障。当主备有一个dn状态异常时,另一副本数据和xlog会存放在从备,在备机恢复之前不会回收。若遇到此场景,则应优先考虑如何将集群恢复为normal

2)  若集群状态正常,主dnxlog过多,可能是因为主备xlog同步较慢导致,可在备机所在节点执行”gs_ctl querybuild -D 备机目录查看同步进度

3)  若主备日志同步进度为100%,大量xlog为最近突然产生,则排查业务上是否有带索引导入的场景。导入的目标表如果有索引,有可能产生大量xlog

根因

1)  主备dn有一个发生故障导致xlog在当前主机和从备积压

2)  主备日志同步较慢导致主dn日志堆积

3)  带索引导入产生大量xlog

应急

1)  若满足根因1,则优先恢复集群状态,恢复normal后会自动进行xlog同步,同步结束后自动回收

2)  若满足根因2,则查看IO状况,结合日志分析

3)  若满足根因3,则排查业务侧是否有对应情况,中断该业务,删除目标表的索引,再导入,导入结束后再重新创建索引

4)  若无法快速恢复集群状态,或无法快速定位,此场景可直接联系华为工程师处理

2.2.3 pgsql_tmp目录占用空间大

现象

单个或多个实例的pgsql_tmp目录占用空间大

分析

psql_tmp目录存放的是临时下盘文件,这个目录大说明产生了大量的算子下盘,需找到具体语句,杀掉该语句后空间自动恢复

pgsql_tmp目录下临时文件的命名方式类似pgsql_tmp140359455721216.9,其中红色部分表示产生该临时文件的线程号,最后的9表示这个文件是该线程产生的第九个文件

根因

临时文件下盘

应急

1)  通过查看pgsql_tmp目录下的文件名,确定产生下盘文件的线程号

2)  根据该线程号,连到对应实例(-d 使用postgres即可,因为pg_stat_activity可以查到所有库的;-p 使用该实例的端口号,查看端口号的方法参考2.1常用命令),执行

”select * from pg_stat_activity where pid = pid

即可查到产生下盘文件的语句

3)  在该实例执行

”select * from pg_terminate_backend(pid)”

 即可杀掉该语句

4)  对该业务语句进行调优,优化后再上线

5)  若情况比较紧急,可直接kill dn进行应急,但是如果不定位到具体语句,业务再次拉起后仍会复现

2.2.4 base目录下的database目录占用空间异常增高

现象

单个或多个实例base目录下的库目录(除pgsql_tmp以外的目录)占用空间高

分析

遇到此场景时,应优先确定是部分dndatabase目录占用空间大,还是所有dndatabase目录占用空间都高。如果是部分dn,则通过对比正常dn和异常dn目录下的文件找到占空间大的对象;如果是所有dndatabase目录都异常增高,则选择一个dn实例排查大表或最近更新的文件。

database目录下,文件的命名方式,行存表或行存表分区为12345.1,其中红色部分为relfilenode,最后的数字表示这是该relation的第几个文件;列存表为12345_C10.1,其中红色部分表示relfilenodeC10表示这是第几列,最后的数字表示这是该relation10列的第几个文件;每个文件大小达到1G后开启下一个文件

 

详细步骤如下

1.       部分dn的库目录占用空间大

1)  databaseoid在不同dn上有可能不同

分别连接(-d postgres -p 对应dn端口)异常dn和正常dn,执行”select oid,* from pg_database” 并结合base目录下各database目录的大小,进行比对,确定占用空间高的database

2)  在正常dn和异常dn分别进入该目录,执行ll *.100

对比两边大于100Grelation数量,例如正常dn3个,异常dn5个,有明显差异,则对异常dn5个大于100Grelation均进行排查(因为同一个relationrelfilenode在不同dn可能不同,因此不能直接确定排除哪3个);如果在正常dn和异常dn上的结果一致,则缩小范围,例如ll *.50ll *.10ll *.5甚至ll *.1进行对比,找到差别后依次排查,数量较多时可在文本编辑器中使用列编辑功能批量编辑sql语句。

 

连接到异常dn对应的database,执行

”select * from pg_class where relfilenode = relfilenode

如果可以查到结果,则relname就是对应的relation,可能为表或者索引;

 

如果在pg_class中查不到对应的relation,则执行

”select * from pg_class where oid = (select parentid from pg_partition where relfilenode = relfilenode)”

如果可以查到结果,则说明该relation是分区表的一个分区,我们通过上面的语句查到了对应的主表;

 

当查到对应的表或索引后,可以通过执行

“select * from pg_namespace where oid = relnamespace

获得该对象的schema,其中relnamespace可以在pg_class的结果中获得;如果操作人员知道对应表的schema,则可以跳过此步骤

 

如果在pg_classpg_partition中都查不到记录,则需进一步确认该relation是否为系统表,此时建议联系华为工程师处理

3)  通过上一步,我们找到了怀疑对象,接下来要进行确认

对每一个怀疑对象(表或索引),连接到正常dn和异常dn的对应database库,分别执行

”\dt+ schema.relation

对比该对象在两个dn上占用空间大小,若大小确实相差较大,则说明该对象是我们要找的目标

4)  确定所有目标对象后,依次进行处理

若对象为索引,则排查索引对应的表是否也存在倾斜;连接到正常dn和异常dn的对应database,执行

“select count(*) from schema.relation

若表有明显倾斜,则对表进行整改;若表没有倾斜,则执行reindex重建索引

“reindex table schema.relation

 

若对象为表,则直接在正常dn和异常dn的对应database,执行

“select count(*) from schema.relation

若表有明显倾斜,则对表进行整改;若表没有倾斜,则对该表做vacuum full

“vacuum full table

5)  若清理大表之后,空间仍未下降,则查看文件fd是否仍被占用

“lsof -n $data目录 |grep deleted”

若出现此情况,空间最终会被释放,但是可能比较慢,可以kill dn进程快速恢复

2.       所有dndatabase目录都高,则选择一个dn进行分析

1)    连接到对应dn,执行

“select oid,* from pg_database”

结合base目录下各database目录的大小,确定占用空间高的database

2)    进入该database目录,执行ll *.100,找出占用空间大的relation,若结果为空,则依次执行ll *.50ll *.30ll *.10ll *.5ll *.1等,查找占用空间大的对象;若无明显占用空间大的对象,或大小接近的对象数量非常多,则根据磁盘空间上涨的时间,查看最后更新时间与上涨时间接近的文件,确定relfilenode

3)    连接到该dn对应的database,执行

”select * from pg_class where relfilenode = relfilenode

如果可以查到结果,则relname就是对应的relation,可能为表或者索引;

 

如果在pg_class中查不到对应的relation,则执行

”select * from pg_class where oid = (select parentid from pg_partition where relfilenode = relfilenode)”

如果可以查到结果,则说明该relation是分区表的一个分区,我们通过上面的语句查到了对应的主表;

 

当查到对应的表或索引后,可以通过执行

“select * from pg_namespace where oid = relnamespace

获得该对象的schema,其中relnamespace可以在pg_class的结果中获得;如果操作人员知道对应表的schema,则可以跳过此步骤

 

如果在pg_classpg_partition中都查不到记录,则需进一步确认该relation是否为系统表,此时建议联系华为工程师处理.

4)    对查出来的表,在该dn上执行

“\dt+ schema.relation

查看目标对象在单dn的大小,对占用空间过大的表进行清理(需客户同意)(如果是用delete的方式清理,则清理之后需再做vacuum full

5)    若清理大表之后,空间仍未下降,则查看文件fd是否仍被占用

“lsof -n $data目录 |grep deleted”

若出现此情况,空间最终会被释放,但是可能比较慢,可以kill dn进程快速恢复

2.2.5 其他场景一:core文件生成过多导致磁盘空间占满

现象

实例频繁core导致core文件过多将磁盘占满

分析

查看core文件的路径

”cat /proc/sys/kernel/core_pattern”

core文件占用空间过大,则重新配置core名称,使core文件每次进行覆盖,每个实例最多保存一个core

应急

1)   echo "core" >/proc/sys/kernel/core_pattern

2)   kill om_monitor

3)   kill cm_agent

保留一两个core文件,删除其他core文件,联系华为工程师分析

2.2.6 其他场景二:单个日志文件过大导致/var/log目录磁盘空间占满

现象

单个日志文件过大(om_monitor日志或system_call日志)导致/var/log目录占满

应急

1)  将大日志文件cp到其他目录;如果文件过大或情况紧急,则跳过此步骤

2)  清空该日志文件内容

echo ‘cleanup’ > 日志文件

3)  联系华为工程师进一步分析

2.2.7 其他场景三:xfs文件系统预分配导致磁盘使用率高

现象

base目录下某个database目录占用空间大,但是找不到大文件

分析

遇到此场景时,统计该database目录下文件总大小,与”du -sh *”的结果相比较,如果相差较多,说明是因为新建了大量的列存宽表,产生大量文件,每个文件在xfs上都会预占16M空间,导致磁盘空间上涨

应急

1)    root用户登录空间占用高的服务器,执行以下语句释放预占空间

sync

/sbin/sysctl -w vm.drop_caches=3

2)    部署drop cache脚本

2.3 磁盘空间达到90%

单个或多个RAID组的磁盘使用率超过90%后,集群会变为只读状态,无法进行写操作。根据第三章的方法进行定位,如果处理时涉及重分布、vacuum fullreindex等操作,需要先解除集群的只读状态。这些手段使用时都会使磁盘空间先升后降,因此必须确保剩余空间足够进行这些操作。

解除集群只读:

1.       在所有cn节点配置白名单,防止取消只读状态后有业务接入将磁盘插入至100%

cp /srv/BigData/mppdb/data1/coordinator/pg_hba.conf /home/omm/pg_hba.conf_`date +'%Y-%m-%d_%H%M%S'`

sed -i 's/.*sha256.*$/#&/g' /srv/BigData/mppdb/data1/coordinator/pg_hba.conf

2.       连接数据库cn,确保当前没有正在执行的业务语句

3.       在主备cm_server节点的/opt/huawei/Bigdata/mppdb/cm/cm_server/cm_server.conf中修改

enable_transaction_read_only=off(关闭集群只读监控)

依次kill -9 cm_server备机和主机进程(kill前后分别观察进程号,进程号变化表示成功)

4.       在后台取消只读状态

gs_guc reload -Z coordinator -N all -I all -c "default_transaction_read_only = false"

5.       把所有cnkill一遍,防止有遗漏的正在执行的语句

 

执行完相关操作,确认空间已恢复后,需恢复集群白名单配置和CM的只读检测

此处需注意,一定要恢复白名单和CM的只读检测,否则下次磁盘使用率超过90%时将无法将集群置为只读状态,带来严重后果

1.       在主备cm_server节点的/opt/huawei/Bigdata/mppdb/cm/cm_server/cm_server.conf中修改

enable_transaction_read_only=on

依次kill -9 cm_server备机和主机

2.       在所有cn节点恢复集群白名单配置

sed -i '/^#.*sha256.*$/s/^#//' /srv/BigData/mppdb/data1/coordinator/pg_hba.conf

2.4         磁盘空间达到100%

啥也别想了,赶紧找研发!


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。