在我們線上的生產(chǎn)環(huán)境中要備份的東西很多,各種服務日志、數(shù)據(jù)庫數(shù)據(jù)、用戶上傳數(shù)據(jù)、代碼等等。用 JuiceFS 來備份可以節(jié)省你大量時間,我們會圍繞這個主題寫一系列的教程,整理出一套最佳實踐,方便大家。
今天第一篇就寫寫最常用的 Nginx 日志備份。
如何用 JuiceFS 備份 Nginx 日志
生產(chǎn)環(huán)境中的 Nginx 經(jīng)常作為反向代理,配置多臺,用來對接后面的各種應用服務。日志主要有兩類,訪問日志 (access.log) 和錯誤日志 (error.log)。
日志是分散在每個 Nginx 節(jié)點的磁盤上的,每臺機器自己的磁盤并不安全,而且分散的日志也難以維護和使用。所以,我們都會將日志匯總在一個更靠譜的存儲系統(tǒng)中,一方面長期存儲安全可靠,一方面也方便做分析使用。
在日志的存儲上需要里,容量擴展性強,穩(wěn)定安全,方便運維操作,價格便宜,最好按使用量付費是重點,對于存儲性能的要求會低一些。目前常用的有 NFS、HDFS、對象存儲等,把這些存儲與 JuiceFS 做個比較:

說到日志的收集方式,主要有兩種:定時收集 和 實時收集,我們在下面分別說明。JuiceFS 使用客戶自己的對象存儲保存文件數(shù)據(jù),所以也自然繼承了對象存儲的好處,在此之上,我們提供了高性能的元數(shù)據(jù)服務和完整的 POSIX 兼容,使用上又比對象存儲便利的多。
定時收集
通常按照 小時、天,把日志拷貝到一個統(tǒng)一的存儲點。這方面的工具集很多,我們用 Linux 默認安裝的 logrotate 舉例說明。
首先,要在 JuiceFS 創(chuàng)建一個文件系統(tǒng),假設叫 super-backup。
第一步,每臺機器安裝 JuiceFS 客戶端,掛載到 /jfs。
下載 JuiceFS 客戶端
curl -L juicefs.io/static/juicefs -o juicefs && chmod +x juicefs
掛載文件系統(tǒng)
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 節(jié)點時,只需要在新增節(jié)點上做同樣的配置即可。
如果使用 NFS,在 logrotate 中的配置是基本一樣的。但是 NFS 有幾個不足之處:
- 大部分 NFS 存在單點故障,而 JuiceFS 是高可用的(專業(yè)版承諾 99.95% SLA)。
- NFS 協(xié)議傳輸不加密,所以你需要保證 NFS 和 Nginx 在同一個 VPC 中,如果還有其他要備份的服務,部署上就很麻煩。JuiceFS 傳輸有 SSL 加密,不受 VPC 限制。
- NFS 需要事先容量規(guī)劃,JuiceFS 是彈性擴容,按容量付費的,更省心,更便宜。 如果使用 HDFS 或者 對象存儲,日后訪問備份數(shù)據(jù)時,就比較麻煩。JuiceFS 就簡單很多,比如可以直接用 zgrep 查詢。
再分享幾個 Tips:
- 執(zhí)行
logrotate -f /etc/logrotate.d/nginx立即執(zhí)行對 logrotate 配置做個驗證。還可以用 -d 做調(diào)試。 - Logrotate 基于 cron 運行,無論你設置 weekly、daily 還是 hourly,具體的執(zhí)行時間可以在
/etc/crontab中修改。 - 如果你覺得日志文件太多,我們還提供了
juicefs merge命令可以快速合并 gzip 壓縮過的日志文件。
說完定時匯總,下一節(jié)我們再說說日志實時收集。
實時收集
日志的實時收集已經(jīng)有了很多開源工具,常用的有 Logstash、Flume、Scribe、Kafka 等。
在集群不是很大的時候,日志收集、分析、索引、展示有個全家桶方案 ELK,其中用 Logstash 做日志收集和分析。
需要下面的部署方式:
- 在每臺機器上部署一個 Logstash Agent(Flume 等其他工具同理);
- 部署一個 Logstash Central 做日志匯總;
- 部署一個 Redis 做整個服務的 Broker,目的是在日志收集和寫入中間做個緩沖,避免 Central 掛了導致日志丟失;
- 然后再配置 Central 的落盤方式,將日志存儲到 JuiceFS / NFS / 對象存儲 / HDFS 等。
先看看架構(gòu)圖:

這里不講 Logstash 在收集、分析、過濾環(huán)節(jié)的配置了,網(wǎng)絡上有很多文章可查,說一下輸出環(huán)節(jié)。
把 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 中,省去了維護和部署日志收集系統(tǒng)的麻煩。使用這個方案可能會擔心 JuiceFS 出問題時影響 Nginx 的正常運行,有兩方面可以幫大家減少一些顧慮:
- JuiceFS 本身是一個高可用的服務,專業(yè)版承諾 99.95%的可用性,應該跟你的數(shù)據(jù)庫等服務在一個可用性級別;
- Nginx 的日志輸出是使用異步IO來實現(xiàn)的,即使 JuiceFS 出現(xiàn)暫時性的抖動,也基本不影響 Nginx 的正常運行(restart 或者 reload 可能會受影響)。
如果不喜歡運維復雜的日志收集系統(tǒng),這個方案值得一試。
給 Nginx 日志加一份異地備份
定時收集和實時收集都講完了,在 super-backup 中存儲的 Nginx 日志如何做個異地備份呢?
只要兩步:
- 去 JuiceFS 網(wǎng)站控制臺中,訪問你文件系統(tǒng)的設置菜單,勾選 “啟動復制”,然后選擇你要復制到的對象存儲,保存。
- 在所有掛載 super-backup 的機器上重新掛載 super-backup 即可。之后新寫入的數(shù)據(jù)會很快同步到要復制的 Bucket 中,舊的數(shù)據(jù)也會在客戶端定時掃描(默認每周一次)時同步。
這樣可以全自動的在另外一個對象存儲中同步一份數(shù)據(jù),有效防止單一對象存儲的故障或者所在區(qū)域的災難。
你一定會問:JuiceFS 掛了怎么辦?元數(shù)據(jù)訪問不了,光有對象存儲里的數(shù)據(jù)也沒用啊。
我們還有一個重要功能 – 兼容模式的 JuiceFS,所有的文件會按原樣保存在對象存儲中,脫離 JuiceFS 的元數(shù)據(jù)服務,也仍然可以訪問里面的文件。對于備份這類一次寫入不做修改的場景適合使用。
如有幫助的話歡迎關注我們項目 Juicedata/JuiceFS 喲! (0?0?)