【磁盘空间】DWS集群只读磁盘base目录占有率高案例分析

1、问题描述

    重复告警。

2、分析过程

            1.DWS集群在任意dn节点磁盘空间使用率超过90%后,将触发dws集群只读保护,避免发生磁盘占用率上升至100%后难以处理的情况。

            2.常用命令

            查看磁盘使用率

            df –h

            查看目录占用空间大小

            du -sh *

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

            cm_ctl query -Cvd

            查看对应dn的端口号

            cat dn目录下/postgresql.conf |grep port

            例:cat /var/chroot/DWS/data1/master1/postgresql.conf | grep port

            3.登录dws各dn节点,确认为base目录异常增高。

注:这次集群只读均发生在dws集群base目录(如: /DWS/data1/master1/base)异常增高情况下,本文只讨论该情况。

3、问题根因

DWS集群在任意dn节点磁盘空间使用率超过90%后,将触发dws集群只读保护,避免发生磁盘占用率上升至100%后难以处理的情况。

4、解决方案

1、 /DWS/data1/master1/base下的数字为database的oid

找到近日异常增大或最大的通过以下查询确定数据库

select oid,* from pg_database

2、 查找异常增高的表或索引

l  方案一

  1. a)登录异常数据库

gsql –Udbadmin –d 数据库 –p 端口

注:数据库上面查询到,port为dn的port

执行如下sql,快速确认占用空间最大的前20的大表。

SELECT schemaname,tablename,pg_size_pretty(sum(dnsize)) AS totalsize, pg_size_pretty(max(dnsize)) AS maxsize, pg_size_pretty(min(dnsize)) AS minsize,pg_size_pretty(max(dnsize)-min(dnsize)) diffsize

FROM pg_catalog.pg_class c

INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace

INNER JOIN pg_catalog.table_distribution() s ON s.schemaname = n.nspname AND s.tablename = c.relname

INNER JOIN pg_catalog.pgxc_class x ON c.oid = x.pcrelid AND x.pclocatortype = ‘H’

GROUP BY schemaname,tablename

order by max(dnsize)-min(dnsize) desc

limit 20;

l  方案二

注1:正常情况下请按方案一进行日常巡检,这样可以对比历史数据更加清晰明了最近增大的表。若上面sql比较慢或平时没有巡检对比,可以采用方案二。

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

  1. a)进入异常dn的数据库目录(如:../base/15239),执行ll *.50,(如不存在,则执行ll *.30或ll *.20)确定大表。

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

select * from pg_class where relfilenode = $relfilenode

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

注:$relfilenode为上面查询到的大表oid

3、 根据情况,选择下面部分方法整改表和索引(需获得客户授权)

  1. a)若表倾斜,整改表。否则reindex重建索引
  2. b)对部分占用空间大的表进行清理
  3. c)vacuum full table

4、 磁盘空间达到90%

l  若已经达到90%,集群只读,无法进行写操作,需要先解除集群的只读状态。这些手段使用时都会使磁盘空间先升后降,因此必须确保剩余空间足够进行这些操作。

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

一定要先备份!!!

cp /DWS/data1/coordinator/pg_hba.conf /DWS/data1/coordinator/pg_hba.conf_`date +’%Y-%m-%d_%H%M%S’`

注释白名单

  1. b)在主备cm_server cm/cm_server/cm_server.conf中修改

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

  1. c)在后台取消只读状态

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

l  执行完相关操作,确认空间已恢复后,需恢复集群白名单配置和CM的只读检测,此处需注意,一定要恢复白名单和CM的只读检测,否则下次磁盘使用率超过90%时将无法将集群置为只读状态,带来严重后果。

  1. a)enable_transaction_read_only=on
  2. b)恢复白名单(用备份文件恢复)
  3. c)gs_guc reload -Z coordinator -N all -I all -c “default_transaction_read_only = false”

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/316492.html

(0)
上一篇 2025年10月29日 22:39
下一篇 2025年10月29日 22:41

相关推荐

发表回复

登录后才能评论