臨近年關,發生兩起磁盤佔滿引發的服務下線故障

一口氣說兩個因爲磁盤空間不足引發的應用故障。

作爲拿起鍵盤一把梭的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 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"}
}

---------------------------------------------------------------

剖析以上事故,因爲是我一個人開發+部署,考慮了一些事,也遺漏了一些事,凸顯了職業運維的重要性。

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

臨近年關,大家也檢查一下部署的應用是否有此低級的風險, 不要像我一樣晚節不保!

關注並星標我們
更多幹貨及最佳實踐分享


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章