
# 问题描述
苍穹机器磁盘占比高或者满,轻则导致es只读不再记录日志,重则导致k8s异常业务中断,运维人员需要做好定期巡检和监控,以下总结部分苍穹部署后常见的磁盘问题解决方法
# 解决方法
## 定位占比高的文件
首先查看当前磁盘占比,一般根目录和苍穹安装目录不能超过85%
```
df -h
#如果过滤结果容器目录太多可以使用下面的语句不显示
df -h |egrep -v "docker|k8s"
```

不清楚如何定位可以从根目录开始查
```
cd /
du -sh *
#从显示结果中找到占用最大的目录,切换到此目录下继续执行du -sh *,循环直到确定是什么程序占用高
```

以下列举一些苍穹常见的磁盘占用大解决方法,示例安装路径选择的是/kingdee,现场请根据真实情况修改
## zookeeper占用高
zookeeper目录下data占比高,里面主要是zk的快照和日志,可以配置自动清理,详细参考:
[zookeeper数据导致服务器磁盘空间满处理方法](https://vip.kingdee.com/link/s/lHNQE)
/kingdee/cosmic/common/zookeeper/zookeeper-3.5.9/conf/zoo.cfg
添加:
autopurge.snapRetainCount=5
autopurge.purgeInterval=1
保存后重启zookeepe就会自动释放

## rabbitmq占用高
mq默认数据存放在/var/lib/rabbitmq/mnesia,如果此目录磁盘占用高,程序使用了mq没有关闭,或消息队列积压严重等原因导致,需要优先解决mq的问题占用自然会释放。

## kafka占用高
kafka目录下kafka-logs占比高,里面是苍穹发送到kafka的日志数据,分为2种情况:
1. 没有开启定期清理功能,导致过期数据未清理,配置清理清理,详细参考:
[kafka 官方配置文档](https://kafka.apache.org/documentation/#compaction)
/kingdee/cosmic/elk/kafka/kafka_2.12-3.2.0/config/server.properties
添加:
#设置日志保留48小时
log.retention.hours=48
#自动清理日志开关
log.cleaner.enable=true
#日志清理检查周期(毫秒)
log.retention.check.interval.ms=300000
#日志文件每个segment的大小,默认为1G
log.segment.bytes=1073741824
保存重启后,kafka会标记过期的文件,在下一个清理周期后删除文件

2. 开启清理的情况下占用依旧高,一般是由于苍穹日志过多导致,请参考下面es部分
## es占用高
elasticsearch目录下esdata占比高,日志保留过多,可以先确认索引情况
curl http://127.0.0.1:9200/_cat/indices -u账号:密码

1. 可以通过索引名后缀的时间来判断es自动清理脚本是否正常运行,示例图片的同时存在2个月的,说明定时任务失败了,脚本/home/elsearch/autoclear.sh,手动sh执行根据报错信息修复,并重新配置elsearch用户crontab实现定期清理。
```language
#es索引自动清理脚本,默认7天可以自行修改
#!/bin/bash
es_user=es账号
es_password="es密码"
retain_time=`date +%Y%m%d -d "7 days ago"`
function delete_indices() {
time_num=`echo $1|sed 's/-//g'`
if [ ${time_num} -lt ${retain_time} ];then
curl -X DELETE http://127.0.0.1:9200/*$1 -u ${es_user}:${es_password}
fi
}
curl -XGET http://127.0.0.1:9200/_cat/indices -u ${es_user}:${es_password} |awk '{print $3}' |grep '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}'|awk '{print substr($0,length($0)-9)}'|sort -n|uniq|while read line; do delete_indices $line; done
```
2. 如果是每个索引的磁盘占用都很大(会导致kafka和es的磁盘占用同时变大),那说明苍穹每天产生的日志很多。不同场景可能不一样,但开启了sql输出肯定会出现此情况。是否开了可以在monitor中查询到:

非必要情况下建议关闭这2个值,mc-公共环境变量/集群配置信息中找到此值修改为false保存发布,确认monitor界面刷新后为false才生效。
针对当前特别大的索引,可以手动删除,紧急情况下可以删除较大索引释放资源使用:
```language
curl -XDELETE http://127.0.0.1:9200/索引名 -u es账号:密码
```

> 索引名为:集群名-span-yyyy-MM-dd 是开启了monitor中调用链的功能,此功能也会产生大量数据,可以根据现场需求开或关。
## postgresql占用高
pg占用高,可以先判断具体是哪个目录高再确定如何解决

#### 截图tree仅是展示结构,现场可以按照之前du -sh * 来确定文件大小
### 1. archivelog 归档日志
归档日志是事务日志wal归档后生成的文件,修改postgresql.conf中archive_command项可以自定义路径。

关闭归档则不会有文件,开启归档的情况下会不断增长,需要自行配置清理脚本结合crontab实现定期清理。脚本可以参考示例
```language
#每天凌晨2点自动清理对应目录下建立时间超过7天的文件,仅作参考。
crontab -e #编辑当前用户的计划任务,复制下一行内容后保存退出
0 2 * * * find /kingdee/cosmic/postgres/archivelog -type f -mtime +7 -exec rm -f {} \;
```
### 2. base 数据
base目录占用大的话说明真实数据比较多,此处无法缩减,可以删除不用的数据库或者进行扩容。
### 3. log 日志
部分历史安装器postgresql.conf中log_filename设置的是postgresql-%d.log,以30天一月的周期更新,产生较多日志。建议配置日志以7天一星期的周期滚动更新日志,log_filename修改为postgresql-%w.log,重启pg同时手动删除log目录下的编号超过6的日志文件。

同时由于安装器默认开启了log_duration,日志文件会比较大,可以关闭此参数并重启pg减少日志输出,具体作用参考:
[PG数据库日志分析](https://vip.kingdee.com/link/s/lyQ7r)

### 4. pg_wal 事务日志
pg_wal过大一般有2种可能:1.开启归档,但是归档失败,可以根据log中日志分析;2.大量写入数据,pg_wal来不及清理。pg对wal大小的控制大多都是软限制,所以会出现wal暴增的情况。针对此问题可以参考:[PostgreSQL数据库清理wal日志](https://vip.kingdee.com/link/s/lJ2rY)
快速恢复语句可以参考:
```language
#需要使用postgres用户执行
pg_archivecleanup $PGDATA/pg_wal `pg_controldata |grep "REDO WAL" |awk -F ':' '{print $2}'`
```
注意:开启归档的情况下执行此语句仅是清理wal日志,依然需要同时检查归档日志是否需要清理删除(上文1. archivelog 归档日志内容)。
## nginx-appstatic应用仓库占用高
苍穹默认有此路径的软连接到/var/appstatic,占用大一般是补丁或升级次数比较多,稳定运行的环境可以直接删除/var/appstatic/appstore/upgrade-bak

## k8s/docker
本身不会占用太多空间,需要的情况下可以使用docker system prune自动清理。
常见的磁盘占比超过85%,k8s会删除镜像,参考说明:
[磁盘空间超85%,导致苍穹容器Pod启动失败的解决方法](https://vip.kingdee.com/link/s/lKQoW)
快速恢复方案:
```language
#保证已经检查并清理了磁盘空间再执行,删除所有Evicted异常pod
kubectl get pods --all-namespaces | grep Evicted| awk '{cmd=" kubectl delete pod "$2" -n "$1;system(cmd)}'
#导入镜像,可以根据pod报错缺少镜像的针对性导入,不清楚如何排错的也可以全部导入一次
#文件服务器镜像,示例安装路径选择的/kingdee,可以根据实际情况修改
docker load -i /kingdee/cosmic/cosmic-k8s/cosmic-images/fileserver.image
#苍穹镜像
docker load -i /kingdee/cosmic/cosmic-k8s/cosmic-images/mservice.image
#k8s基础镜像,示例安装包singularity在根目录,可以根据实际情况修改。
#如果报错k8s_basic.image.tar.gz不存在,需要手动到files目录下解压k8s_all.tar.gz
docker load -i /singularity/scripts/k8s/ansible/roles/00-copy_all/files/k8s_all/docker_rpm/k8s_basic.image.tar.gz
#gpaas镜像
docker load -i /singularity/scripts/k8s/ansible/roles/20-import_gpaas_image/files/kce-images.tgz
#harbor镜像
docker load -i /singularity/scripts/k8s/ansible/roles/20-import_gpaas_image/files/harbor-1.10.images.tgz
#registry镜像
docker load -i /singularity/scripts/k8s/ansible/roles/30-deploy_registry/files/registry-image.tar.gz
```