企业网站和应用都得有完全的数据备份方案确保数据不丢失,通常企业有如下的数据备份方案
定时任务定期备份
需要周期性备份的数据可以分两类:
- 后台程序代码、运维配置文件修改,一般会定时任务执行脚本进行文件备份,然后配置Rsync工具推送到远程服务器备份
- 对于数据库文件用定时任务脚本配合数据库提供的备份工具,定时生成备份文件,配合Rsync备份到远端
实时同步服务
目前在用的实时备份工具有三种
Inotify+Rsync
sersync
lsyncd
Inotify+Rsync实时复制
Inotify机制软件工作流程如下
-
备份源客户端开机运行Inotify软件,检测指定目录的文件系统变化
-
一旦获取到指定监控目录的数据发生变化,即刻执行Rsync命令复制数据。
-
将变化的数据发送到Rsync服务端的备份目录。
Inotify部署步骤
1、配置好服务端的rsync服务并启动
2、部署inotify-tool软件
Inotify是一个强大的,细粒度的,异步的文件系统事件监控机制。
事件是指如文件的增删改查都是事件。
Linux2.6.13开始就引入了inotify这个功能,用于监控文件系统的增删改查等事件。
第三方软件能实现监控文件内容变化,其实是因为linux提供了这个inotify机制功能。
3、确保目前的linux内核版本支持inotify
[root@nfs-31 ~]#uname -r
3.10.0-862.el7.x86_64
4、内核参数检查
linux支持inotify机制,在性能还可以优化,支持更高的文件并发数
这个参数的优化,就是调整linux的几个文件
[root@nfs-31 ~]#ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r--. 1 root root 0 Jul 25 20:57 max_queued_events
-rw-r--r--. 1 root root 0 Jul 25 20:57 max_user_instances
-rw-r--r--. 1 root root 0 Jul 25 20:57 max_user_watches
系统文件解释
max_user_watches: 设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
默认只能监控8192个文件
max_user_instances: 设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
默认每个用户可以开启inotify服务128个进程
max_queued_events: 设置inotify实例事件(event)队列可容纳的事件数量
默认监控事件队列长度为16384
5、安装inotify-tools工具
[root@nfs-31 ~]#yum install inotify-tools -y
检查生成的软件命令
[root@nfs-31 ~]#rpm -ql inotify-tools
上述操作安装了inotify-tools工具后,生成了2个重要命令
inotifywait:在被监控的目录等待特定文件系统事件(open、close、delete等事件),执行后处于阻塞状态,适合在Shell脚本中使用,是实现监控的关键
Inotifywatch:收集被监控的文件系统使用的统计数据(文件系统事件发生的次数统计)
【inotifywait命令解释】
inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树;
inotifywatch用于收集被监控的文件系统计数据,包括每个inotify事件发生多少次等信息
从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数:
语法格式:inotifywait [-hcmrq][-e][-t][–format][-timefmt][…]
-m: 即“–monitor” 表示始终保持事件监听状态。
-d:类似于-m参数,将命令运行在后台,记录出发的事件信息,记录在指定文件里,加上--outfile参数
-r: 即“–recursive” 表示递归查询目录
-q: 即“–quiet” 表示打印出监控事件
-o: 即“–outfile” 输出事情到一个文件而不是标准输出
-s: 即“–syslog” 输入错误信息到系统日志
-e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等
-format: 指定输出格式;常用的格式符如:
%w:表示发生事件的目录
%f:表示发生事件的文件
%e:表示发生的事件
%Xe:事件以“X”分隔
%T:使用由-timefmt定义的时间格式
-timefmt:指定时间格式,用于-format选项中的%T格式
利用Inotify软件监控的事件主要是如下,也是我们使用命令,需要指定的那些事件,指的就是你想监控文件内容变化了,还是被删了,还是正在被编辑,被修改,等情况。
Events 含义
access 文件或目录被读取
modify 文件或目录内容被修改
attrib 文件或目录属性被改变
close 文件或目录封闭,无论读/写模式
open 文件或目录被打开
moved_to 文件或目录被移动至另外一个目录
move 文件或目录被移动到另一个目录或从另一个目录移动至当前目录
create 文件或目录被创建在当前目录
delete 文件或目录被删除
umount 文件系统被卸载
inotifywait实践
1、执行命令,以及对日志进行格式化,默认检测所有事件
[root@nfs-31 ~]#inotifywait -mrq --timefmt "%F" --format "%T %w%f 捕获的事件是:%e" /nfs-nginx/
2023-07-25 /nfs-nginx/index.html 捕获的事件是:CLOSE_NOWRITE,CLOSE
2023-07-25 /nfs-nginx/access.log 捕获的事件是:CREATE
2023-07-25 /nfs-nginx/access.log 捕获的事件是:ATTRIB
2023-07-25 /nfs-nginx/access.log 捕获的事件是:ATTRIB
2023-07-25 /nfs-nginx/access.log 捕获的事件是:MODIFY
2023-07-25 /nfs-nginx/access.log 捕获的事件是:CLOSE_WRITE,CLOSE
2、创建事件监测
[root@nfs-31 ~]#inotifywait -mrq --timefmt "%F" --format "%T %w%f" -e create /inotify_test/
2023-07-25 /inotify_test/test.log
3、move事件
[root@nfs-31 ~]#inotifywait -mrq --timefmt '%T' --format "%T----%w------%f 捕获到的事件是:%e" -e move /nfs-data
12:31:48----/nfs-data/------xixi.log 捕获到的事件是:MOVED_FROM
12:31:48----/nfs-data/------xixi.png 捕获到的事件是:MOVED_TO
12:32:17----/nfs-data/------xixi.png 捕获到的事件是:MOVED_FROM
4、delete事件
[root@nfs-31 ~]#inotifywait -mrq --timefmt "%F" --format "%T %w%f 捕获的事件是:%e" -e delete /inotify_test/
2023-07-25 /inotify_test/test.log 捕获的事件是:DELETE
5、close_write事件
IN_CLOSE_WRITE
一个打开的,等待写入的文件或目录被关闭。
[root@nfs-31 ~]#inotifywait -mrq --timefmt "%F" --format "%T %w %f 捕获到的事件是:%e" -e close_write /inotify_test/
2023-07-25 /inotify_test/ .test.txt.swx 捕获到的事件是:CLOSE_WRITE,CLOSE
2023-07-25 /inotify_test/ .test.txt.swp 捕获到的事件是:CLOSE_WRITE,CLOSE
2023-07-25 /inotify_test/ 4913 捕获到的事件是:CLOSE_WRITE,CLOSE
2023-07-25 /inotify_test/ test.txt 捕获到的事件是:CLOSE_WRITE,CLOSE
2023-07-25 /inotify_test/ .test.txt.swp 捕获到的事件是:CLOSE_WRITE,CLOSE
inotify结合rsync实时同步
这个工具的用法就是
1.inotify检测文件变化
2.执行rsync同步
1、在服务端编写一个简单脚本
[root@nfs-31 ~]#cat inotify_test.sh
#!/bin/bash
path=/nfs-data
backup_server=172.16.1.41
export RSYNC_PASSWORD=123123
/usr/bin/inotifywait -mrq -e modify,delete,create,attrib,move /nfs-data | while read line
do
echo ${line}
rsync -az --delete /nfs-data/ rsync_backup@${backup_server}::data
done
2、运行这脚本
3、进行测试,查看效果,在备份服务器是否有数据的交互