文章目录
Inotify 工具
inode notify
为用户态应用程序提供了文件系统事件通知机制
- 发生文件的访问、修改、删除等事件,可以立刻通知给用户态应用程序
- 通过
Inotify
可以实时了解文件系统发生的所有变化
常见的监控事件
事件 | 描述 |
---|---|
IN_ACCESS | 文件访问事件 |
IN_MODIFY | 文件修改事件 |
IN_ATTRIB | 文件属性修改事件 |
IN_OPEN | 文件打开事件 |
IN_CLOSE_WRITE | 可写文件被关闭事件 |
IN_CLOSE_NOWRITE | 不可写文件被关闭事件 |
IN_MOVED_FROM | 文件移动或重命名事件 |
IN_MOVED_TO | 文件移动或重命名事件 |
IN_DELETE | 文件或目录删除事件 |
IN_CREATE | 文件或目录创建事件 |
IN_DELETE_SELF | 自删除事件 |
版本要求
Inotify
是内核提供的一种系统功能,用户如果要使用,还需要安装用户态软件
- 在 Linux Kernel 2.6.13之后才提供了此功能
实现方案
对于Inotify
的实现,主要有以下几个软件
- Inotify
- Sersync
- Lsyncd
不推荐使用
Inotify
本身这个工具,因为 Inotify 应用中有对应的BUG:“当向监控目录下复制大量文件,或者复制复杂层次目录(多层次目录中包含文件)时,Inotify 经常会随机性地遗漏某些文件。这些遗漏掉的文件由于未被监控到,因此就会导致这些漏掉的数据没办法同步”,而 Sersync 和 Lsyncd 对 Inotify 这方面的缺陷进行了优化
Sersync 工具
工具说明
sersync 类似于 inotify,同样用于监控,但它克服了 inotify 的缺点。
优势说明
资料来源:http://www.yunweipai.com/36019.html
- sersync 是使用c++编写,而且对 linux 系统文件系统产生的临时文件和重复的文件操作进行过滤,所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快
- sersync 配置很简单,其中提供了静态编译好的二进制文件和xml配置文件,直接使用即可
- sersync 使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态
- sersync 有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步
- sersync 不仅可以实现实时同步,另外还自带 crontab 功能,只需在xml配置文件中开启,即也可以按要求隔一段时间整体同步一次,而无需再额外配置 crontab 功能
- sersync 可以二次开发
准备环境
-
待同步(备份)的服务器
- 需要安装 sersync 和 rsync
- centos 7.9 (注意内核版本要大于2.6.13)
- 需要同步的目录:/home/share
- 静态IP地址:192.168.204.52
-
备份文件存放服务器(目标服务器)
-
需要安装 rsync(daemon运行)
-
centos 7.9 (注意内核版本要大于2.6.13)
-
数据同步过来的存放目录:/home/backups
-
静态IP地址:192.168.204.57
-
-
逻辑思路
- sersync 监听192.168.204.52下的
/home/share
目录,在这个目录下文件的写入和更新就会被 sersync 通过 rsync 命令同步导目标服务器 192.168.204.57
- sersync 监听192.168.204.52下的
安装 Sersync
在源数据服务器上安装 sersync 服务,我这里是 192.168.204.52
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
#解压
tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz
#移动
mv GNU-Linux-x86 /usr/local/sersync
#配置一下
cd /usr/local/sersync/ && mkdir conf bin logs && mv confxml.xml conf/ && mv sersync2 bin/
#备份一下配置文件
cp /usr/local/sersync/conf/confxml.xml /usr/local/sersync/conf/confxml.xml.bak
安装 Rsync
源文件服务器和目的服务器都需要安装
部署 Rsync daemon 服务
- 目的服务器需要进行配置操作:
192.168.204.57
####/etc/rsyncd.conf文件内容####
transfer logging = yes
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
port = 873
address = 0.0.0.0
uid = 0
gid = 0
use chroot = yes
max connections = 100
timeout = 900
read only = no
ignore errors
auth users = rsync_backup
secrets file = /etc/rsyncd.pass
[backups]
comment = This is a backup test
path = /home/backups
- 创建备份文件存放目录:
mkdir /home/backups
- 配置账号密码文件(注意文件权限)
echo "rsync_backup:Test123456" >/etc/rsyncd.pass
chmod 600 /etc/rsyncd.pass
- 启动服务进程:
systemctl enable rsyncd --now
源数据服务器配置 Rsync
192.168.204.52 上面执行
创建密码文件
echo 'Test@123456' > /etc/rsync_client.pass
chmod 600 /etc/rsync_client.pass
#注意文件权限
手动测试下同步
我们将源数据服务器的/home/share
里面的数据同步到192.168.204.57上面,OK才算正常
rsync -avzP /home/share rsync_backup@192.168.204.57::backups --password-file=/etc/rsync_client.pass
配置 Sersync
192.168.204.52 源数据服务器上操作
修改配置文件/usr/local/sersync/conf/confxml.xml
- 24行~28行的内容
- localpath watch:本地要同步的目录
- remote ip:要同步的服务器IP和模块名
24 <localpath watch="/home/share">
25 <remote ip="192.168.204.57" name="backups"/>
26 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
27 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
28 </localpath>
- 31~34行的内容
- 关于认证授权
31 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync_client.pass"/>
32 <userDefinedPort start="false" port="874"/><!-- port=874 -->
33 <timeout start="false" time="100"/><!-- timeout=100 -->
34 <ssh start="false"/>
- 36~37行的内容
36 <failLog path="/usr/local/sersync/logs/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
37 <crontab start="false" schedule="600"><!--600mins-->
开启 Sersync 守护进程同步数据
配置环境变量
这个地方可以把安装的时候换一个位置,这样就不用配置环境变量了
echo 'export PATH=/usr/local/sersync/bin:$PATH' >> /etc/profile
source /etc/profile
启动命令
sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml
验证一下呢
先看下目标服务器同步情况
源数据服务器去新增一些文件试试
并查看一下目的服务器有没有实时同步
总结一下
- 这个模式安装配置也不难,但是没有经过实际性能测试,不知道在大文件下同步效率如何
- 整个流程也可以封装成一个 shell 脚本,这样可以快速拿到其他环境去用,后面可以搞一下