Linux:inotify监控,rsync远程同步

2024-07-13 1936阅读

在生产环境,有时会需要两台主机的特定目录实现实时同步,比如,将NFS共享目录的数据文件,自动同步到备份服务器特定目录中。

一、实时同步技术介绍

1.1 实现实时同步的方法

inotify+rsync方式:实现数据同步

sersync:功能更强大

1.2 工作原理

要利用监控服务(inotify),监控同步数据服务器目录中信息的变化

发现目录中数据产生变化,就利用rsync服务器推送到备份服务器上

1.3 Inotify:

异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持inotify,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件。

1.4 实现inotify软件:

inotify-tools,sersync,lrsyncd

1.5 inotify+rsync适用方式:

inotify对同步数据目录信息的监控

rsync完成对数据的同步

利用脚本进行结合

二、inotify实时监控

2.1 内核支持

内核是否支持inotify

linux支持inotify的内核最小版本为2.6.13

可以通过命令,说明服务器内核支持inotify

Python
[root@Node1 ~]#:ll /proc/sys/fs/inotify/
总用量 0
-rw-r--r--. 1 root root 0 712 2024 max_queued_events
-rw-r--r--. 1 root root 0 712 2024 max_user_instances
-rw-r--r--. 1 root root 0 712 2024 max_user_watches

查看内核参数:

Python
[root@Node1 ~]#:cat /proc/sys/fs/inotify/max_queued_events 
16384
[root@Node1 ~]#:cat /proc/sys/fs/inotify/max_user_instances 
128
[root@Node1 ~]#:cat /proc/sys/fs/inotify/max_user_watches 
8192

 内核参数说明:

max_queued_events:inotify事件队列最大长度,如值太小会出现event Queue Overflow错误,默认值:16384,建议调大。

max_user_isntances:每个用户创建inotify实例最大值,默认是:128

max_user_watches:可以监视的文件的总数量,默认是:8192,建议调大

可以修改内核参数:/etc/sysctl.conf文件

2.2 inotify-tools工具

安装工具需要epel源:

Python
[root@Node1 ~]#:yum install -y epel-release.noarch
......
[root@Node1 ~]#:yum install -y inotify-tools
......

inotify-tools包主要工具有:inotifywait和inotifywatch。

inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,常用于实时同步的目录监控。

inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。

2.3 inotifywait命令

格式:inotifywait [选项] file [文件1] [文件2] [...]

常用的一些选项:

-m,始终保持事件监听

-d,以守护进程方式执行,和-m相似,配合-o使用

-r,递归监控目录数据信息变化

-q,输出少量事件信息

-o,打印事件到文件中,相当于标准正确输出,注意:使用绝对路径

-e,指定监听的事件,如果省略,表示所有的时间都进行监听

--timefmt,该命令的时间格式:

%y-%m-%d:年-月-日

%H:%M:%S:时:分:秒

例如:--timefmt "%y-%m-%d %H:%M:%S"

--format格式定义:

%T:输出时间格式中定义的时间格式信息。与前面的--timefmt语法格式指定时间日期

%w:监控文件或目录

%f:监控文件或目录信息

%e:显示发生的事件信息,事件默认用","分隔。但是可以使用指定的分割符。%Xe,X分割

指定的事件:-e

create,delete,moved_to,close_write,attrib

三、inotify监控

使用两个终端,一个终端监控,一个终端操作。

在文件夹中执行ls命令,监控,打开目录

Linux:inotify监控,rsync远程同步

-m选项,始终监听

 创建了一个文件a.txt

Linux:inotify监控,rsync远程同步

-rm,递归

Linux:inotify监控,rsync远程同步

时间格式:--format输出定义的时间格式信息

Linux:inotify监控,rsync远程同步

 inotifywait -rm /data/ --timefmt "%y-%m-%d %H-%M-%S" --format "%T %w%f event: %;e"

24-07-12 14-02-04:%T

/data/:%w目录

a.txt:%f文件

event:事件

OPEN;ISDIR:以分号为分割符,监控变更的所有事件

Linux:inotify监控,rsync远程同步

普通的一次性命令程序

四、rsync

rsync远程同步

查看软件:

Python
[root@Node1 data]#:rpm -q rsync
rsync-3.1.2-6.el7_6.1.x86_64
[root@Node1 data]#:rpm -ql rsync
/etc/rsyncd.conf
/etc/sysconfig/rsyncd
/usr/bin/rsync
/usr/lib/systemd/system/rsyncd.service
......

既然是远程同步,有另一台服务器端

基于SSH协议

rsync有三种工作方式:

1.本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。

2.本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。

3.本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。

前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接。

常用选项:

-v:显示rsync过程中详细信息。

-a --archive:归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。

-o --owner:保持owner属性(属主)。

-g --group:保持group属性(属组)。

-z:传输时进行压缩提高效率

--delete:以SRC为主,对DEST进行同步。多则删之,少则补之。

-e:指定所要使用的远程shell程序,默认为ssh。

......


ssh协议:将本机目录,通过ssh协议发送给对面, 一次性命令:

rsync -av /etc/passwd root@192.168.114.20:/opt

rsync协议发给对面

将本机的/etc/passwd文件,同步到主机192.168.114.20的root用户,/opt/下

Linux:inotify监控,rsync远程同步

-a保留权限(所有),-v显示过程

加不加/的问题。

现在本地/data下。创建test文件夹,test文件夹里面有两个文件a.txt和b.txt

Python
[root@Node1 data]#:ls
test
[root@Node1 data]#:ls test/
a.txt  b.txt

 文件夹/data/test后加不加/的问题。每次实验,都是清空文件夹后再操作的

加/:rsync -av /data/test/ root@192.168.114.20:/opt

Linux:inotify监控,rsync远程同步

发现,加/不会把test文件夹同步过去。

不加/:rsync -av /data/test root@192.168.114.20:/opt

Linux:inotify监控,rsync远程同步

test后不加/,会把test文件夹一并同步过去。

--delete的用法:我们把本地Node1的test文件夹下b.txt删除。再次同步。

如果远端有与本机多出的文件,会删除远端多于的文件,使其与本机同步。

Linux:inotify监控,rsync远程同步

五、服务端开启rsyncd

5.1 数据同步

当客户端要与服务端同步文件时,数据服务器,和备份服务器(要开启rsync服务)。

开启rsync服务,监听在873端口上。

开启:rsync --daemon

Linux:inotify监控,rsync远程同步

要想开启必须要有配置文件,默认已存在:/etc/rsyncd.conf

端口为873端口

开启之后去客户端使用rsync软件同步文件:

Python
[root@Node1 data]#:rsync rsync://192.168.114.20

服务端没有设置共享目录。使用命令无法看到共享目录。

我这里用的是systemctld启动的。把873的pid使用kill -9杀掉。启动:systemctl start rsyncd

服务端Node2上设置共享目录:

vim /etc/rsyncd.conf

手动添加共享目录:

[backup]

path = /data/

Linux:inotify监控,rsync远程同步

再在客户端查看:

Linux:inotify监控,rsync远程同步

 把客户端的passwd文件同步到客户端的/data/下。提示权限拒绝。

Linux:inotify监控,rsync远程同步

需要设置,指定可读写,默认只读

Linux:inotify监控,rsync远程同步

指定目录给nobody权限,默认用户以nobody访问此目录

给nobody  用户加权限

Linux:inotify监控,rsync远程同步

再次同步: 

Linux:inotify监控,rsync远程同步

执行成功,查看/data/文件夹下:这样Node1的passwd文件就同步过来了。

Linux:inotify监控,rsync远程同步

第二种方式:rsync /etc/fstab 192.168.114.20::backup

Linux:inotify监控,rsync远程同步

5.2 实现验证功能

对配置文件进行以下修改:

Linux:inotify监控,rsync远程同步

max connections = 0   #最大连接

exclude = lost+found/   #不同步文件

use chroot = no   #限制目录,禁锢。只允许操作这个文件夹

reverse lookup = no   #禁用反向解析。不需要,尽量禁用掉

auth users = rsyncuser  #只能通过这个用户

 必须修改权限600

Linux:inotify监控,rsync远程同步

使用客户端测试:

Linux:inotify监控,rsync远程同步

查看是否同步:

Linux:inotify监控,rsync远程同步

客户端设置密码

客户端配置密码文件:

[root@Node1 ~]#:echo "123456" > /etc/pass

也可以将密码赋值给环境变量RSYNC_PASSWORD变量,但是不安全

必须授权:

[root@Node1 ~]#:chmod 600 /etc/pass

非交互式查看共享目录,查看的是服务端那边的目录。

Linux:inotify监控,rsync远程同步

---end---

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]