写点什么

Linux 下 inotify + rsync 实现文件实时同步

用户头像
李先生
关注
发布于: 2021 年 02 月 08 日


一、什么是 rsync

rsync:“remote sync”是一个本地远程同步文件的工具。在第一次连通完成时,会把整份文件传输一次,下一次就只传送两个文件之间不同的部分。


二、rsync 同步的两种方式

1)直接使用 rsync 命令,使用 SSH 协议,默认为 22 端口

2)rsync daemon 形式,使用 rsync 协议,默认为 873 端口


三、同步命令

三种方法的同步命令之间的区别就是“:”的个数,本地同步无“:”,命令行同步一个“:”,daemon 形式的同步两个”:“。


1)本地文件同步
rsync [OPTION...] SRC... [DEST]
复制代码


2)本地与远程同步


pull 方法:

rsync [OPTION...] [USER@]HOST:SRC... [DEST]
复制代码


push 方法

rsync [OPTION...] SRC... [USER@]HOST:DEST
复制代码


3)使用 rsync 进程方式


pull 方法

rsync [OPTION...] [USER@]HOST::SRC... [DEST]rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
复制代码


push 方法:

rsync [OPTION...] SRC... [USER@]HOST::DESTrsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST)
复制代码


四、详细描述


remote sync 是一个数据镜像备份工具,采用 rsync 算法,可以将一个客户机和远程文件服务器之间的文件进行同步,也可以在本地系统中将数据从一个分区备份到另一个分区。如果 rsync 在备份过程中出现了数据传输中断,恢复后可以继续传输不一致的部分。rsync 可以执行完整备份与增量备份。


特点:

1):可以镜像保存整个目录树和文件系统

2):很容易做到保持原来文件的权限、时间、软硬连接

3):无需特殊权限即可安装

4):可以增量同步数据,文件传输效率高

5):可以使用 rcp、ssh 等方式来传输文件,当然也可以直接通过 socket 连接

6):支持匿名传输


五、参数详解


1)常用参数

-t :将源文件的 modify time 也同步到目标机器。它会在同步前先对比两边文件的时间戳和文件大小,如果一致,则认为两边文件一样,对次文件就不进行采取更新动作。如果目标端的文件的时间戳,大小和源端完全一致,但恰巧内容不一样时,rsync 时发现不了的解决这个的办法是使用 I 参数。

-I:(大写 i)挨个文件发起数据同步

-v:获取日志信息

-z:先压缩再传输

-r:递归,级联的进行同步

-a:除了递归同步外,还可以同步元信息(权限、修改时间等)

-n:模拟命令执行的结果,并不是真正的执行命令

-l(小写 L):同步链接文件时

-p:保持源文件的权限 perserve permissions

-H:同步硬链接

-g -o:保持所属组和属主

-delete:删除只存在与目标目录,不存在于源目录的文件

-exclude:排除某个文件

-exclude-from:排除写在某个文件里的所有文件名

-partial:断点续传


2、所有参数


PDF 版本可下载:

链接: https://pan.baidu.com/s/1Gd2HUbC_ZIL8C4N0ntpAZw密码: 5dsb
复制代码


六、常用命令


1)将源目录复制到目的端

rsync -av source_path  destination_pathrsync -av zhongjiang.sh opt@10.0.0.128:/home/opt/
复制代码


-v:表示在 stdout 上打印出细节信息或进度


2)压缩传输

通过网络进行传输时,压缩数据能够明显改善传输效率,用 rsync -z 指定在网络传输时压缩数据

rsync -avz source destination
复制代码


3)将目录下的内容同步到另一个目录

rsync -av /shell/ opt@10.0.0.128:/home/opt/lop
复制代码

 

4)将目录本身同步到另一个目录

rsync -av /shell/lll opt@10.0.0.128:/home/opt/lop
复制代码


5)使用 rsync 进行归档的过程中排除部分文件

--exclude PATTERN

rsync -avz /shell/lll opt@10.0.0.128:/home/opt/lllop --exclude "*.txt"
复制代码


6)使用 rsync 进行归档的过程中排除部分文件,把不需要的文件名写在 file 里面

--exclude-from FILEPATH

rsync -avz /shell/lll opt@10.0.0.128:/home/opt/lllop --exclude-from /shell/file
复制代码

 

7)在更新 rsync 备份时,删除不存在的文件

rsync -avz /shell/lll opt@10.0.0.128:/home/opt/lllop --delete
复制代码


七、daemon 模式


1:daemon 模式配置文件

rsync 以 daemon 方式运行的时候使用配置文件为 rsyncd.conf


2:服务端与客户端

使用 daemon 模式的时候,一定要分清楚服务端和客户端,与平时理解的服务端与客户端不太一样,被同步的一端为服务端,要把文件同步到另一端的源端为客户端。



3:文件格式

     1) rsyncd.conf 配置文件由模块和参数组成,一个模块以写在方括号里的模块名称开始,直到下一个模块,模块里包含由“name = value”格式的参数。

     2)文件是基于行的,每一行代表一个模块名或者参数


4:启动方式

     daemon 模式运行必须启动的时候加参数 --daemon

rsync --daemon
复制代码


5:模块配置


1)服务端(目标端,被同步的一端)的配置文件

# /etc/rsyncd: configuration file for rsync daemon mode​# See rsyncd.conf man page for more options.​# configuration example:​# 全局配置​uid = root​gid = root​use chroot = no​max connections = 2​pid file = /var/run/rsyncd.pid​log file = /var/log/rsyncd.log​lock file = /var/run/rsyncd.lock​# 模块配置​[test]​comment = "同步nginx的配置文件"​path = /captain/shell​read only = no​auth users = rsync​secrets file = /etc/rsyncd.secrets​list = no
复制代码


rsync.conf 包括两部分,一部分为全局配置,一部分为模块配置,全局配置定义 rsync 的整体行为。


全局配置

1)uid、gid:当使用非 root 账号时,那么一定要确保服务的的文件夹是否有该非 root 账号写入的权限

2)use chroot = no :是否可以切换到 root 目录,当 chroot 为 yes 的时候,客户端连接模块的时候,先 chroot 到模块参数指定的目录下,必须使用 root 权限,端口号必须是 1024 以内,且不能备份 path 路径外的链接文件

3)max connections = 2 :表示同时最大的连接数,也就是同时只能有两个客户端对自己进行连接


并且此选项必须与 lock file = /var/run/rsyncd.lock 共同使用,若不指定,默认为/var/run/rsyncd.lock


模块部分

每一个模块部分都是一个文件夹或者文件的 rsync 同步

1)[modulname]:模块的名称

2)path = /captain/shell:表示的是当客户端把数据同步过来将保存的路径

3)read only = no :如果为只读,那么将不能进行写同步,所以必须关闭

4)auth users = rsync :用来进行同步的用户,不需要系统用户中有,虚拟的就行

5)secrets file = /etc/rsyncd.secrets :表示的是账号密码文件,此文件可随意指定,文件里必须以 username:password 的格式

rsync:123456
复制代码


此文件权限必须为 600,否则会报错


6)list = no :表示的是当服务端拒绝客户端的请求时,是否是直接显示权限拒绝,还是现实模块不存在,一般与 hosts allow 和 hosts deny 一起使用,当一个被服务端拒绝的请求进来时,如果设置为 list = no,那么直接返回模块不存在。


2、服务端账号密码文件

vim /etc/rsyncd.secrets

rsync:123456
复制代码


3、客户端配置文件

客户端(源端,需将此台机器上的文件同步出去)的配置文件只需做简单的修改,设置日志文件和 pid 文件路径,然后启动 rsync 即可‍

pid file = /var/run/rsyncd.pidlog file = /var/log/rsyncd.log
复制代码


4、客户端密码文件

vim /etc/rsyncd.passwd

123456
复制代码

 

5、启动 dameon

分别在服务端和客户端启动 rsync

rsync --daemon
复制代码

 

6、同步命令

rsync -avz --password-file=/etc/rsyncd.passwd /data/shell/ rsync@192.168.1.103::test
复制代码


-avz:表示同步过程中输出信息显示的格式

--password-file=/etc/rsyncd.passwd :表示客户端将拿此密码去服务端进行认证,所以这个文件里的秘密为上面服务的所设置的密码,只需 passwd

/data/shell/ :表示源目录,将要把此目录下的所有文件同步到远端。


注:这里有无/的区别:有/的时候表示的是/data/shell/目录下的东西同步过去而无/的时候表示的是把 shell 目录同步过去


八、监控目录变化


1、查看内核是否支持 inotify 机制 
cat /boot/config-$(uname -r)|grep CONFIG_INOTIFY_USER=y
复制代码


2、安装
yum install inotify-tools
复制代码


3、监控某个目录的变化
inotifywait -rme modify,attrib,move,close_write,create,delete,delete_self /software/mm​inotifywait -mqr --format '%Xe %w%f' -e modify,create,delete,attrib /data/
复制代码

 

inotifywait --exclude '^/software/mm/ll' -rme modify,move,close_write,create,delete,delete_self /software/mm
复制代码

 

4:统计文件目录下的变化次数
inotifywatch -v -e access -e modify -t 120  -r /software/mm/
复制代码

 

5、监控脚本
#!/bin/bash#目标IPip1=10.0.0.75rsync_passwd_file=/etc/rsync.secrets/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e create,move,attrib,open,close,modify /test | while read filesdoecho $filesEVENT=`echo $files|awk -F" " '{print $1}'`echo $EVENTFile=`echo $files|awk -F" " '{print $2}'`echo $Fileif [[ $EVENT = "CREATE" ]] || [[ $EVENT = "MODIFY" ]] || [[  $EVENT = "MOVED_TO" ]]  ;thenecho "Create or Modify or Moved_to"        rsync -avzcr --password-file=$rsync_passwd_file $(dirname $File) root@$ip1::mydatafiif [[ $EVENT = "DELETE" ]] || [[ $EVENT = "MOVED_FROM" ]] ;thenecho "Delete or Moved_From"        rsync -avzcr --delete --password-file=$rsync_passwd_file $(dirname $File) root@$ip1::mydatafiif [[ $EVENT = "ATTRIB" ]] ;thenecho "Attribe"if [[ ! -d $File ]] ;then            rsync -avzcr --password-file=$rsync_passwd_file $(dirname $File) root@$ip1::mydatafifidone
复制代码


作者简介

李先生(Lemon),高级运维工程师(自称),SRE 专家(目标),梦想在 35 岁买一辆保时捷。喜欢钻研底层技术,认为底层基础才是王道。一切新技术都离不开操作系统(CPU、内存、磁盘)、网络等。坚持输入输出,记录自己学习的点滴,在平凡中坚持前行,总有一天会遇见不一样的自己。公众号:运维汪(ID:Leeeee_Li)。


发布于: 2021 年 02 月 08 日阅读数: 18
用户头像

李先生

关注

专注于运维技术、SRE、DevOps等。 2020.07.23 加入

在平凡中坚持前行,总有一天会遇见不一样的自己。 公众号:运维汪

评论

发布
暂无评论
Linux下inotify + rsync实现文件实时同步