Linux:inotify监控,rsync远程同步

在生产环境,有时会需要两台主机的特定目录实现实时同步,比如,将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

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

查看内核参数:

[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源:

[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命令,监控,打开目录

-m选项,始终监听

 创建了一个文件a.txt

-rm,递归

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

 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:以分号为分割符,监控变更的所有事件

普通的一次性命令程序

四、rsync

rsync远程同步

查看软件:

[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/下

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

加不加/的问题。

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

[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

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

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

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

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

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

五、服务端开启rsyncd

5.1 数据同步

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

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

开启:rsync --daemon

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

端口为873端口

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

[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/

再在客户端查看:

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

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

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

给nobody  用户加权限

再次同步: 

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

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

5.2 实现验证功能

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

max connections = 0   #最大连接

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

use chroot = no   #限制目录,禁锢。只允许操作这个文件夹
reverse lookup = no   #禁用反向解析。不需要,尽量禁用掉
auth users = rsyncuser  #只能通过这个用户

 必须修改权限600

使用客户端测试:

查看是否同步:

客户端设置密码

客户端配置密码文件:

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

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

必须授权:

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

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

---end---

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 02:04:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 02:04:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 02:04:03       57 阅读
  4. Python语言-面向对象

    2024-07-14 02:04:03       68 阅读

热门阅读

  1. springboot整合vue上传文件至oss

    2024-07-14 02:04:03       20 阅读
  2. 差点被这个Kafka的删除策略难住了

    2024-07-14 02:04:03       18 阅读
  3. Go语言map并发安全,互斥锁和读写锁谁更优?

    2024-07-14 02:04:03       22 阅读
  4. 调用 create_meshgrid 函数时出现了 TypeError

    2024-07-14 02:04:03       17 阅读
  5. 学院教学信息管理系统(c++)

    2024-07-14 02:04:03       16 阅读
  6. 元组-预习

    2024-07-14 02:04:03       15 阅读