临近年关,两个磁盘占满引起的服务下线

一口气说两个因为磁盘空间不足引发的应用故障, 汗, 这两个都发生在近日。

作为拿起键盘一把梭的Coder, 开发--->部署-->收工--->心旷神怡,滋一口82年的可乐.

临近年关,两个磁盘占满引起的服务下线

过了几个月,服务突然下线了!CTO又有杀程序员祭天的理由了!

事故1:Azure App Service

Azure App Service运行一段时间之后,你也许会遇到磁盘占满的错误, 表象如下:

应用程序触发System.Io.IOException:There is not enough space on the disk异常

你会在KUDU控制台发现磁盘错误(红色警告)

当你使用Visual Studio部署新的代码,你会得到失败结果。
ERROR_NOT_ENOUGH_DISK_SPACE: Web deployment task failed. (Web Deploy detected insufficient space on disk)

每个App Service Plan只获得与定价层匹配的磁盘空间分配,故面向Azure App Service开发的应用需要关注空间消耗!

Shared Basic STANDARD PREMIUM
Disk Space   1G   10G   50G   250G  

相同App Service Plan内的web应用共享你付费套餐里面的磁盘空间,如果磁盘文件大小超限,你会看到上面的错误!

因为一个App Service Plan可支撑多个Web应用, 你可以在每个应用的[App Service Paln]--->[Quotas] 配置节下面发现当前应用占用的磁盘空间。

一个常规的Web应用包含如下内容:

--- --- 描述 转移方案
1   WebSite Content     刚需  
2   App_Data   存储持久化数据/图片   尝试转移到Azure其他存储组件  
3   Log Files   本地日志文件   尝试转移到Azure其他存储组件  

Azure Storage Account为任意数据提供可扩展、持久化的云存储、备份和恢复解决方案,包括非结构化文本或二进制数据,如视频、音频和图像。

本文点到为止,演示将日志数据转移到Azure Storage Container (非结构化数据存储)。

# 还是以常见的NLog为蓝本: # 引入`NLog.Extensions.AzureBlobStorage`库文件 <target xsi:type="AzureBlobStorage" layout="${format}" connectionString="********" container="actionlogs" blobName="applogs/applog-${date:format=yyyyMMdd}.log" /> # 其中的ConnectionString参见[Settings]-->[Access Keys] <logger name ="LoggingActionFilter" minlevel="Info" writeTo="Cloud_applogs" /> 事故2: Docker

Docker默认以Json的形式将日志存储到/var/lib/docker/containers

使用 docker system df命令查看Docker磁盘占用

临近年关,两个磁盘占满引起的服务下线

使用docker ps --size定位每个容器的磁盘占用

临近年关,两个磁盘占满引起的服务下线

我手上的应用,部署了EFK采集数据,并为ES的数据存储存储了较大的独立磁盘, 但是对EFK本身却忘记了控制日志大小。

清理容器治标不治本,要从根本上解决问题,需要限制容器的日志大小上限。

配置每个容器的docker-compose中的max-size

logging: driver: "json-file" options: max-size: 100k max-file: "5"

全局设置
新建/etc/docker/daemon.json,若有就不用新建了,添加log-dirver和log-opts参数

# vim /etc/docker/daemon.json { "log-driver":"json-file", "log-opts": {"max-size":"500m", "max-file":"3"} }

临近年关,两个磁盘占满引起的服务下线

开发和运维,相爱相杀!相辅相成!相得益彰!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpypjs.html