inotify介绍
inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件,我们通常使用其命令inotifywait进行文件夹监控。
rsync介绍
rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。rsync可以镜像保存整个目录树和文件系统,且能做到保持原来文件的权限、时间、软硬链接等等。通过增量同步的方式传输,只在第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件。rsync在传输数据的过程中可以实现压缩及解压缩操作,因此可以使用更少带宽。
rsync有三种模式
-
本地模式
-
单文件同步
# rsync /etc/hosts /opt把/etc/hosts文件同步到/opt文件夹下面
-
目录同步
# rsync -avz /opt/ /mut文件夹后面的/代表文件夹下面的所有文件,单不包括目录本身。
-
-
远程模式
远程模式使用ssh进行文件传输。其用户为操作系统的实际用户,如下命令中的root。它不需要启动rsync的守护进程。
# rsync -avz --delete /app/ root@92.168.16.12:/app远程模式有如下两种结构
结构一
结构二
可以在源服务器上执行同步命令也可以在目标服务器上执行同步命令。
-
守护进程模式
守护进程模式,需要在文件备份的目标服务器(rsync服务端)上安装rsync进行监控。它不借助于ssh进行文件传输,而是通过rsync的协议进行传输。
其同步逻辑图如下:
实时文件备份案例
前置说明
本例是基于inotify和rsync守护进程模式配合进行文件同步,如下是同步逻辑图。
本案例操作系统内核与软件版本说明
| 操作系统内核版本 | Rsync版本 | inotify-tools版本 |
|---|---|---|
| CentOS Linux release 7.5.1804 (Core) | version 3.1.2 protocol version 31 | 3.14-9 |
目的说明
我们需要通过inotify配合rsync对源服务器的多个文件夹进行备份到目标服务器的指定文件夹下面
| 源服务器ip(srync客户端) | 源文件夹 | 目标服务器ip(srync服务端) | 目标文件夹 |
|---|---|---|---|
| 172.16.33.147 | /app/share | 172.16.33.146 | /app/share |
| 172.16.33.147 | /app/portal | 172.16.33.146 | /app/portal |
目标服务器相关软件安装与配置
在目标服务器上面,只需跑rsync的守护进程就可以。
目标服务安装rsync
-
关闭目标服务器防火墙与selinux
本例是直接把防火墙关掉了,如果防火墙有存在的必要。则请通过配置防火墙规则实现。
# systemctl stop firewalld # setenforce 0 -
目标服务器安装rsync软件
# yum -y install rsync -
配置rsync
修改rsync的配置文件rsyncd.conf
# vim /etc/rsyncd.conf log file = /var/log/rsyncd.log pidfile = /var/run/rsyncd.pid lock file = /var/run/rsync.lock port = 873 uid = root gid = root #认证文件,里面设置了认证所需要的用户信息,该配置也可以放到下面每一个模块中,单独使用 secrets file = /etc/rsync.password #appshare 模块,该模块用来写入/app/share文件夹 [appshare] path = /app/share comment = sync etc from client ignore errors use chroot = no read only = no list = no max connections = 200 timeout = 600 #认证的用户 auth users = rsync_user #来源ip,可以通过网段设置,如:192.168.0.0/24 hosts allow = 172.16.33.147 #来源ip,可以通过网段设置,如:192.168.0.0/24等 hosts deny = 172.16.1.1 #appportal 模块,该模块用来写入/app/portal [appportal] path = /app/portal comment = sync etc from client ignore errors use chroot = no read only = no list = no max connections = 200 timeout = 600 auth users = rsync_user hosts allow = 172.16.33.147 hosts deny = 172.16.1.1笔者的踩坑,此配置文件中的注释,不能写在有效行的后面,只能写在空行。否则同步会报错。
创建同步认证用户配置文件
# echo "rsync_user:123456" > /etc/rsync.password # chmod 600 /etc/rsync.password此处创建的同步用户并不是操作系统的用户,而是rsync自己使用的认证用户。如果我们需要对多个文件夹进行监控与同步,则可以配置多个模块。如上,分别配置了模块 appshare 和 appportal。
-
启动rsync
# systemctl start rsyncd # systemctl status rsyncd ● rsyncd.service - fast remote file copy program daemon Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2022-05-13 11:27:45 CST; 3h 45min ago Main PID: 890592 (rsync) CGroup: /system.slice/rsyncd.service └─890592 /usr/bin/rsync --daemon --no-detach May 13 11:27:45 crm01 systemd[1]: Started fast remote file copy program daemon. May 13 11:27:45 crm01 systemd[1]: Starting fast remote file copy program daemon...
源服务器相关软件安装与配置
在源服务器,我们需要通过inotify对文件夹的变更进行监控,并通过rsync进行数据同步。
源服务器安装、配置rsync安装rsync
# yum -y insatll rsync
配置认证的密码文件,此处密码的值应该为目标服务器里面设置的用户密码
# echo "123456" > /etc/rsync.password
# chmod 600 /etc/rsync.password
rsync命令常用选项
-a, --archive //归档 -v, --verbose //啰嗦模式 -q, --quiet //静默模式 -r, --recursive //递归 -p, --perms //保持原有的权限属性 -z, --compress //在传输时压缩,节省带宽,加快传输速度 --delete //在源服务器上做的删除操作也会在目标服务器上同 --bwlimit //限速
源服务器安装、配置inotify-tools
inotify-tools安装
# yum -y install epel-release
# yum -y install inotify-tools
inotifywait常用的命令选项
-r #递归查询目录 -d #守护进程运行 -q #打印很少的信息,仅仅打印监控时间的信息 -m #始终保持事件监听状态 --exclude #排除文件或者目录时,不许分大小写 --format #打印使用指定的输出类似格式字符串 -e #通过此参数可以指定需要监控的时间,如下一个列表所示 access #文件或者目录被读取 modify #文件或者目录内容被修改 attrib #文件或者目录属性被改变 close #文件或者目录封闭,无论读写模式 open #文件或者目录被打开 moved_to #文件或者目录被移动到另一个目录 move #文件或者目录被移动到里一个目录或者从一个目录移动到当前目录 create #文件或者目录被创建到当前目录 umount #文件系统被卸载 delete #文件或者目录被删除--timefmt 指定时间输出的格式
inotify-tools设置监控启动脚本
因为我们需要监控两个文件夹的变更,所以我们需要做两个脚本进行监控。
监控 /app/share文件夹
# vim syncappshare.sh
#!/bin/bash
ip=172.16.33.146 #目标服务器ip
src=/app/share/ #数据目录 如果没有最后一个斜杠,则会复制包含share这个文件夹过去,
dst=appshare #模块名
user=rsync_user #用户(和目标服务器提供的保持一致)
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib ${src} | while read file
do
rsync -vzrtopg --delete --progress $src $user@$ip::$dst --password-file=/etc/rsync.password > /dev/null && echo "$src was rsyncd"
done
监控 /app/portal文件夹
# vim syncappportal.sh
#!/bin/bash
ip=172.16.33.146 #目标服务器ip
src=/app/portal/ #数据目录 如果没有最后一个斜杠,则会复制包含share这个文件夹过去,
dst=appportal #模块名
user=rsync_user #用户(和目标服务器提供的保持一致)
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib ${src} | while read file
do
rsync -vzrtopg --delete --progress $src $user@$ip::$dst --password-file=/etc/rsync.password > /dev/null && echo "$src was rsyncd"
done
dst变量所配置的模块名,对应于目标服务中,rsync的rsync.password配置文件中所配置的模块名称
启动监控
启动/app/share的监控
# nohup sh syncappshare.sh > syncappshare.log 2>&1 &
启动/app/portal的监控
# nohup sh syncappportal.sh > syncappportal.log 2>&1 &
至此,基于rsync和inotify搭建的文件备份做完