用 JuiceFS 備份 Nginx 日志可以這么簡單

在我們線上的生產(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 做個比較:

image

說到日志的收集方式,主要有兩種:定時收集實時收集,我們在下面分別說明。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:

  1. 執(zhí)行 logrotate -f /etc/logrotate.d/nginx 立即執(zhí)行對 logrotate 配置做個驗證。還可以用 -d 做調(diào)試。
  2. Logrotate 基于 cron 運行,無論你設置 weekly、daily 還是 hourly,具體的執(zhí)行時間可以在 /etc/crontab 中修改。
  3. 如果你覺得日志文件太多,我們還提供了 juicefs merge 命令可以快速合并 gzip 壓縮過的日志文件。

說完定時匯總,下一節(jié)我們再說說日志實時收集。

實時收集

日志的實時收集已經(jīng)有了很多開源工具,常用的有 Logstash、Flume、Scribe、Kafka 等。

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

需要下面的部署方式:

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

這里不講 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 日志如何做個異地備份呢?

只要兩步:

  1. 去 JuiceFS 網(wǎng)站控制臺中,訪問你文件系統(tǒng)的設置菜單,勾選 “啟動復制”,然后選擇你要復制到的對象存儲,保存。
  2. 在所有掛載 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?)

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容