临近年关,发生两起磁盘占满引发的服务下线故障

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一口气说两个因为磁盘空间不足引发的应用故障。

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


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


事故1:Azure App Service


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


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


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


  1. 当你使用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 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"
        name="Cloud_applogs"
        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磁盘占用


6acda72942d3b18fa6ad5d05971793ef.png


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


48eee8b594cd2bcdc99a9b301c0f192c.png


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


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


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


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


  1. 全局设置、

    新建/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"}
}


剖析以上事故,因为是我一个人开发+部署,考虑了一些事,也遗漏了一些事,凸显了职业运维的重要性。


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


临近年关,大家也检查一下部署的应用是否有此低级的风险, 不要像我一样晚节不保!


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5天前
|
存储 缓存 监控
物理机磁盘水位清理
物理机磁盘水位清理
14 1
|
23天前
|
弹性计算 Linux Shell
宕机自动恢复服务
在服务或脚本运行过程中,可能会因为程序异常、服务器重启或掉电等原因停止运行,导致业务受损。通过使用云助手插件 `ecs-tool-servicekeepalive`,可以在服务或脚本被中断时快速恢复运行,确保其可靠性和持续性。该插件基于 Linux 系统的 systemd service 实现,用户只需输入启动命令即可自动生成 systemd service 配置,无需手动配置。具体实践包括启动插件、查看配置状态及取消自恢复等功能。
|
2月前
|
运维 监控 定位技术
故障转移和自动恢复
故障转移和自动恢复
|
3月前
|
Linux
磁盘爆满如何解决?
磁盘爆满如何解决:df -h 查看磁盘空间的使用情况,释放磁盘空间、增加磁盘空间
|
运维 监控 Shell
磁盘占用高生产故障复盘总结
磁盘占用高生产故障复盘总结
289 0
|
存储 缓存 API
案例23-服务出现频繁掉线情况
服务出现频繁掉线情况
225 0
|
存储 Kubernetes 算法
彻底解决K8S节点本地存储被撑爆的问题3
彻底解决K8S节点本地存储被撑爆的问题3
259 0
|
存储 Kubernetes Cloud Native
彻底解决K8S节点本地存储被撑爆的问题1
彻底解决K8S节点本地存储被撑爆的问题1
118 0
|
存储 Kubernetes Perl
彻底解决K8S节点本地存储被撑爆的问题4
彻底解决K8S节点本地存储被撑爆的问题4
208 0
|
存储 Kubernetes Shell
彻底解决K8S节点本地存储被撑爆的问题2
彻底解决K8S节点本地存储被撑爆的问题2
139 0