rsync教程、rsync+inotufy、sersync

发布时间 2023-07-31 01:37:39作者: FouroFour

rsync教程、rsync+inotify实时同步

rsync介绍

英文全称为Remote synchronization服务软件

rsync是一个linux应用程序,可以实现全量以及增量本地或者是远程数据同步(拷贝)备份

使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSHrsync主机同步

rsync与scp:rsync可以增量复制

安装

yum -y install rsync

rsync使用

语法格式:
//Rsync的命令格式常用的有以下三种:
    rsync [OPTION]... SRC DEST
    rsync [OPTION]... SRC [USER@]HOST:DEST
    rsync [OPTION]... [USER@]HOST:SRC DEST
    
常用参数:
-a, --archive: 归档模式,表示以递归方式复制文件,并保持文件的所有属性,包括权限、时间戳等。
-v, --verbose: 显示详细输出,即显示文件传输的进度和其他信息。
-z, --compress: 在传输时进行压缩,可以减少网络带宽的使用。
-r, --recursive: 递归复制文件夹及其内容。
-u, --update: 只复制源文件中新于目标文件的文件。
-c, --checksum: 使用校验和比较文件内容,而不是仅仅比较时间和大小。
-h, --human-readable: 以人类可读的格式显示输出信息,例如文件大小以K、M、G等单位显示。
-P, --progress: 显示传输进度。
--delete: 删除目标目录中不存在于源目录中的文件。
--exclude: 排除指定的文件或目录。
--include:包括指定的文件或目录,即使在排除列表中。
--exclude-from:从指定文件中读取排除列表。
--include-from:从指定文件中读取包含列表。

常用命令:
1.将本地文件复制到远程主机:
rsync [选项] 源文件/目录 远程主机:目标路径

2.将远程主机文件复制到本地:
rsync [选项] 远程主机:源文件/目录 目标路径

3.同步本地两个目录:
rsync [选项] 源目录/ 目标目录/

4.仅复制新文件或有变化的文件:
rsync -u 源目录/ 目标目录/

5.递归复制整个目录树:
rsync -r 源目录/ 目标目录/

6.删除目标目录中不存在于源目录中的文件:
rsync -r --delete 源目录/ 目标目录/

7.显示详细信息:
rsync -av 源目录/ 目标目录/

8.使用 SSH 连接远程主机:
rsync -avz -e ssh 源目录/ 远程主机:目标路径

9.源文件中有删除时,同步删除以后的文件
rsync -av --delete 源目录/ 目标目录/

rsync定时同步(ssh方式)

可以通过crontab定时使用rsync命令

例如:定时备份机器2中的数据

准备1:机器2(25)/tmp/rsync/中需要定时备份的数据 同步到机器1(28)中/tmp/backup/目录下
[ root@localhost test]# tree /tmp/rsync/
/tmp/rsync/
└── test
    ├── test2.txt
    └── test.txt
1 directory, 2 files

准备2:
因为rsync从远程主机上同步数据需要ssh密码验证,所需要先ssh-keygen
ssh-keygen 一路回车 有y 填y
ssh-copy-id root@192.168.70.25
测试一下 ssh root@192.168.70.25 可以发现直接连接上不需要密码验证

开始实验
创建crontab定时任务
crontab -e
* * * * * rsync -av root@192.168.70.25:/tmp/rsync/ /tmp/backup &>/dev/null

一分钟后 可以发现文件都同步过来了
[root@localhost tmp]# tree backup/
backup/
└── test
    ├── test2.txt
    └── test.txt
1 directory, 2 files

rsync+inotify实时同步

原理介绍

1.实时同步的方法

  • inotify rsync方法实现数据同步
  • sersync 在inotify软件基础上进行开发的,功能更强大

2.工作原理

  • 要利用监控服务,监控同步数据服务器目录中信息的变化
  • 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上

inotify:

​ 异步的文件系统监控机制,利用事件驱动机制,而无须通过诸如cron等轮询机制来获取时间。

​ linux内核从2.6.13起支持inotify,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件。

grep -i inotify /boot/config-3.10.0-1160.el7.x86_64 
CONFIG_INOTIFY_USER=y

实现inotify软件:

  • inotify-tools
  • sersync
  • lrsyncd

inotify+rsync使用方式

  • inotify 对同步数据目录信息的监控
  • rsync 完成对数据的同步
  • 利用脚本进行结合

inotify

内核是否支持inotify

列出下面文件,说明服务器内核支持inotify
[root@localhost ~]# ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Jul 29 11:05 max_queued_events
-rw-r--r-- 1 root root 0 Jul 29 11:05 max_user_instances
-rw-r--r-- 1 root root 0 Jul 29 11:05 max_user_watches

[root@localhost ~]# cat /proc/sys/fs/inotify/max_queued_events 
16384
[root@localhost ~]# cat /proc/sys/fs/inotify/max_user_instances 
128
[root@localhost ~]# cat /proc/sys/fs/inotify/max_user_watches 
8192

inotify内核参数说明:

  • max_queued_events:inotify事件队列最大长度,如值太小会出现Event Queue Overflow错误,默认值:16384,生产环境建议调大,比如:327679
  • max_user_instances:每个用户创建inotify实例最大值,默认值:128
  • max_user_watches:可以监视的文件总数量(inotifywait 单进程),默认值:8192,建议调大

范例:

在/etc/sysctl.conf最下面添加
[root@localhost ~]# vim /etc/sysctl.conf 
fs.inotify.max_queued_events=327679
fs.inotify.max_user_watches=100000

[root@localhost ~]# sysctl -p
fs.inotify.max_queued_events = 327679
fs.inotify.max_user_watches = 100000

inotify-tools工具

安装inotify-tools:基于epel源

yum install inotify-tools -y

inotify-tools包主要工具:

  • inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,常用于实时同步的目录监控
  • inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计

inotifywait命令

inotifywait [options] file1 [file2] [file3] [...]

常用参数

-m –monitor 始终保持监听状态,默认触发事件即退出
-r –recursive 递归查询目录
-d –daemon 跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。
-q –quiet 减少不必要的输出(只打印事件信息)
-s –syslog 输出错误信息到系统日志
-e –event 定义监控的事件,可用参数:
    open   打开文件
    access 访问文件
    modify 修改文件
    delete 删除文件
    create 新建文件
    attrib 属性变更
--timefmt 时间格式
    %y年 %m月 %d日 %H小时 %M分钟
--format 输出格式    
    %w 表示发生事件的目录
    %f 表示发生事件的文件
    %e 表示发生的事件
    %Xe 事件以“X”分隔
    %T 使用由–timefmt定义的时间格式
--exclude <pattern> 指定要排除监控的文件/目录

可监控事件

access	访问,读取文件。
modify	修改,文件内容被修改。
attrib	属性,文件元数据被修改。
move	移动,对文件进行移动操作。
create	创建,生成新文件
open	打开,对文件进行打开操作。
close	关闭,对文件进行关闭操作。
delete	删除,文件被删除。

示例

[root@localhost yum.repos.d]# inotifywait -mr --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %;e" /tmp/rsync/
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
2023-07-29 14:12:01 /tmp/rsync/ event: OPEN;ISDIR
2023-07-29 14:12:01 /tmp/rsync/ event: CLOSE_NOWRITE;CLOSE;ISDIR

筛选一些事件,对于"打开" "查看"一些事件不监控
[root@localhost yum.repos.d]# inotifywait -mrq --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %;e" -e create,delete,move,modify,attrib /tmp/rsync/
2023-07-29 14:18:01 /tmp/rsync/test/test2.txt event: DELETE

rsync

开始提到的rsync是使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。
与上述rsync不同这里不是走ssh,而是rsync独立的服务 rsync-daemon。
两台机器都需要安装rsync。

准备:

在28机器上安装rsync服务(之前是在25机器上) 执行以下命令即可 再查看以下873端口是否开启

[root@localhost etc]# rsync --daemon

[root@localhost etc]# netstat -tunlp
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      3599/rsync      

再写配置rsyncd.conf文件
vim /etc/rsyncd.conf
在最下面添加
[backup]
path = /tmp/backup/
read only = no

格式:

rsync daemon:
pull:
rsync [OPTION]... [USER@]HOST::SRC DEST 

push:
rsync [OPTION...] SRC... [USER@]HOST::[DEST]

测试:

[root@localhost yum.repos.d]# rsync /etc/networks root@192.168.70.28::backup
rsync: mkstemp "/.networks.hTs4QS" (in backup) failed: Permission denied (13)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]

报错了,需要在28机器上指定目录给nobody权限,默认用户以nobody访问此目录
setfacl -m u:nobody:rwx /tmp/backup

再次在25机器上执行
rsync /etc/networks root@192.168.70.28::backup
可以发现成功了 在28机器上查看
[root@localhost backup]# ll
total 4
-rw-r--r-- 1 nobody nobody 58 Jul 29 16:18 networks
drwxr-xr-x 2 root   root   22 Jul 29 14:18 test

其实我们在这里可以发现这种没有密码验证的方式传输文件是不安全的,我们可以把rsyncd.conf文件以标准的形式编写

vim /etc/rsyncd.conf
motd file = /etc/rsyncd.motd
transfer logging = yes
log file =/var/log/rsyncd.log
pid file =/var/run/rsyncd.pid
lock file =/var/run/rsync.lock
port = 873
uid = root
gid = root
reverse lookup = no
ignore errors
use chroot = no
max connections = 10

[backup]
comment = backup dir #描述
path = /tmp/backup
read only = no
auth users = root,zhangsan #只有这些账号能访问backup目录
secrets file = /etc/rsyncd.password #这些账号的密码
#hosts allow=192.168.0.0/255.255.255.0
#hosts deny=*
list= false

编写rsyncd.password 这个文件名需要跟上述配置文件secrets file = /etc/rsyncd.password 一致!

vim rsyncd.password
root:123456
zhangsan:123456

修改属性 600 除了root其他人不能查看

chmod 600 /etc/rsyncd.password

再测试:

[root@localhost rsync]# rsync -av /etc/group root@192.168.70.28::backup
Password: 
输入root密码即可 

使用--password-file=FILE 命令 可以以非交互的方式
注意:此步骤是在25机器上创建,之前几个步骤都是在28机器上 (1.内容取决于你等下要用哪个用户的密码 2.路径可以不一致)

echo "123456" > /etc/rsyncd.password

测试:

[root@localhost rsync]# rsync -av --password-file=/etc/rsyncd.password /etc/passwd root@192.168.70.28::backup
sending incremental file list
passwd

sent 642 bytes  received 35 bytes  1,354.00 bytes/sec
total size is 552  speedup is 0.82

可以看到不用交互式输入密码即可完成文件传输

rsync+inotify+shell 脚本实现实时数据同步

先要确保两主机初始数据处于同步状态(需要被同步数据的机器装好inotify rsync [25机器],同步数据的机器装好rsync并配置好文件 [28机器]),此脚本实现后续的数据同步

#!/bin/bash
SRC='/tmp/backup'
DEST='root@192.168.70.28::backup'
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} | while read DATE TIME DIR FILE;do
        FILEPATH=${DIR}${FILE}
        rsync -az --delete --password-file=/etc/rsyncd.password $SRC $DEST && echo "At ${TIME} on ${DATE},file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done

sersync

上述rsync+inotify脚本形式实时同步的缺陷是:利用inotify监控,有时会产生重复事件,或者同一个目录下多个文件的操作会产生多个事件,导致重复调用rsync命令。另外比如:vim文件时,inotify会监控到临时文件的事件,但这些事件相对于rsync来说是不应该被监控的。

sersync官网地址

sersync tar包

下载后移动到linux环境下 然后解压

tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz

解压好之后把文件移动到/usr/local/ (这里我下载在opt目录下)

[root@localhost opt]# mv GNU-Linux-x86/ /usr/local/sersync
[root@localhost opt]# ln -s /usr/local/sersync/sersync2 /usr/bin/ 

查看帮助文档
[root@localhost bin]# sersync2 -help
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序

修改xml文件

vim /usr/local/sersync/confxml.xml

如果监控目录没有需要创建以下

mkdir /data/www

25机器上执行

[root@localhost sersync]# sersync2 -dro /usr/local/sersync/confxml.xml 
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -d      run as a daemon
option: -r      rsync all the local files to the remote servers before the sersync work
option: -o      config xml name:  /usr/local/sersync/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost     host port: 8008
daemon start,sersync run behind the console 
use rsync password-file :
user is root
passwordfile is         /etc/rsyncd.password
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) 
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /data/www && rsync -artuz -R --delete ./ root@192.168.70.28::backup --password-file=/etc/rsyncd.password >/dev/null 2>&1 

测试

[root@localhost www]# ls
[root@localhost www]# echo "111" >test.txt

回到28机器上
[root@localhost backup]# ls
test.txt

我们还可以不用rsync --daemon 守护进程的方式,直接使用ssh方式,这样可以不设置rsync一系列配置文件,只需将设置好ssh-keygen免密登录即可。

修改xml文件

设置ssh免密:

ssh-keygen
ssh-copy-id root@192.168.70.28

关闭之前开启的守护进程

[root@localhost www]# pkill sersync2
[root@localhost www]# ps -ef | grep rsync
root      11823   1297  0 01:10 pts/0    00:00:00 grep --color=auto rsync

28机器关闭rsync服务
[root@localhost ~]# pkill rsync

测试:

[root@localhost www]# sersync2 -dro /usr/local/sersync/confxml.xml