翼度科技»论坛 云主机 LINUX 查看内容

rsync教程、rsync+inotufy、sersync

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
rsync教程、rsync+inotify实时同步

rsync介绍

英文全称为Remote synchronization服务软件
rsync是一个linux应用程序,可以实现全量以及增量本地或者是远程数据同步(拷贝)备份
使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步
rsync与scp:rsync可以增量复制
安装
  1. yum -y install rsync
复制代码
rsync使用
  1. 语法格式:
  2. //Rsync的命令格式常用的有以下三种:
  3.     rsync [OPTION]... SRC DEST
  4.     rsync [OPTION]... SRC [USER@]HOST:DEST
  5.     rsync [OPTION]... [USER@]HOST:SRC DEST
  6.    
  7. 常用参数:
  8. -a, --archive: 归档模式,表示以递归方式复制文件,并保持文件的所有属性,包括权限、时间戳等。
  9. -v, --verbose: 显示详细输出,即显示文件传输的进度和其他信息。
  10. -z, --compress: 在传输时进行压缩,可以减少网络带宽的使用。
  11. -r, --recursive: 递归复制文件夹及其内容。
  12. -u, --update: 只复制源文件中新于目标文件的文件。
  13. -c, --checksum: 使用校验和比较文件内容,而不是仅仅比较时间和大小。
  14. -h, --human-readable: 以人类可读的格式显示输出信息,例如文件大小以K、M、G等单位显示。
  15. -P, --progress: 显示传输进度。
  16. --delete: 删除目标目录中不存在于源目录中的文件。
  17. --exclude: 排除指定的文件或目录。
  18. --include:包括指定的文件或目录,即使在排除列表中。
  19. --exclude-from:从指定文件中读取排除列表。
  20. --include-from:从指定文件中读取包含列表。
  21. 常用命令:
  22. 1.将本地文件复制到远程主机:
  23. rsync [选项] 源文件/目录 远程主机:目标路径
  24. 2.将远程主机文件复制到本地:
  25. rsync [选项] 远程主机:源文件/目录 目标路径
  26. 3.同步本地两个目录:
  27. rsync [选项] 源目录/ 目标目录/
  28. 4.仅复制新文件或有变化的文件:
  29. rsync -u 源目录/ 目标目录/
  30. 5.递归复制整个目录树:
  31. rsync -r 源目录/ 目标目录/
  32. 6.删除目标目录中不存在于源目录中的文件:
  33. rsync -r --delete 源目录/ 目标目录/
  34. 7.显示详细信息:
  35. rsync -av 源目录/ 目标目录/
  36. 8.使用 SSH 连接远程主机:
  37. rsync -avz -e ssh 源目录/ 远程主机:目标路径
  38. 9.源文件中有删除时,同步删除以后的文件
  39. rsync -av --delete 源目录/ 目标目录/
复制代码
rsync定时同步(ssh方式)

可以通过crontab定时使用rsync命令
例如:定时备份机器2中的数据
  1. 准备1:机器2(25)/tmp/rsync/中需要定时备份的数据 同步到机器1(28)中/tmp/backup/目录下
  2. [ root@localhost test]# tree /tmp/rsync/
  3. /tmp/rsync/
  4. └── test
  5.     ├── test2.txt
  6.     └── test.txt
  7. 1 directory, 2 files
  8. 准备2:
  9. 因为rsync从远程主机上同步数据需要ssh密码验证,所需要先ssh-keygen
  10. ssh-keygen 一路回车 有y 填y
  11. ssh-copy-id root@192.168.70.25
  12. 测试一下 ssh root@192.168.70.25 可以发现直接连接上不需要密码验证
  13. 开始实验
  14. 创建crontab定时任务
  15. crontab -e
  16. * * * * * rsync -av root@192.168.70.25:/tmp/rsync/ /tmp/backup &>/dev/null
  17. 一分钟后 可以发现文件都同步过来了
  18. [root@localhost tmp]# tree backup/
  19. backup/
  20. └── test
  21.     ├── test2.txt
  22.     └── test.txt
  23. 1 directory, 2 files
复制代码
rsync+inotify实时同步

原理介绍

1.实时同步的方法

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

  • 要利用监控服务,监控同步数据服务器目录中信息的变化
  • 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上
inotify:
​        异步的文件系统监控机制,利用事件驱动机制,而无须通过诸如cron等轮询机制来获取时间。
​        linux内核从2.6.13起支持inotify,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件。
  1. grep -i inotify /boot/config-3.10.0-1160.el7.x86_64
  2. CONFIG_INOTIFY_USER=y
复制代码
实现inotify软件:

  • inotify-tools
  • sersync
  • lrsyncd
inotify+rsync使用方式

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

内核是否支持inotify
  1. 列出下面文件,说明服务器内核支持inotify
  2. [root@localhost ~]# ls -l /proc/sys/fs/inotify/
  3. total 0
  4. -rw-r--r-- 1 root root 0 Jul 29 11:05 max_queued_events
  5. -rw-r--r-- 1 root root 0 Jul 29 11:05 max_user_instances
  6. -rw-r--r-- 1 root root 0 Jul 29 11:05 max_user_watches
  7. [root@localhost ~]# cat /proc/sys/fs/inotify/max_queued_events
  8. 16384
  9. [root@localhost ~]# cat /proc/sys/fs/inotify/max_user_instances
  10. 128
  11. [root@localhost ~]# cat /proc/sys/fs/inotify/max_user_watches
  12. 8192
复制代码
inotify内核参数说明:

  • max_queued_events:inotify事件队列最大长度,如值太小会出现Event Queue Overflow错误,默认值:16384,生产环境建议调大,比如:327679
  • max_user_instances:每个用户创建inotify实例最大值,默认值:128
  • max_user_watches:可以监视的文件总数量(inotifywait 单进程),默认值:8192,建议调大
范例:
  1. 在/etc/sysctl.conf最下面添加
  2. [root@localhost ~]# vim /etc/sysctl.conf
  3. fs.inotify.max_queued_events=327679
  4. fs.inotify.max_user_watches=100000
  5. [root@localhost ~]# sysctl -p
  6. fs.inotify.max_queued_events = 327679
  7. fs.inotify.max_user_watches = 100000
复制代码
inotify-tools工具
安装inotify-tools:基于epel源
  1. yum install inotify-tools -y
复制代码
inotify-tools包主要工具:

  • inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,常用于实时同步的目录监控
  • inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计
inotifywait命令
  1. inotifywait [options] file1 [file2] [file3] [...]
复制代码
常用参数
  1. -m –monitor 始终保持监听状态,默认触发事件即退出
  2. -r –recursive 递归查询目录
  3. -d –daemon 跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。
  4. -q –quiet 减少不必要的输出(只打印事件信息)
  5. -s –syslog 输出错误信息到系统日志
  6. -e –event 定义监控的事件,可用参数:
  7.     open   打开文件
  8.     access 访问文件
  9.     modify 修改文件
  10.     delete 删除文件
  11.     create 新建文件
  12.     attrib 属性变更
  13. --timefmt 时间格式
  14.     %y年 %m月 %d日 %H小时 %M分钟
  15. --format 输出格式   
  16.     %w 表示发生事件的目录
  17.     %f 表示发生事件的文件
  18.     %e 表示发生的事件
  19.     %Xe 事件以“X”分隔
  20.     %T 使用由–timefmt定义的时间格式
  21. --exclude <pattern> 指定要排除监控的文件/目录
复制代码
可监控事件
  1. access        访问,读取文件。
  2. modify        修改,文件内容被修改。
  3. attrib        属性,文件元数据被修改。
  4. move        移动,对文件进行移动操作。
  5. create        创建,生成新文件
  6. open        打开,对文件进行打开操作。
  7. close        关闭,对文件进行关闭操作。
  8. delete        删除,文件被删除。
复制代码
示例
  1. [root@localhost yum.repos.d]# inotifywait -mr --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %;e" /tmp/rsync/
  2. Setting up watches.  Beware: since -r was given, this may take a while!
  3. Watches established.
  4. 2023-07-29 14:12:01 /tmp/rsync/ event: OPEN;ISDIR
  5. 2023-07-29 14:12:01 /tmp/rsync/ event: CLOSE_NOWRITE;CLOSE;ISDIR
  6. 筛选一些事件,对于"打开" "查看"一些事件不监控
  7. [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/
  8. 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端口是否开启
  1. [root@localhost etc]# rsync --daemon
  2. [root@localhost etc]# netstat -tunlp
  3. tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      3599/rsync      
  4. 再写配置rsyncd.conf文件
  5. vim /etc/rsyncd.conf
  6. 在最下面添加
  7. [backup]
  8. path = /tmp/backup/
  9. read only = no
复制代码
格式:
  1. rsync daemon:
  2. pull:
  3. rsync [OPTION]... [USER@]HOST::SRC DEST
  4. push:
  5. rsync [OPTION...] SRC... [USER@]HOST::[DEST]
复制代码
测试:
  1. [root@localhost yum.repos.d]# rsync /etc/networks root@192.168.70.28::backup
  2. rsync: mkstemp "/.networks.hTs4QS" (in backup) failed: Permission denied (13)
  3. rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
  4. 报错了,需要在28机器上指定目录给nobody权限,默认用户以nobody访问此目录
  5. setfacl -m u:nobody:rwx /tmp/backup
  6. 再次在25机器上执行
  7. rsync /etc/networks root@192.168.70.28::backup
  8. 可以发现成功了 在28机器上查看
  9. [root@localhost backup]# ll
  10. total 4
  11. -rw-r--r-- 1 nobody nobody 58 Jul 29 16:18 networks
  12. drwxr-xr-x 2 root   root   22 Jul 29 14:18 test
复制代码
其实我们在这里可以发现这种没有密码验证的方式传输文件是不安全的,我们可以把rsyncd.conf文件以标准的形式编写
  1. vim /etc/rsyncd.conf
  2. motd file = /etc/rsyncd.motd
  3. transfer logging = yes
  4. log file =/var/log/rsyncd.log
  5. pid file =/var/run/rsyncd.pid
  6. lock file =/var/run/rsync.lock
  7. port = 873
  8. uid = root
  9. gid = root
  10. reverse lookup = no
  11. ignore errors
  12. use chroot = no
  13. max connections = 10
  14. [backup]
  15. comment = backup dir #描述
  16. path = /tmp/backup
  17. read only = no
  18. auth users = root,zhangsan #只有这些账号能访问backup目录
  19. secrets file = /etc/rsyncd.password #这些账号的密码
  20. #hosts allow=192.168.0.0/255.255.255.0
  21. #hosts deny=*
  22. list= false
复制代码
编写rsyncd.password 这个文件名需要跟上述配置文件secrets file = /etc/rsyncd.password 一致!
  1. vim rsyncd.password
  2. root:123456
  3. zhangsan:123456
复制代码
修改属性 600 除了root其他人不能查看
  1. chmod 600 /etc/rsyncd.password
复制代码
再测试:
  1. [root@localhost rsync]# rsync -av /etc/group root@192.168.70.28::backup
  2. Password:
  3. 输入root密码即可
复制代码
使用--password-file=FILE 命令 可以以非交互的方式
注意:此步骤是在25机器上创建,之前几个步骤都是在28机器上 (1.内容取决于你等下要用哪个用户的密码  2.路径可以不一致)
  1. echo "123456" > /etc/rsyncd.password
复制代码
测试:
  1. [root@localhost rsync]# rsync -av --password-file=/etc/rsyncd.password /etc/passwd root@192.168.70.28::backup
  2. sending incremental file list
  3. passwd
  4. sent 642 bytes  received 35 bytes  1,354.00 bytes/sec
  5. total size is 552  speedup is 0.82
复制代码
可以看到不用交互式输入密码即可完成文件传输
rsync+inotify+shell 脚本实现实时数据同步

先要确保两主机初始数据处于同步状态(需要被同步数据的机器装好inotify rsync [25机器],同步数据的机器装好rsync并配置好文件 [28机器]),此脚本实现后续的数据同步
  1. #!/bin/bash
  2. SRC='/tmp/backup'
  3. DEST='root@192.168.70.28::backup'
  4. 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
  5.         FILEPATH=${DIR}${FILE}
  6.         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
  7. done
复制代码
sersync

上述rsync+inotify脚本形式实时同步的缺陷是:利用inotify监控,有时会产生重复事件,或者同一个目录下多个文件的操作会产生多个事件,导致重复调用rsync命令。另外比如:vim文件时,inotify会监控到临时文件的事件,但这些事件相对于rsync来说是不应该被监控的。
sersync官网地址
sersync tar包
下载后移动到linux环境下 然后解压
  1. tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
复制代码
解压好之后把文件移动到/usr/local/ (这里我下载在opt目录下)
  1. [root@localhost opt]# mv GNU-Linux-x86/ /usr/local/sersync
  2. [root@localhost opt]# ln -s /usr/local/sersync/sersync2 /usr/bin/
  3. 查看帮助文档
  4. [root@localhost bin]# sersync2 -help
  5. set the system param
  6. execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
  7. execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
  8. parse the command param
  9. _______________________________________________________
  10. 参数-d:启用守护进程模式
  11. 参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
  12. c参数-n: 指定开启守护线程的数量,默认为10个
  13. 参数-o:指定配置文件,默认使用confxml.xml文件
  14. 参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
  15. 参数-m:单独启用其他模块,使用 -m socket 开启socket模块
  16. 参数-m:单独启用其他模块,使用 -m http 开启http模块
  17. 不加-m参数,则默认执行同步程序
复制代码
修改xml文件
  1. vim /usr/local/sersync/confxml.xml
复制代码

如果监控目录没有需要创建以下
  1. mkdir /data/www
复制代码
25机器上执行
  1. [root@localhost sersync]# sersync2 -dro /usr/local/sersync/confxml.xml
  2. set the system param
  3. execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
  4. execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
  5. parse the command param
  6. option: -d      run as a daemon
  7. option: -r      rsync all the local files to the remote servers before the sersync work
  8. option: -o      config xml name:  /usr/local/sersync/confxml.xml
  9. daemon thread num: 10
  10. parse xml config file
  11. host ip : localhost     host port: 8008
  12. daemon start,sersync run behind the console
  13. use rsync password-file :
  14. user is root
  15. passwordfile is         /etc/rsyncd.password
  16. config xml parse success
  17. please set /etc/rsyncd.conf max connections=0 Manually
  18. sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
  19. Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
  20. please according your cpu ,use -n param to adjust the cpu rate
  21. ------------------------------------------
  22. rsync the directory recursivly to the remote servers once
  23. working please wait...
  24. execute command: cd /data/www && rsync -artuz -R --delete ./ root@192.168.70.28::backup --password-file=/etc/rsyncd.password >/dev/null 2>&1
复制代码
测试
  1. [root@localhost www]# ls
  2. [root@localhost www]# echo "111" >test.txt
  3. 回到28机器上
  4. [root@localhost backup]# ls
  5. test.txt
复制代码
我们还可以不用rsync --daemon 守护进程的方式,直接使用ssh方式,这样可以不设置rsync一系列配置文件,只需将设置好ssh-keygen免密登录即可。
修改xml文件

设置ssh免密:
  1. ssh-keygen
  2. ssh-copy-id root@192.168.70.28
复制代码
关闭之前开启的守护进程
  1. [root@localhost www]# pkill sersync2
  2. [root@localhost www]# ps -ef | grep rsync
  3. root      11823   1297  0 01:10 pts/0    00:00:00 grep --color=auto rsync
  4. 28机器关闭rsync服务
  5. [root@localhost ~]# pkill rsync
复制代码
测试:
  1. [root@localhost www]# sersync2 -dro /usr/local/sersync/confxml.xml
复制代码
来源:https://www.cnblogs.com/xuxuxuxuxu/p/17592456.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具