rsync+inotify实时同步数据实现

Linux实时获取服务端文件——实时同步数据

1.工具介绍

1 inotify

inotify工具可以对文件或者目录进行监控。

inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序。

inotify既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。

2 rsync

rsync工具能够进行远程数据同步。

使用介绍:https://www.cnblogs.com/zhenhui/p/5715840.html

rsync命令格式:https://cloud.tencent.com/developer/article/1114056

Operation not permitted:错误参考:https://www.cnblogs.com/smail-bao/p/8311578.html

rsync(remote synchronize)是Liunx/Unix下的一个远程数据同步工具。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。

rsync算法并不是每一次都整份传输,而是只传输两个文件的不同部分,因此其传输速度相当快。

除此之外,rsync可拷贝、显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。

注:rsync需要以守护进程的方式工作,rsync服务通常基于超级守护进程xinetd管理方式来实现,因此需要安装rsync和xinetd。

2.数据同步实现步骤

服务端与客户端

数据源

rsync、inotify:链接: https://pan.baidu.com/s/1bxIeQ33ppLOrR5bXer8HvA

​ 提取码: iq13

xinetd:直接在Linux系统内进行下载

yum  -y install xinetd
服务端
简介

这里的服务端,即提供数据的服务器,我们需要同步的数据就是从这里进行实时同步的。

服务端IP:192.168.0.101

所需安装软件

rsync:

​ 版本号:3.0.9

​ 下载地址:链接: https://pan.baidu.com/s/1bxIeQ33ppLOrR5bXer8HvA

​ 提取码: iq13

​ 作用:传输数据,使数据能够同步。

inotify:

​ 版本号:3.20.2.1

​ 下载地址:链接: https://pan.baidu.com/s/1bxIeQ33ppLOrR5bXer8HvA

​ 提取码: iq13

​ 作用:监听数据的变化。

操作步骤

Linux系统:CentOS-7-x86_64-DVD-2009

我在系统上创建一个Soft文件夹,存放上述两个压缩包文件

具体路径:/home/bx/Soft

接下来的安装操作,我也将在此目录下进行

1.rsync安装
# 推荐用root用户进行安装
# 1.解压
[root@localhost Soft]# tar -zvxf rsync-3.0.9.tar.gz

# 2.进入解压后的文件夹并生成MakeFile用于下一步编译使用
[root@localhost Soft]# cd rsync-3.0.9/
[root@localhost rsync-3.0.9]# ./configure 
autoconf -o configure.sh
make: autoconf: Command not found
make: *** [configure.sh] Error 127
Failed to build configure.sh and/or config.h.in -- giving up.
# 上面安装出现了错误,提示找不到autoconf命令,这需要我们安装automake
[root@localhost rsync-3.0.9]# yum -y install automake
# 安装完成后,继续进行第2步
[root@localhost rsync-3.0.9]# ./configure 

# 3.make,进行编译
[root@localhost rsync-3.0.9]# make

# 4.make install,进行安装
[root@localhost rsync-3.0.9]# make install

# rsync安装完成
# ./configure、make、make install 命令详情可参考以下链接
# https://www.cnblogs.com/tinywan/p/7230039.html

2.inotify安装
# 推荐用root用户进行安装
# 1.返回Soft目录(压缩包所在目录)进行inotify压缩包的解压
[root@localhost rsync-3.0.9]# cd ..
[root@localhost Soft]# tar -zxvf inotify-tools-3.20.2.1.tar.gz 

# 2.进入解压后的文件夹并生成MakeFile用于下一步编译使用
[root@localhost Soft]# cd inotify-tools-3.20.2.1/
[root@localhost inotify-tools-3.20.2.1]# ./configure 

# 3.make,进行编译
[root@localhost inotify-tools-3.20.2.1]# make 

# 4.make install,进行安装
[root@localhost inotify-tools-3.20.2.1]# make install

# inotify安装完成
3.rsync配置
# 我们先在Soft下创建一个放置rsync相关文件的文件夹,并进入该文件夹进行操作
[root@localhost Soft]# mkdir rsync-file
[root@localhost Soft]# cd rsync-file/

# 1.创建配置文件
[root@localhost rsync-file]# vi rsync.conf

# 以下是配置文件内容:
    # 全局配置
    # 指定该模块以指定的 UID 传输文件。
    # 默认:nobody
    uid = root
    # 指定该模块以指定的 GID 传输文件。
    # 默认:nobody
    gid = root
    # 若为 true,在传输文件之前首先 chroot 到 path 参数所指定的目录下。实现额外的安全防护,但需要 root 权限,并且不能备份指向 path 外部的符号连接所指向的目录文件。(这里我也不太了解,有了解的大神烦请告知一下。)
    # 默认:true
    use chroot = no
    # 指定是否允许客户上传文件。若为 true 则不允许上传;若为 false 并且服务器目录也具有读写权限则允许上传。
    # 默认:true
    read only = false
    # 指定是否允许客户下载文件。若为 true 则不允许下载;若为 false 并且服务器目录也具有读权限则允许下载。
    # 默认:false
    write only = false
    # 用一个主机列表指定哪些主机客户允许连接该模块。不匹配主机列表的主机将被拒绝。
    # 默认:*
    hosts allow = 192.168.0.55
    # 用一个主机列表指定哪些主机客户不允许连接该模块。
    # 默认:空
    hosts deny = *
    # 指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。
    # 默认:0(没有限制)
    max connections = 5
    # rsync 的守护进程将其 PID 写入指定的文件。
    # 默认:无
    pid file = /var/run/rsyncd.pid
    # 指定一个 rsync 认证口令文件。auth users 被定义时,该文件才起作用。(这个文件十分重要,里面包含账户、密码)
    # 默认:空
    secrets file = /home/bx/Soft/rsync-file/rsync.user
    # 指定支持 max connections 参数的锁文件。
    # 默认:/var/run/rsyncd.lock
    lock file = /var/run/rsyncd.lock
    # 指定一个消息文件,当客户连接服务器时该文件的内容显示给客户。
    # 默认:无
    motd file = /home/bx/Soft/rsync-file/rsync.motd
    # 指定 rsync 守护进程的日志文件,而不将日志发送给 syslog。
    # 默认:无
    log file = /var/log/rsync.log
    # 使 rsync 服务器将传输操作记录到传输日志文件。
    # 默认:false
    transfer logging = yes
    # 指定传输日志文件的字段。
    # 默认:”%o %h [%a] %m (%u) %f %l”
    log format = %t %a %m %f %b
    # 指定 rsync 发送日志消息给 syslog 时的消息级别。
    # 默认:daemon
    syslog facility = local3
    # 可以覆盖客户指定的 IP 超时时间。确保 rsync 服务器不会永远等待一个崩溃的客户端。单位为秒。
    # 默认:0(未限制)
    timeout = 300
    # ============================================================================
    # 模块配置
    # 模块参数主要用于定义 rsync 服务器哪个目录要被同步。模块声明的格式必须为 [module] 形式
    [testmodel]
    # 指定当前模块在 rsync 服务器上的同步路径,该参数是必须指定的。
    # 默认:无
    path = /home/wkq/test/
    # 指定当客户请求列出可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为 false,可以创建隐藏的模块。
    # 默认:true
    list = yes
    # 指定在 rsync 服务器上运行 delete 操作时是否忽略 I/O 错误。一般来说 rsync 在出现 I/O 错误时将将跳过 delete 操作,以防止因为暂时的资源不足或其它 I/O 错误导致的严重问题。
    # 默认:true
    ignore errors = true
    #指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。用户名和口令以明文方式存放在 secrets file 参数指定的文件中。文件内容格式为:用户名:用户密码
    # 默认:匿名方式
    auth users = root
    # 给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。
    # 默认:无
    comment = test model
    
# vi的作用相当于Windows下的记事本,用来编辑文本的,直接vi一个新文件就可以创建文件。
# 2.创建认证文件:secrets file = /home/bx/Soft/rsync-file/rsync.user,并赋予600权限(必须)
[root@localhost rsync-file]# vi rsync.user
[root@localhost rsync-file]# chmod 600 rsync.user
# 认证文件内容:
# 			root:123
# 注:这里的root就是用户名,123是密码。但用户与系统用户之间没有联系,即用户名可以是系统用户之外的.
# 例如:abc:123 也是可以的,密码也是随意设置。
# 对文件赋予权限是必要操作,不然会出错(在官网说明是一定要600权限的,具体原因没有注意,要深挖的可以去看一下)。

# 3.创建给客户端看的消息文件:
[root@localhost rsync-file]# vi rsync.motd
# 消息文件内容:
# 			======================  正在运行rsync  =================

# 4.创建测试文件夹:/home/bx/test/
# 从rsync-file文件夹中出来,并创建test文件夹。
[root@localhost rsync-file]# cd /home/bx/
[root@localhost bx]# mkdir test
[root@localhost bx]# ls
Desktop  Documents  Downloads  Music  Pictures  Public  Soft  Templates  test  Videos
# 这里我把我 /home/bx 下的文件夹/文件给列出来,可以看到有我们创建的test,以及用来存放软件压缩包的Soft文件夹。

# 5.其余文件无需创建,甚至步骤3的文件也无需创建,步骤3的文件只是用于显示消息。至此,配置文件内相关的文件、文件夹就创建完成,接下来开始生效配置,然后编写、启动脚本就完成服务端的数据同步工作了。
# 编写脚本是为了方便,这样就不用多次输入命令进行数据同步操作了。当然,也可以用 crontab 进行定时操作,但这样也就不符合实时的概念了,因此这里会使用inotify进行监听,当test文件夹内的东西发生变化时,我们就通过rsync进行数据的同步操作。


4.生效配置
# 给 rsync 指定配置文件
[root@localhost bx]# rsync --daemon --config=/home/bx/Soft/rsync-file/rsync.conf

5.脚本编写
# 1.从 /home/bx 进入到 /home/bx/test 创建脚本文件:rsync.sh
[root@localhost bx]# cd test/
[root@localhost test]# vi rsync.sh 

# rsync.sh 文件内容:
    #!/bin/bash
    # 这是客户端的IP地址
    host="192.168.0.55"
    # 这是服务端的文件夹监视路径
    src="/home/bx/test/"
    # 这是配置文件: rsync.conf 中的模块名称
    des="testmodel"
    # 这是认证文件: rsync.user 中的用户
    user="root"
    # host,src,des,user这四个都是变量。shell脚本文件使用变量时会在变量前添加 $ 符号,例:$host
    # 这是监听命令:
    # -m 永远监听事件或直到 --timeout 过期。如果没有这个选项,inotifywait将在收到一个事件后退出。
    # -r 递归地观察目录。
    # -q 减少打印(仅打印事件)
    # --timefmt 这是时间格式
    # --format 这是输出的格式
    # -e 监听的事件
    # 事件有:access modify attrib close_write close_nowrite close open moved_to moved_from move move_self create delete delete_self unmount
    inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,move,delete,create,attrib $src | while read files; do
    # -a 归档模式,表示以递归方式传输文件,并保持所有文件属性。
    # -r 对子目录以递归模式处理。
    # -v 详细模式输出。
    # -z 将文件在传输时进行压缩处理。 
    # -P 保持文件权限。
    # --progress 
    # --password-file 这里的命令,是指定密码文件。就是认证文件中的密码,我们需要新建一个密码文件来在命令这里进行读取。
	# 下面命令的格式为:rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST]
	# 该格式的命令:从本地机器拷贝文件到远程rsync服务器中。当DEST路径信息包含“::”分隔符时就启动这个模式的命令。
    rsync -arvzP --progress --password-file=/home/bx/Soft/rsync-file/rsync.password $src $user@$host::$des
    echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
    done

# 2.进入到 /home/bx/Soft/rsync-file 文件夹中,并创建脚本中相关的文件:rsync.passwd,然后赋予600权限
[root@localhost test]# cd /home/bx/Soft/rsync-file
[root@localhost rsync-file]# vi rsync.password
[root@localhost rsync-file]# chmod 600 rsync.password
# 文件内容:123(是的里面就是 123 .这个小括号里的内容别复制进去咯)
客户端
简介

这里的客户端,即获取服务端数据的机器,是我们获取数据,需要同步数据的机器。

客户端IP:192.168.0.55

所需安装软件

rsync、xinetd

操作步骤

Linux系统:CentOS-7-x86_64-DVD-2009

这个系统上也创建一个Soft文件夹,存放上述两个压缩包文件

具体路径:/home/bx/Soft

接下来的安装操作,我也将在此目录下进行

(因系统是我提前克隆服务端的系统的,所以相关目录、安装过程也与上述一样)

1.rsync安装
# 推荐用root用户进行安装
# 1.解压
[root@localhost Soft]# tar -zvxf rsync-3.0.9.tar.gz

# 2.进入解压后的文件夹并生成MakeFile用于下一步编译使用
[root@localhost Soft]# cd rsync-3.0.9/
[root@localhost rsync-3.0.9]# ./configure 
autoconf -o configure.sh
make: autoconf: Command not found
make: *** [configure.sh] Error 127
Failed to build configure.sh and/or config.h.in -- giving up.
# 上面安装出现了错误,提示找不到autoconf命令,这需要我们安装automake
[root@localhost rsync-3.0.9]# yum -y install automake
# 安装完成后,继续进行第2步
[root@localhost rsync-3.0.9]# ./configure 

# 3.make,进行编译
[root@localhost rsync-3.0.9]# make

# 4.make install,进行安装
[root@localhost rsync-3.0.9]# make install

# rsync安装完成
# ./configure、make、make install 命令详情可参考以下链接
# https://www.cnblogs.com/tinywan/p/7230039.html

2.xinetd安装
# 直接使用 yum 源进行下载即可,也不用切换目录进行解压缩什么的操作了。
[root@localhost rsync-3.0.9]# yum -y install xinetd
3.rsync配置
# 我们先在Soft下创建一个放置rsync相关文件的文件夹,并进入该文件夹进行操作
[root@localhost Soft]# mkdir rsync-file
[root@localhost Soft]# cd rsync-file/

# 1.创建配置文件
[root@localhost rsync-file]# vi rsync.conf

# 以下是配置文件内容:
    # 全局配置
    # 指定该模块以指定的 UID 传输文件。
    # 默认:nobody
    uid = root
    # 指定该模块以指定的 GID 传输文件。
    # 默认:nobody
    gid = root
    # 若为 true,在传输文件之前首先 chroot 到 path 参数所指定的目录下。实现额外的安全防护,但需要 root 权限,并且不能备份指向 path 外部的符号连接所指向的目录文件。(这里我也不太了解,有了解的大神烦请告知一下。)
    # 默认:true
    use chroot = no
    # 指定是否允许客户上传文件。若为 true 则不允许上传;若为 false 并且服务器目录也具有读写权限则允许上传。
    # 默认:true
    read only = false
    # 指定是否允许客户下载文件。若为 true 则不允许下载;若为 false 并且服务器目录也具有读权限则允许下载。
    # 默认:false
    write only = false
    # 用一个主机列表指定哪些主机客户允许连接该模块。不匹配主机列表的主机将被拒绝。
    # 默认:*
    hosts allow = 192.168.0.101
    # 用一个主机列表指定哪些主机客户不允许连接该模块。
    # 默认:空
    hosts deny = *
    # 指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。
    # 默认:0(没有限制)
    max connections = 5
    # rsync 的守护进程将其 PID 写入指定的文件。
    # 默认:无
    pid file = /var/run/rsyncd.pid
    # 指定一个 rsync 认证口令文件。auth users 被定义时,该文件才起作用。(这个文件十分重要,里面包含账户、密码)
    # 默认:空
    secrets file = /home/bx/Soft/rsync-file/rsync.user
    # 指定支持 max connections 参数的锁文件。
    # 默认:/var/run/rsyncd.lock
    lock file = /var/run/rsyncd.lock
    # 指定一个消息文件,当客户连接服务器时该文件的内容显示给客户。
    # 默认:无
    motd file = /home/bx/Soft/rsync-file/rsync.motd
    # 指定 rsync 守护进程的日志文件,而不将日志发送给 syslog。
    # 默认:无
    log file = /var/log/rsync.log
    # 使 rsync 服务器将传输操作记录到传输日志文件。
    # 默认:false
    transfer logging = yes
    # 指定传输日志文件的字段。
    # 默认:”%o %h [%a] %m (%u) %f %l”
    log format = %t %a %m %f %b
    # 指定 rsync 发送日志消息给 syslog 时的消息级别。
    # 默认:daemon
    syslog facility = local3
    # 可以覆盖客户指定的 IP 超时时间。确保 rsync 服务器不会永远等待一个崩溃的客户端。单位为秒。
    # 默认:0(未限制)
    timeout = 300
    # ============================================================================
    # 模块配置
    # 模块参数主要用于定义 rsync 服务器哪个目录要被同步。模块声明的格式必须为 [module] 形式
    [testmodel]
    # 指定当前模块在 rsync 服务器上的同步路径,该参数是必须指定的。
    # 默认:无
    path = /home/bx/test/
    # 指定当客户请求列出可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为 false,可以创建隐藏的模块。
    # 默认:true
    list = yes
    # 指定在 rsync 服务器上运行 delete 操作时是否忽略 I/O 错误。一般来说 rsync 在出现 I/O 错误时将将跳过 delete 操作,以防止因为暂时的资源不足或其它 I/O 错误导致的严重问题。
    # 默认:true
    ignore errors = true
    #指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。用户名和口令以明文方式存放在 secrets file 参数指定的文件中。文件内容格式为:用户名:用户密码
    # 默认:匿名方式
    auth users = root
    # 给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。
    # 默认:无
    comment = test model
    
    
# vi的作用相当于Windows下的记事本,用来编辑文本的,直接vi一个新文件就可以创建文件。
# 2.创建认证文件:secrets file = /home/bx/Soft/rsync-file/rsync.user,并赋予600权限(必须)
[root@localhost rsync-file]# vi rsync.user
[root@localhost rsync-file]# chmod 600 rsync.user
# 认证文件内容:
# 			root:123
# 注:这里的root就是用户名,123是密码。但用户与系统用户之间没有联系,即用户名可以是系统用户之外的.
# 例如:abc:123 也是可以的,密码也是随意设置。
# 对文件赋予权限是必要操作,不然会出错(在官网说明是一定要600权限的,具体原因没有注意,要深挖的可以去看一下)。

# 3.创建给客户端看的消息文件:
[root@localhost rsync-file]# vi rsync.motd
# 消息文件内容:
# 			======================  正在运行rsync  =================

# 4.创建测试文件夹:/home/bx/test/
# 从rsync-file文件夹中出来,并创建test文件夹。
[root@localhost rsync-file]# cd /home/bx/
[root@localhost bx]# mkdir test
[root@localhost bx]# ls
Desktop  Documents  Downloads  Music  Pictures  Public  Soft  Templates  test  Videos
# 这里我把我 /home/bx 下的文件夹/文件给列出来,可以看到有我们创建的test,以及用来存放软件压缩包的Soft文件夹。

# 5.其余文件无需创建,甚至步骤3的文件也无需创建,步骤3的文件只是用于显示消息。至此,配置文件内相关的文件、文件夹就创建完成,接下来开始生效配置,然后编写、启动脚本就完成服务端的数据同步工作了。
# 编写脚本是为了方便,这样就不用多次输入命令进行数据同步操作了。当然,也可以用 crontab 进行定时操作,但这样也就不符合实时的概念了,因此这里会使用inotify进行监听,当test文件夹内的东西发生变化时,我们就通过rsync进行数据的同步操作。


这样,我们就完成了数据实时同步的准备工作:
1.服务端:

​ 完成对文件夹的实时监控工作。

​ 当文件夹内的内容发生改变时,就会运行 rsync 命令对远程的rsync客户端进行请求,对客户端存储数据的文件夹进行同步更新。

​ 2.客户端

​ 完成rsync的客户端配置工作。

测试

前提条件

rsync 的端口,默认使用的是873。

在没有关闭防火墙或者开通端口,就直接运行rsync命令是会出错的。

这里为了方便,我们直接关闭防火墙进行测试。

1.进入test文件夹,启动服务端写好的脚本
[root@localhost bx]# cd test/
[root@localhost test]# sh rsync.sh 
2.在服务端的test文件夹中打开一个新的Terminal窗口,新建一个文件夹进行测试
[root@localhost test]# mkdir 1
# 随后观察到服务端这边的test文件夹内有一个文件夹名称为“1”的文件夹(我们刚刚mkdir新建的)。
# 这时我们看到客户端这边,查看 /home/wkq/test/ 路径下也有一个文件夹名称为“1”的文件夹,同时还有rsync.sh这个脚本文件也同步到客户端这里了。至此,数据同步的方案就完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值