在我们线上的生产环境中要备份的东西很多,各种服务日志、数据库数据、用户上传数据、代码等等。用 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:

  1. 执行 logrotate -f /etc/logrotate.d/nginx 立即执行对 logrotate 配置做个验证。还可以用 -d 做调试。
  2. Logrotate 基于 cron 运行,无论你设置 weekly、daily 还是 hourly,具体的执行时间可以在 /etc/crontab 中修改。
  3. 如果你觉得日志文件太多,我们还提供了 juicefs merge 命令可以快速合并 gzip 压缩过的日志文件。

说完定时汇总,下一节我们再说说日志实时收集。

实时收集

日志的实时收集已经有了很多开源工具,常用的有 Logstash、Flume、Scribe、Kafka 等。

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

需要下面的部署方式:

  1. 在每台机器上部署一个 Logstash Agent(Flume 等其他工具同理);
  2. 部署一个 Logstash Central 做日志汇总;
  3. 部署一个 Redis 做整个服务的 Broker,目的是在日志收集和写入中间做个缓冲,避免 Central 挂了导致日志丢失;
  4. 然后再配置 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 日志如何做个异地备份呢?

只要两步:

  1. 去 JuiceFS 网站控制台中,访问你文件系统的设置菜单,勾选 “启动复制”,然后选择你要复制到的对象存储,保存。
  2. 在所有挂载 super-backup 的机器上重新挂载 super-backup 即可。之后新写入的数据会很快同步到要复制的 Bucket 中,旧的数据也会在客户端定时扫描(默认每周一次)时同步。

这样可以全自动的在另外一个对象存储中同步一份数据,有效防止单一对象存储的故障或者所在区域的灾难。

你一定会问:JuiceFS 挂了怎么办?元数据访问不了,光有对象存储里的数据也没用啊。

我们还有一个重要功能 – 兼容模式的 JuiceFS,所有的文件会按原样保存在对象存储中,脱离 JuiceFS 的元数据服务,也仍然可以访问里面的文件。对于备份这类一次写入不做修改的场景适合使用。

如有帮助的话欢迎关注我们项目 Juicedata/JuiceFS 哟! (0ᴗ0✿)

用 JuiceFS 备份 Nginx 日志可以这么简单的更多相关文章

  1. linux中使用corntab和shell脚本自动备份nginx日志,按天备份

    编写shell脚本,实现nginx日志每天自动备份到指定文件夹! 需要的命令mv , corntab -e(定时任务),shell脚本 这里先说一下corntab: https://www.cnblo ...

  2. nginx 日志分割(简单、全面)

    Nginx 日志分割 因业务需要做了简单的Nginx 日志分割, 第1章 详细配置如下. #建议在mkdir  /home/shell  -p 专门写shell 脚本位置 root@localhost ...

  3. shell脚本备份nginx日志

    vim /data/runlog.sh                                                  #编辑一个 shell 脚本 #!/bin/bash LOGP ...

  4. goaccess nginx日志分析工具简单使用

    goaccess 是一个比较方便的支持实时的日志分析工具,比较方便,同时安装&&配置简单 安装 centos yum yum install -y goaccess 运行 我的ngin ...

  5. Nginx日志分析 awk 命令

    通过Nginx日志,可以简单分析WEB网站的运行状态.数据报表.IP.UV(unique visitor指独立访客访问数,一台电脑终端为一个访客.).PV(page view即页面访问量,每打开一次页 ...

  6. nginx日志简单分析工具

    自己有个tony6.com的服务器,上面挂着我的博客,web服务器是nginx. 由于最近一直在折腾python,所以简单写了个nginx日志分析工具,它可以分析出每个IP的点击数量和IP所在地. # ...

  7. linux下的nginx日志自动备份压缩--日志切割机

    部署完毕nginx之后,发现自己的/var/log/nginx/*log的日志不会压缩,一直都是一个文本写日志, 时间久了,日志文件内存过于增加,将会导致在日志添加过程效率降低,延长时间. 默认安装的 ...

  8. 快速掌握Nginx(四) —— Nginx日志切片和常用配置总结

    1.Nginx日志管理 1.日志简单介绍 Nginx提供了日志记录的功能,日志文件在对我们管理网站十分有用,通过访问日志(access_log)我们可以获取请求来源.客户端信息.请求的资源等信息:通过 ...

  9. Nginx日志切割之Logrotate篇

    不管是什么日志文件,都是会越来越大的,大到一定程度就是个可怕的事情了,所以要及早的做处理,方法之一就是按时间段来存储,不过linux系统提供了Logrotate的日志管理工具,很好用,不用写计划任务脚 ...

随机推荐

  1. 一文看懂B端产品和C端产品

    大纲 什么是B端产品 什么是C端产品 为什么会产生B端产品和C端产品 怎么判断一个产品是B端还是C端 B端产品和C端产品存在哪些差异 C端产品经理如何向B端产品经理转型 写在最后   什么是B, Bu ...

  2. Solon Web 开发,九、跨域处理

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  3. web前端基础之SCC(定位-z-index模态框)

    目录 一:定位(position) 1.relative(相对定位) 2.absolute(绝对定位) 3.fixed(固定) 二:相对定位 1.相对定位 2.实现相对定位 三:绝对定位 1.实现绝对 ...

  4. java 变量的定义 类型转换 基本的数据类型

    package com.aaa.zxf.ajax.test; import org.junit.Test; /** * 六. * 如何在ideal的maven项目中导入 Test 测试类? * * * ...

  5. plsql 数据库事件触发器

    --4.数据库事件触发器 需要超管的权限 /* 数据库事件触发器有数据库级和模式级两种. 前者定义在整个数据库上,触发事件是数据库事件,如数据库的启动.关闭,对数据库的登录或退出. 后者定义在模式上, ...

  6. chapter3——逻辑回归手动+sklean版本

    1 导入numpy包 import numpy as np 2 sigmoid函数 def sigmoid(x): return 1/(1+np.exp(-x)) demox = np.array([ ...

  7. flask学习1

    总结 Flask Web 框架 轻量 websocket 全双工通讯 socket TCP 通讯 MongoDB 数据库 文件型数据库 {} 没有限制 和 约束 Mui + HTML5 Plus 调用 ...

  8. String类为什么可以直接赋值

    在研究String直接赋值与new String的区别之前我们需要先了解java中的字符串常量池的概念 字符串常量池 String类是我们平常项目中使用频率非常高的一种对象类型,jvm为了提升性能和减 ...

  9. git 下载及更新

    转载请注明来源:https://www.cnblogs.com/hookjc/ 在完成了创建之后,GitHub会提示你如何向这个Repository上传代码.  首次上传: Git 本地上传 添加新文 ...

  10. 开发时Blocks跟Delegates如何选择----董鑫

    1.大多数delegate protocols 都拥有几个消息源. 以GKMatch为例(A GKMatch object provides a peer-to-peer network betwee ...