用 JuiceFS 備份 Nginx 日誌可以這麼簡單

語言: CN / TW / HK

在我們線上的生產環境中要備份的東西很多,各種服務日誌、資料庫資料、使用者上傳資料、程式碼等等。用 JuiceFS 來備份可以節省你大量時間,我們會圍繞這個主題寫一系列的教程,整理出一套最佳實踐,方便大家。

今天第一篇就寫寫最常用的 Nginx 日誌備份。

如何用 JuiceFS 備份 Nginx 日誌

生產環境中的 Nginx 經常作為反向代理,配置多臺,用來對接後面的各種應用服務。日誌主要有兩類,訪問日誌 (access.log) 和錯誤日誌 (error.log)。

日誌是分散在每個 Nginx 節點的磁碟上的,每臺機器自己的磁碟並不安全,而且分散的日誌也難以維護和使用。所以,我們都會將日誌彙總在一個更靠譜的儲存系統中,一方面長期儲存安全可靠,一方面也方便做分析使用。

在日誌的儲存上需要裡,容量擴充套件性強,穩定安全,方便運維操作,價格便宜,最好按使用量付費是重點,對於儲存效能的要求會低一些。目前常用的有 NFS、HDFS、物件儲存等,把這些儲存與 JuiceFS 做個比較:

說到日誌的收集方式,主要有兩種:定時收集實時收集,我們在下面分別說明。JuiceFS 使用客戶自己的物件儲存儲存檔案資料,所以也自然繼承了物件儲存的好處,在此之上,我們提供了高效能的元資料服務和完整的 POSIX 相容,使用上又比物件儲存便利的多。

定時收集

通常按照 小時、天,把日誌拷貝到一個統一的儲存點。這方面的工具集很多,我們用 Linux 預設安裝的 logrotate 舉例說明。

首先,要在 JuiceFS 建立一個檔案系統,假設叫 super-backup。

第一步,每臺機器安裝 JuiceFS 客戶端,掛載到 /jfs

下載 JuiceFS 客戶端

curl -L juicefs.io/static/juicefs -o juicefs && chmod +x juicefs

掛載檔案系統

sudo ./juicefs mount super-backup /jfs

在自動化配置管理中使用 JuiceFS 也同樣方便,具體方法請在上手指南中檢視 如何通過命令列認證 和 開機自動掛載,我們支援 Docker 中掛載 和 Kubernates 中掛載。

第二步,在每臺機器上用 logrotate 配置日誌的滾動策略,修改 /etc/logrotate.d/nginx

/var/log/nginx/*.log {
    daily    # 每天滾動一次
    compress
    dateext # 把日期新增到檔名中
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` # 重新載入日誌檔案
    endscript
    lastaction
        rsync -au *.gz /jfs/nginx-logs/`hostname -s`/ # 把壓縮好的日誌同步到 JuiceFS
    endscript
}

到此,Nginx 日誌就可以每天 rotate 並儲存到 JuiceFS 中了。增加 Nginx 節點時,只需要在新增節點上做同樣的配置即可。

如果使用 NFS,在 logrotate 中的配置是基本一樣的。但是 NFS 有幾個不足之處:

  • 大部分 NFS 存在單點故障,而 JuiceFS 是高可用的(專業版承諾 99.95% SLA)。
  • NFS 協議傳輸不加密,所以你需要保證 NFS 和 Nginx 在同一個 VPC 中,如果還有其他要備份的服務,部署上就很麻煩。JuiceFS 傳輸有 SSL 加密,不受 VPC 限制。
  • NFS 需要事先容量規劃,JuiceFS 是彈性擴容,按容量付費的,更省心,更便宜。 如果使用 HDFS 或者 物件儲存,日後訪問備份資料時,就比較麻煩。JuiceFS 就簡單很多,比如可以直接用 zgrep 查詢。

再分享幾個 Tips:

  1. 執行 logrotate -f /etc/logrotate.d/nginx 立即執行對 logrotate 配置做個驗證。還可以用 -d 做除錯。
  2. Logrotate 基於 cron 執行,無論你設定 weekly、daily 還是 hourly,具體的執行時間可以在 /etc/crontab 中修改。
  3. 如果你覺得日誌檔案太多,我們還提供了 juicefs merge 命令可以快速合併 gzip 壓縮過的日誌檔案。

說完定時彙總,下一節我們再說說日誌實時收集。

實時收集

日誌的實時收集已經有了很多開源工具,常用的有 Logstash、Flume、Scribe、Kafka 等。

在叢集不是很大的時候,日誌收集、分析、索引、展示有個全家桶方案 ELK,其中用 Logstash 做日誌收集和分析。

需要下面的部署方式:

  1. 在每臺機器上部署一個 Logstash Agent(Flume 等其他工具同理);
  2. 部署一個 Logstash Central 做日誌彙總;
  3. 部署一個 Redis 做整個服務的 Broker,目的是在日誌收集和寫入中間做個緩衝,避免 Central 掛了導致日誌丟失;
  4. 然後再配置 Central 的落盤方式,將日誌儲存到 JuiceFS / NFS / 物件儲存 / HDFS 等。 先看看架構圖:

這裡不講 Logstash 在收集、分析、過濾環節的配置了,網路上有很多文章可查,說一下輸出環節。

把 Logstash 收集處理好的日誌儲存到 JuiceFS 只要在配置的 output 部分設定一下:

output {
   file {
       path => "/jfs/nginx-logs/%{host}-%{+yyyy/MM/dd/HH}.log.gz"
       message_format => "%{message}"
       gzip => true
   }
}

儲存到 NFS 也可以用上面的配置,缺點和上文定時收集部分提到的相同

如果要儲存到物件儲存、HDFS,需要再配置 Logstash 的第三方外掛,大部分是非官方的,隨著 Logstash 版本的升級,使用時可能需要折騰一下。

最簡單的實時收集方案

其實還有更簡單的實時日誌收集方法,就是直接讓 Nginx 把日誌輸出到 JuiceFS 中,省去了維護和部署日誌收集系統的麻煩。使用這個方案可能會擔心 JuiceFS 出問題時影響 Nginx 的正常執行,有兩方面可以幫大家減少一些顧慮:

  • JuiceFS 本身是一個高可用的服務,專業版承諾 99.95%的可用性,應該跟你的資料庫等服務在一個可用性級別;
  • Nginx 的日誌輸出是使用非同步IO來實現的,即使 JuiceFS 出現暫時性的抖動,也基本不影響 Nginx 的正常執行(restart 或者 reload 可能會受影響)。 如果不喜歡運維複雜的日誌收集系統,這個方案值得一試。

給 Nginx 日誌加一份異地備份

定時收集和實時收集都講完了,在 super-backup 中儲存的 Nginx 日誌如何做個異地備份呢?

只要兩步:

  1. 去 JuiceFS 網站控制檯中,訪問你檔案系統的設定選單,勾選 “啟動複製”,然後選擇你要複製到的物件儲存,儲存。
  2. 在所有掛載 super-backup 的機器上重新掛載 super-backup 即可。之後新寫入的資料會很快同步到要複製的 Bucket 中,舊的資料也會在客戶端定時掃描(預設每週一次)時同步。

這樣可以全自動的在另外一個物件儲存中同步一份資料,有效防止單一物件儲存的故障或者所在區域的災難。

你一定會問:JuiceFS 掛了怎麼辦?元資料訪問不了,光有物件儲存裡的資料也沒用啊。

我們還有一個重要功能 – 相容模式的 JuiceFS,所有的檔案會按原樣儲存在物件儲存中,脫離 JuiceFS 的元資料服務,也仍然可以訪問裡面的檔案。對於備份這類一次寫入不做修改的場景適合使用。

如有幫助的話歡迎關注我們專案 Juicedata/JuiceFS 喲! (0ᴗ0✿)