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