目录
企业网站和应用都得有完善的数据备份方案,目的都是为了保证数据不丢失
需要周期性数据备份的数据类型一般有这几种
- 网站后台程序代码,运维配置文件,一般都会使用定时任务执行周期性的备份脚本,然后在通过rsync工具吧数据备份到 backup备份服务器上
- 比如数据库文件,也使用定时任务配合mysql自身的备份命令,结合数据库备份,再通过rsync上传到备份服务器
实时复制方案,是最适合企业重要的数据备份方案,用于用户提交的数据进行备份,jpg,png,tar,zip,mp4,txt,html
都可以使用inotify+sersync+rsync进行实时的数据备份
对于数据库文件,我们还有会更复杂的分布式备份方案,我们会吧数据拆分成多份,然后进行备份操作
对于提交到数据库的数据,我们还会使用数据库比如主从复制,进行备份操作
- Inotify是一种异步的系统事件监控机制,通过Inotify可以监控文件系统中添加、删除、修改等事件,利用这个内核接口,第三方软件可以监控文件系统下的情况变化。
- 那么Inofity-tools就是该类软件的实现,是一个监控指定目录数据实时变化的软件。
- 实现了Inotify的软件还有 Sersync 、 Inotify-tools
- Sersync软件是在Inotify的基础上进行开发的,功能更加强大,支持配置文件中定义、重试机制、过滤机制、提供CDN数据更新
[Inotify机制的优点]
[lnotify的缺点]
实测当文件数量大于200个 (10~100kb) ,复制存在延迟
准备两台虚拟机
无论是Inotify-tools还是Sersync、本身的核心功能都是监控指定目录内的数据变化 ,具体的复制到远端服务器的功能还是借助Rsync工具配合,Inotify机制软件工作流程如下
systemctl status rsyncd
可以查看我以前的守护进程实践的文章
检查当前linux版本,linux内核高于2.6.13版本
- [root@localhost backup]# ls -l /proc/sys/fs/inotify/
- total 0
- -rw-r--r--. 1 root root 0 Nov 13 02:09 max_queued_events
- -rw-r--r--. 1 root root 0 Nov 13 02:09 max_user_instances
- -rw-r--r--. 1 root root 0 Nov 13 02:09 max_user_watches
- [root@localhost backup]#
- max_queued_events 设置intofy实例事件队列可容纳的事件数量
- max_user_instances 设置每个用户可以运行的事件命令进程数max
- max_user_watches 设置intify命令检测的文件数量
- yum install -y epel-release && yum update
- yum -y install inotify-tools
检查有关inotify的操作命令
rpm -ql inotify-tools | head -2
语法格式: inotifywait [-hcmrg][-e][-t][-format][-timefmt][...]:
-format :指定输出格式,常用的格式符
-timefmt: 指定时间格式,用于-format选项中的%T格式
利用inotify软件监控的事件主要是如下:
使用这个监控
inotifywait -mrq --timefmt "%F" --format "%T %w %f" -e create /data
参数解释
inotifywait 是命令
-m 表示一直处在检测状态
-r 递归的检测
-q 打印出检测的事件信息
--timefmt 对时间格式化
--format 对日志信息格式化
%T 使用有--timefmt所定义的格式
%w 表示显示事件发生的目录
%f 表示事件发生的文件
-e 默认inotifywait是监控所有事件,可以使用-e单独的指定某种事件 events
这个守护进程会占据整个shell的控制权
这里监控了/data的创建文件信息,我们创建文件看看是否会有输出
这里立刻有了输出
时间不够精细,我们再改一下
inotifywait -mrq --timefmt "%y-%m-%d %T" --format "%T %w %f" -e create /data
%d 日期 几号
%m 月份 1-12
%T 年份的意思 显示后2位
%T 显示时分秒
inotify所能监控的事件标志如下:
- IN_ACCESS 被监控项目或者被监控目录中的条目被访问过。例如,一个打开的文件被读取。
- IN_MODIFY 被监控项目或者被监控目录中的条目被修改过。例如,一个打开的文件被修改。
- IN_ATTRIB 被监控项目或者被监控目录中条目的元数据被修改过。例如,时间戳或者许可被修改。
- IN_CLOSE_WRITE 一个打开的,等待写入的文件或目录被关闭。
- IN_CLOSE_NOWRITE 一个以只读方式打开的文件或目录被关闭。
- IN_CLOSE 一个掩码,可以很便捷地对前面提到的两个关闭事件(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)进行逻辑操作。
- IN_OPEN 文件或目录被打开。
- IN_MOVED_FROM 被监控项目或者被监控目录中的条目被移出监控区域。该事件还包含一个 cookie 来实现 IN_MOVED_FROM 与 IN_MOVED_TO 的关联。
- IN_MOVED_TO 文件或目录被移入监控区域。该事件包含一个针对 IN_MOVED_FROM 的 cookie。如果文件或目录只是被重命名,将能看到这两个事件,如果它只是被移入或移出非监控区域,将只能看到一个事件。如果移动或重命名一个被监控项目,监控将继续进行。参见下面的 IN_MOVE-SELF。
- IN_MOVE 可以很便捷地对前面提到的两个移动事件(IN_MOVED_FROM | IN_MOVED_TO)进行逻辑操作的掩码。
- IN_CREATE 在被监控目录中创建了子目录或文件。
- IN_DELETE 被监控目录中有子目录或文件被删除。
- IN_DELETE_SELF 被监控项目本身被删除。监控终止,并且将收到一个 IN_IGNORED 事件。
- IN_MOVE_SELF 监控项目本身被移动。
我们创建一个delete事件实例
inotifywait -mrq --timefmt "%y-%m-%d T" --format "%T %w %f 当前事件有: %e" -e delete /data
删除一个文件
弹出一个事件
close_write能够监控创建和修改两个事件
inotifywait -mrq --timefmt "%y-%m-%d T" --format "%T %w %f 当前事件有: %e" -e close_write /data
只能检测到创建,不能检测到删除
修改能检测
rsync守护进程客户端和服务端配置请看我前面的博客
- mkdir /myshell/
- cd /myshell/
- vim inoti_rsy.sh
写入下面shell语句
- #!/bin/bash
- cmd='/usr/bin/inotifywait'
- $cmd -mrq --timefmt "%y-%m-%d %T" --format " %T %w%f 当前事件有: %e" -e close_write,delete /data | \
- while read line
- do
- cd /data && \
- rsync -avzP --delete ./ rsync_backup@192.168.0.107::backup --password-file=/etc/rsync.password
- done
- mkdir /data
-
- chmod 700 /data/
sudo bash inoti_rsy.sh
再开个shell测试
touch /data/2.txt
可以看到成功同步了
看下服务端同步的文件
修改下2.txt文件
vim /data/2.txt
写入这个
也有同步信息
看下服务端,也已经同步成功!