大点干!早点散----------rsync+inotify实现远程实时同步

时间:2022-07-24
本文章向大家介绍大点干!早点散----------rsync+inotify实现远程实时同步,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

文章目录

  • 一、rsync概述
  • 二、rsync特性
  • 三、rsync原理
    • 1、运行模式和端口
    • 2、四个名字的解释
    • 3、数据同步方式
      • (1)推push
      • (2)拉pull
    • 四、命令参数
  • 五、具体rsync备份数据
    • 1、服务端---修改配置文件 :/etc/rsyncd.conf
    • 2、服务端--创建于用户密码文件
    • 3、服务端--启动rsync服务
    • 4、服务端--在 /var/www/html目录中,新建文件
    • 5、客户端--#实现rsyns同步
    • 6、客户端---配置rsync的免密同步
    • 7、实时同步
      • (1)服务端--将只读选项关闭
      • (2)客户端--配置监控的参数
      • (3)客户端--安装inotify-tools辅助工具
      • (4)客户端--配置自动监控同步脚本
      • (5)验证

一、rsync概述

rsync是linux系统下的数据镜像备份工具,使用快速增量备份工具remote sync可以远程同步,可以在不同主机之间进行同步,可以实现全量备份与增量备份,保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适合用于架构集中式的备份或异地备份等应用。同时rsync支持本地复制,或者与其他ssh、rsync主机同步。

二、rsync特性

1)可以镜像保存整个目录树和文件系统 2)可以很容易做到保持原来文件的权限、时间、软硬链接等等。 3)无须特殊权限即可安装 4)快速:第一次同步时rsync复制全部内容,但在下一次值传输修改过的内容 5)压缩传输:rysnc在传输的过程中可以实行压缩及解压缩操作,可以使用更少的带宽 6)安全:可以使用scp、ssh等方式来进行文件传输 7)支持匿名传输,以方便进行网站镜像 8)选择性保持:符号链接、硬链接、文件属性、权限、时间等

三、rsync原理

1、运行模式和端口

1)采用C/S模式(实际上是一个点到点的传输,直接使用rsync命令即可完成) 2)rsync监听的端口是:873

2、四个名字的解释

1)发起端:负责发起rsync同步操作的客户端叫做发起端。通知服务器我要备份你的数据 2)备份源:负责响应来自客户端rsync同步操作的服务器叫做备份源,需要备份的服务器 3)服务端:运行rsyncd服务,一般来说,需要备份的服务器 4)客户端:存放备份数据。

3、数据同步方式

(1)推push

一台主机负责吧数据传送给其他主机,服务器开销很大,比较适合后端服务器少的情况 推:目的主机配置为rsync服务器,源主机周期性的使用rysnc命令把要同步的目录推过去(需要备份的机器是客户端,存储备份的机器是服务端)

(2)拉pull

所有主机定时去找一台主机拉数据,可能就会导致数据缓慢 拉:源主机配置为rysnc服务器,目的主机周期性的使用rync命令把要同步的目录拉过来(需要备份的机器是服务端,存储备份的机器是客户端)

四、命令参数

(1) -a:–archive archive mode 权限保存模式,相当于 -rlptgoD 参数,存档,递归,保持属性等。 (2) -r:–recursive 复制所有下面的资料,递归处理。 (3) -p:–perms 保留档案权限,文件原有属性。 (4) -t:–times 保留时间点,文件原有时间。 (5) -g:–group 保留原有属组。 (6) -o:–owner 保留档案所有者(root only)。 (7) -D:–devices 保留device资讯(root only)。 (8) -l:–links 复制所有的连接,拷贝连接文件。 (9) -z:–compress 压缩模式,当资料在传送到目的端进行档案压缩。 (10) -H:–hard-links 保留硬链接文件。 (11) -A:–acls 保留ACL属性文件,需要配合–perms。 (12) -P:-P参数和 --partial --progress 相同,只是为了把参数简单化,表示传进度。 (13) --version:输出rsync版本。 (14) -v:–verbose 复杂的输出信息。 (15) -u:–update 仅仅进行更新,也就是跳过已经存在的目标位置,并且文件时间要晚于要备份的文件,不覆盖新的文件。 (16) --port=PORT:定义rsyncd(daemon)要运行的port(预设为tcp 873)。 (17) --delete:删除那些目标位置有的文件而备份源没有的文件。 (18) --password-file=FILE :从 指定密码文件中获取密码。 (19) --bwlimit=KBPS:限制 I/O 带宽。 (20) --filter “-filename”:需要过滤的文件。 (21) --exclude=filname:需要过滤的文件。 (22) --progress:显示备份过程。 注释:通常常用的选项 –avz -z的命令一般用在小文件进行压缩,数据量比较大的文件在传输的过程中就比较慢,如果再压缩传输会更加慢。所以根据需求来选择是否需要加这个参数

五、具体rsync备份数据

rsync 是系统自带的,无需额外安装,如果是最小化安装的话,用 yum安装一下即可。

1、服务端—修改配置文件 :/etc/rsyncd.conf

[root@master yum.repos.d]# vi /etc/rsyncd.conf 
 uid = nobody	
 gid = nobody	
 use chroot = yes                           '//禁锢在源目录'
 address = 192.168.233.131                   '//监听地址'
 port 873                                   '//监听端口号'
 log file = /var/log/rsyncd.log            '//日志文件位置'
 pid file = /var/run/rsyncd.pid           '//存放进程ID的文件位置'
 hosts allow = 192.168.233.133            '//允许访问的客户机地址'
[wwwroot]                                       '//共享模块名称'
 path = /var/www/html                       '//源目录的实际路径'
 comment = Document Root of www.51xit.top
 read only =yes                                 '//是否只读'
 dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z          '//同步时不在压缩的文件类型'
 auth users = lisi                            '//授权账户'
 secrets file = /etc/rsyncd_users.db                '//存放账户信息的数据文件'

2、服务端–创建于用户密码文件

配置文件制定的路径创建

[root@master yum.repos.d]# rsync --daemon	'//启动rsync服务,如果要停止这个服务请使用kill $(cat /var/run/rsyncd.pid)'
[root@master yum.repos.d]# netstat -ntap |grep rsync
tcp        0      0 192.168.233.131:873     0.0.0.0:*               LISTEN      4371/rsync    

3、服务端–启动rsync服务

如果要停止服务 要将pid文件删除 在/var/run/rsyncd.pid

[root@master yum.repos.d]# rsync --daemon	'//启动rsync服务,如果要停止这个服务请使用kill $(cat /var/run/rsyncd.pid)'
[root@master yum.repos.d]# netstat -ntap |grep rsync
tcp        0      0 192.168.233.131:873     0.0.0.0:*               LISTEN      4371/rsync    

4、服务端–在 /var/www/html目录中,新建文件

[root@master yum.repos.d]# cd /var/www/html/
[root@master html]# ls
[root@master html]# touch 111.html
[root@master html]# touch 222.html
[root@master html]# ls
111.html  222.html
    '//创建完成后,我们稍后到客户机上操作,进行验证'

5、客户端–#实现rsyns同步

查看rsync的软件是否安装

[root@localhost ~]# rpm -q rsync
rsync-3.1.2-10.el7.x86_64
[root@slave opt]# mkdir myweb
'//方法一'
[root@slave opt]# rsync -avzH --delete lisi@192.168.233.131::wwwroot /opt/myweb
Password: 
receiving incremental file list
./
111.html
222.html

sent 98 bytes  received 207 bytes  87.14 bytes/sec
total size is 0  speedup is 0.00
[root@slave opt]# ls /opt/myweb/
111.html  222.html

'//方法二'
[root@slave opt]# rsync -avz rsync://lisi@192.168.233.131/wwwroot /root
Password: 
receiving incremental file list
./
111.html
222.html

sent 98 bytes  received 207 bytes  87.14 bytes/sec
total size is 0  speedup is 0.00

6、客户端—配置rsync的免密同步

为了写脚本能方便一些,使用免密登录

[root@slave opt]# vi /etc/server.pass	'//创建密码文件'
lisi123
[root@slave opt]# chmod 600 /etc/server.pass	'//给密码文件权限'
[root@slave opt]# rm -rf myweb/*	'//先删除/opt/myweb目录下的内容用来测试
[root@slave opt]# ls myweb/
[root@slave opt]# rsync -az --delete --password-file=/etc/server.pass lisi@192.168.233.131::wwwroot /opt/myweb	'//指定刚刚创建的密码文件,发现已经不需要输入密码了'
[root@slave opt]# ls myweb/
111.html  222.html

可以创建周期性任务进行同步源服务器

[root@slave opt]# crontab -e
30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass lisi@192.168.233.131::wwwroot /opt/myweb/	'//每天晚上10点半对服务器网站目录更新一次'
[root@slave opt]# systemctl restart crond
[root@slave opt]# systemctl enable crond

7、实时同步

实现思路如下

(1)服务端–将只读选项关闭

[root@master html]# vi /etc/rsyncd.conf 
read only = no '//改为no'
[root@master html]# kill `cat /var/run/rsyncd.pid`	'//关闭rsync服务'
[root@master html]# netstat -ntap |grep rsync
[root@master html]# rsync --daemon	'//开启rsync服务'
[root@master html]# netstat -ntap |grep rsync
tcp        0      0 192.168.233.131:873     0.0.0.0:*               LISTEN      88302/rsync         
[root@master html]# chmod 777 /var/www/html

(2)客户端–配置监控的参数

[root@slave opt]# cat /proc/sys/fs/inotify/max_queued_events 	'//监控队列大小'
16384	
[root@slave opt]# cat /proc/sys/fs/inotify/max_user_instances	'//最多监控实例数'
128	
[root@slave opt]# cat /proc/sys/fs/inotify/max_user_watches 	'//每个实例最多监控文件数'
8192
[root@slave opt]# vi /etc/sysctl.conf
[root@slave opt]# sysctl -p
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576

(3)客户端–安装inotify-tools辅助工具

[root@slave opt]# tar zxf inotify-tools-3.14.tar.gz 
[root@slave opt]# cd inotify-tools-3.14/
[root@slave inotify-tools-3.14]# yum install gcc gcc-c++ -y
[root@slave inotify-tools-3.14]# ./configure 
[root@slave inotify-tools-3.14]# make && make install

重新打开一个终端

[root@slave ~]# inotifywait -mrq -e modify,create,move,delete  /opt/myweb	'//运行持续监控监控'
inotifywait:用于持续监控,实时输出结果
inotifywatch:用于短期监控,任务完成后再出结果

(4)客户端–配置自动监控同步脚本

inotifywait 监控软件 -m, 持续进行监控 -r, 递归监控所有子对象 -q , 简化输出信息, -e ,指定要监控哪些事件类型

modify 修改 create 创建 move 移动 delete 删除

[root@slave inotify-tools-3.14]# vim /opt/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete /var/www/html/"
RSYNC_CMD="rsync -avzH --delete --password-file=/etc/server.pass /var/www/html/ lisi@192.168.233.133::wwwroot/"
#读取输出的监控记
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
 do
#如果rsync未在执行,则立即启动
   if [ $(pgrep rsync | wc -l) -le 0 ]; then
      $RSYNC_CMD
   fi
done

[root@slave inotify-tools-3.14]# chmod 777 /opt/myweb/
[root@slave inotify-tools-3.14]# chmod +x /opt/inotify.sh 
[root@slave inotify-tools-3.14]# cd ..
[root@slave opt]# ./inotify.sh 	'//执行脚本进行监控'

(5)验证

[root@slave myweb]# touch 111.html	'//客户机创建文件,删除文件也可以同步成功'
[root@master html]# ll	'//服务端查看'
总用量 0
-rw-r--r--. 1 root   root   0 3月  24 09:22 111.html	'//同步成功'