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这个脚本文件也同步到客户端这里了。至此,数据同步的方案就完成了。