用 JuiceFS 備份 Nginx 日誌可以這麼簡單
在我們線上的生產環境中要備份的東西很多,各種服務日誌、資料庫資料、使用者上傳資料、程式碼等等。用 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:
- 執行
logrotate -f /etc/logrotate.d/nginx
立即執行對 logrotate 配置做個驗證。還可以用 -d 做除錯。 - Logrotate 基於 cron 執行,無論你設定 weekly、daily 還是 hourly,具體的執行時間可以在
/etc/crontab
中修改。 - 如果你覺得日誌檔案太多,我們還提供了
juicefs merge
命令可以快速合併 gzip 壓縮過的日誌檔案。
說完定時彙總,下一節我們再說說日誌實時收集。
實時收集
日誌的實時收集已經有了很多開源工具,常用的有 Logstash、Flume、Scribe、Kafka 等。
在叢集不是很大的時候,日誌收集、分析、索引、展示有個全家桶方案 ELK,其中用 Logstash 做日誌收集和分析。
需要下面的部署方式:
- 在每臺機器上部署一個 Logstash Agent(Flume 等其他工具同理);
- 部署一個 Logstash Central 做日誌彙總;
- 部署一個 Redis 做整個服務的 Broker,目的是在日誌收集和寫入中間做個緩衝,避免 Central 掛了導致日誌丟失;
- 然後再配置 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 日誌如何做個異地備份呢?
只要兩步:
- 去 JuiceFS 網站控制檯中,訪問你檔案系統的設定選單,勾選 “啟動複製”,然後選擇你要複製到的物件儲存,儲存。
- 在所有掛載 super-backup 的機器上重新掛載 super-backup 即可。之後新寫入的資料會很快同步到要複製的 Bucket 中,舊的資料也會在客戶端定時掃描(預設每週一次)時同步。
這樣可以全自動的在另外一個物件儲存中同步一份資料,有效防止單一物件儲存的故障或者所在區域的災難。
你一定會問:JuiceFS 掛了怎麼辦?元資料訪問不了,光有物件儲存裡的資料也沒用啊。
我們還有一個重要功能 – 相容模式的 JuiceFS,所有的檔案會按原樣儲存在物件儲存中,脫離 JuiceFS 的元資料服務,也仍然可以訪問裡面的檔案。對於備份這類一次寫入不做修改的場景適合使用。
如有幫助的話歡迎關注我們專案 Juicedata/JuiceFS 喲! (0ᴗ0✿)
- 30款提升組織效能 SaaS 工具,我們的寶藏工具箱大公開
- Grafana Prometheus 搭建 JuiceFS 視覺化監控系統
- 移動雲使用 JuiceFS 支援 Apache HBase 增效降本的探索
- Grafana Prometheus 搭建 JuiceFS 視覺化監控系統
- JuiceFS 在資料湖儲存架構上的探索
- JuiceFS 在資料湖儲存架構上的探索
- JuiceFS 快取預熱詳解
- JuiceFS 快取預熱詳解
- 巧用 JuiceFS Sync 命令跨雲遷移和同步資料
- 巧用 JuiceFS Sync 命令跨雲遷移和同步資料
- 老同事拉我創業,做一家開源儲存公司
- 小團隊如何妙用 JuiceFS
- 社群投稿|小團隊如何妙用 JuiceFS
- CSI 工作原理與JuiceFS CSI Driver 的架構設計詳解
- JuiceFS CSI Driver 架構設計詳解
- 怎麼做 HDFS 的原地平滑縮容?
- 來自開源社群的她力量
- 雲上共享檔案系統的相容性大比拼
- 用 JuiceFS 備份 Nginx 日誌可以這麼簡單
- 讓 JuiceFS 幫你做好「異地備份」