rsync教程、rsync+inotufy、sersync

  • rsync教程、rsync+inotufy、sersync已关闭评论
  • 222 次浏览
  • A+
所属分类:linux技术
摘要

英文全称为Remote synchronization服务软件rsync是一个linux应用程序,可以实现全量以及增量的本地或者是远程的数据同步(拷贝)备份


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 

rsync教程、rsync+inotufy、sersync

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

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文件

rsync教程、rsync+inotufy、sersync

设置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