• 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

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

    查看内核参数:

    1. [root@Node1 ~]#:cat /proc/sys/fs/inotify/max_queued_events
    2. 16384
    3. [root@Node1 ~]#:cat /proc/sys/fs/inotify/max_user_instances
    4. 128
    5. [root@Node1 ~]#:cat /proc/sys/fs/inotify/max_user_watches
    6. 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源:

    1. [root@Node1 ~]#:yum install -y epel-release.noarch
    2. ......
    3. [root@Node1 ~]#:yum install -y inotify-tools
    4. ......

    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远程同步

    查看软件:

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

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

    基于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

    1. [root@Node1 data]#:ls
    2. test
    3. [root@Node1 data]#:ls test/
    4. 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---

  • 相关阅读:
    《前端》JavaScript--常用库API
    KMP算法
    Linux之高级IO相关内容整理分析
    软考高项-计算题(3)
    LeetCode220809_78、颜色分类
    Python匿名函数
    【QT】对象树
    【App自动化测试】(八)三种等待方式——强制等待、隐式等待、显示等待
    区块链游戏开发颠覆传统游戏开发的 5 种方式
    物流查询 批量查询物流如何查看快递是否已签收
  • 原文地址:https://blog.csdn.net/2301_78327423/article/details/140375358