臨近年關,兩個磁碟佔滿引起的服務下線

_小碼甲發表於2020-12-29

一口氣說兩個因為磁碟空間不足引發的應用故障, 汗, 這兩個都發生在近日。

作為拿起鍵盤一把梭的Coder, 開發--->部署-->收工--->心曠神怡,滋一口82年的可樂.

過了幾個月,服務突然下線了!CTO又有殺程式設計師祭天的理由了!

事故1:Azure App Service

Azure App Service執行一段時間之後,你也許會遇到磁碟佔滿的錯誤, 表象如下:

  1. 應用程式觸發System.Io.IOException:There is not enough space on the disk異常
  2. 你會在KUDU控制檯發現磁碟錯誤(紅色警告)
  3. 當你使用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本身卻忘記了控制日誌大小。

清理容器治標不治本,要從根本上解決問題,需要限制容器的日誌大小上限。

  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"}
}

開發和運維,相愛相殺!相輔相成!相得益彰!

相關文章