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