用 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✿)
用 JuiceFS 备份 Nginx 日志可以这么简单的更多相关文章
- linux中使用corntab和shell脚本自动备份nginx日志,按天备份
编写shell脚本,实现nginx日志每天自动备份到指定文件夹! 需要的命令mv , corntab -e(定时任务),shell脚本 这里先说一下corntab: https://www.cnblo ...
- nginx 日志分割(简单、全面)
Nginx 日志分割 因业务需要做了简单的Nginx 日志分割, 第1章 详细配置如下. #建议在mkdir /home/shell -p 专门写shell 脚本位置 root@localhost ...
- shell脚本备份nginx日志
vim /data/runlog.sh #编辑一个 shell 脚本 #!/bin/bash LOGP ...
- goaccess nginx日志分析工具简单使用
goaccess 是一个比较方便的支持实时的日志分析工具,比较方便,同时安装&&配置简单 安装 centos yum yum install -y goaccess 运行 我的ngin ...
- Nginx日志分析 awk 命令
通过Nginx日志,可以简单分析WEB网站的运行状态.数据报表.IP.UV(unique visitor指独立访客访问数,一台电脑终端为一个访客.).PV(page view即页面访问量,每打开一次页 ...
- nginx日志简单分析工具
自己有个tony6.com的服务器,上面挂着我的博客,web服务器是nginx. 由于最近一直在折腾python,所以简单写了个nginx日志分析工具,它可以分析出每个IP的点击数量和IP所在地. # ...
- linux下的nginx日志自动备份压缩--日志切割机
部署完毕nginx之后,发现自己的/var/log/nginx/*log的日志不会压缩,一直都是一个文本写日志, 时间久了,日志文件内存过于增加,将会导致在日志添加过程效率降低,延长时间. 默认安装的 ...
- 快速掌握Nginx(四) —— Nginx日志切片和常用配置总结
1.Nginx日志管理 1.日志简单介绍 Nginx提供了日志记录的功能,日志文件在对我们管理网站十分有用,通过访问日志(access_log)我们可以获取请求来源.客户端信息.请求的资源等信息:通过 ...
- Nginx日志切割之Logrotate篇
不管是什么日志文件,都是会越来越大的,大到一定程度就是个可怕的事情了,所以要及早的做处理,方法之一就是按时间段来存储,不过linux系统提供了Logrotate的日志管理工具,很好用,不用写计划任务脚 ...
随机推荐
- 一文看懂B端产品和C端产品
大纲 什么是B端产品 什么是C端产品 为什么会产生B端产品和C端产品 怎么判断一个产品是B端还是C端 B端产品和C端产品存在哪些差异 C端产品经理如何向B端产品经理转型 写在最后 什么是B, Bu ...
- Solon Web 开发,九、跨域处理
Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...
- web前端基础之SCC(定位-z-index模态框)
目录 一:定位(position) 1.relative(相对定位) 2.absolute(绝对定位) 3.fixed(固定) 二:相对定位 1.相对定位 2.实现相对定位 三:绝对定位 1.实现绝对 ...
- java 变量的定义 类型转换 基本的数据类型
package com.aaa.zxf.ajax.test; import org.junit.Test; /** * 六. * 如何在ideal的maven项目中导入 Test 测试类? * * * ...
- plsql 数据库事件触发器
--4.数据库事件触发器 需要超管的权限 /* 数据库事件触发器有数据库级和模式级两种. 前者定义在整个数据库上,触发事件是数据库事件,如数据库的启动.关闭,对数据库的登录或退出. 后者定义在模式上, ...
- chapter3——逻辑回归手动+sklean版本
1 导入numpy包 import numpy as np 2 sigmoid函数 def sigmoid(x): return 1/(1+np.exp(-x)) demox = np.array([ ...
- flask学习1
总结 Flask Web 框架 轻量 websocket 全双工通讯 socket TCP 通讯 MongoDB 数据库 文件型数据库 {} 没有限制 和 约束 Mui + HTML5 Plus 调用 ...
- String类为什么可以直接赋值
在研究String直接赋值与new String的区别之前我们需要先了解java中的字符串常量池的概念 字符串常量池 String类是我们平常项目中使用频率非常高的一种对象类型,jvm为了提升性能和减 ...
- git 下载及更新
转载请注明来源:https://www.cnblogs.com/hookjc/ 在完成了创建之后,GitHub会提示你如何向这个Repository上传代码. 首次上传: Git 本地上传 添加新文 ...
- 开发时Blocks跟Delegates如何选择----董鑫
1.大多数delegate protocols 都拥有几个消息源. 以GKMatch为例(A GKMatch object provides a peer-to-peer network betwee ...