一口氣說兩個因爲磁盤空間不足引發的應用故障, 汗, 這兩個都發生在近日。
作爲拿起鍵盤一把梭的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"
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磁盤佔用
使用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"}
}
開發和運維,相愛相殺!相輔相成!相得益彰!