在我們線上的生產環境中要備份的東西很多,各種服務日志、資料庫資料、用戶上傳資料、代碼等等,用 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?)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/431444.html
標籤:大數據
上一篇:JetpackCompose底部導航欄可見性隨延遲而變化
下一篇:MySQL 學習筆記 - 日志
