rsync和inotify远程同步

rsync和inotify远程同步

1.什么是rsync和inotify

  • rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。
  • Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。

2.inotify产生背景和详细介绍

  • 产生背景
    • 系统治理就像日常生活一样。就像刷牙和吃蔬菜一样,日常的维护能保持机器的良好状态。您必须定期清空废物,比如临时文件或无用的日志文件,以及花时间填写表单、回复电话、更新和监控进程等。幸好自动化 shell 脚本、使用 Nagios 等工具进行监控、通过常见的 cron 进行任务调度可以减轻这个负担。
    • 但稀奇的是,这些工具没有一个具有响应性。当然,您可以安排一个频繁运行的 cron 任务来监控条件,但这样繁忙的轮询 — 消耗大量资源并且具有不确定性 — 并不是很理想。例如,假如您必须监控输入数据的几个 Transfer Protocol(FTP)收存箱,您可能要通过 find 命令扫描每个目标目录,列举新的内容。然而,尽管这个操作看起来并没有什么害处,但每个调用都产生一个新的 shell 和 find 命令,这需要许多系统调用来打开目录,然后扫描目录,等等。这会造成过于频繁的或大量的轮询任务(更糟糕的是,繁忙的轮询并不总是很好。想象一下一个文件系统浏览器,比如 Mac OS X 的 Finder,轮询更新时需要的大量资源及其复杂性)。
    • 那么,管理员应该怎么办呢?令人兴奋的是,您可以再次求助于可以信赖的计算机
  • 详细介绍
    • Inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。您还可以跟踪活动的源头和目标等细节。
    • 使用 inotify 很简单:创建一个文件描述符,附加一个或多个监视器(一个监视器 是一个路径和一组事件),然后使用 read 方法从描述符获取事件。read 并不会用光整个周期,它在事件发生之前是被阻塞的。
    • 更好的是,因为 inotify 通过传统的文件描述符工作,您可以利用传统的 select 系统调用来被动地监控监视器和许多其他输入源。两种方法 — 阻塞文件描述符和使用 select— 都避免了繁忙轮询
    • 现在,深入了解 inotify,写一些 C 代码,然后看看一组命令行工具,可以构建并使用它们将命令和脚本附加到文件系统事件。Inotify 不会在中途失去控制,但它可以运行 cat 和 wget,并且在必要时严格执行。
    • 要使用 inotify,必须具备一台带有 2.6.13 或更新内核的 Linux 机器(以前的 Linux 内核版本使用更低级的文件监控器dnotify)。如果不知道内核的版本,请转到 shell,输入 uname -a:% uname -a
    • Linux ubuntu-desktop 2.6.24-19-generic #1 SMP … i686 GNU/Linux
    • 如果列出的内核版本不低于 2.6.13,系统就支持 inotify。还可以检查机器的 /usr/include/sys/inotify.h 文件。如果它存在,表明内核支持 inotify。
    • 注意:FreeBSD 和 Mac OS X 提供一个类似于 inotify 的 kqueue。在 FreeBSD 机器上输入 man 2 kqueue 获取更多信息。

3.rsync特性

它的特性如下:

  • 可以镜像保存整个目录树和文件系统
  • 可以很容易做到保持原来文件的权限、时间、软硬链接等等。
  • 无须特殊权限即可安装。
  • 快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。
  • 安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
  • 支持匿名传输,以方便进行网站镜像。

4.操作流程

  • 服务器端启动
    • /usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
    • 可能需要root权限运行.
    • /etc/rsyncd/rsyncd.conf 是你刚才编辑的rsyncd.conf的位置.
    • 也可以在/etc/rc.d/rc.local里加入让系统自动启动等.
  • 客户端同步
    • rsync -参数 用户名@同步服务器的IP::rsyncd.conf中那个方括号里的内容 本地存放路径 如: rsync -avzP [email protected]::nemo /backup
    • 说明:
      • -a 参数,相当于-rlptgoD
      • -r 是递归
      • -l 是链接文件 , 意思是拷贝链接文件
      • -p 表示保持文件原有权限
      • -t 保持文件原有时间
      • -g 保持文件原有用户组
      • -o 保持文件原有属主
      • -D 相当于块设备文件
      • -z 传输时压缩
      • -P 传输进度;
      • -v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档

5.参数详解

  • -v, --verbose 详细模式输出
  • -q, --quiet 精简输出模式
  • -c, --checksum 打开校验开关,强制对文件传输进行校验
  • -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
  • -r, --recursive 对子目录以递归模式处理
  • -R, --relative 使用相对路径信息
  • -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用–suffix选项来指定不同的备份文件前缀。
  • –backup-dir 将备份文件(如~filename)存放在在目录下。
  • -suffix=SUFFIX 定义备份文件前缀
  • -u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
  • -l, --links 保留软链结
  • -L, --copy-links 像对待常规文件一样处理软链接
  • –copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链接
  • –safe-links 忽略指向SRC路径目录树以外的链接
  • -H, --hard-links 保留硬链接
  • -p, --perms 保持文件权限
  • -o, --owner 保持文件属主信息
  • -g, --group 保持文件属组信息
  • -D, --devices 保持设备文件信息
  • -t, --times 保持文件时间信息
  • -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
  • -n, --dry-run显示哪些文件将被传输
  • -W, --whole-file 拷贝文件,不进行增量检测
  • -x, --one-file-system 不要跨越文件系统边界
  • -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
  • -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
  • –rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
  • -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
  • –existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
  • –delete 删除那些DST中SRC没有的文件
  • –delete-excluded 同样删除接收端那些被该选项指定排除的文件
  • –delete-after 传输结束以后再删除
  • –ignore-errors 即使出现IO错误也进行删除
  • –max-delete=NUM 最多删除NUM个文件
  • –partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
  • –force 强制删除目录,即使不为空
  • –numeric-ids 不将数字的用户和组ID匹配为用户名和组名
  • –timeout=TIME IP超时时间,单位为秒
  • -I, --ignore-times 不跳过那些有同样的时间和长度的文件
  • –size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
  • –modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
  • -T --temp-dir=DIR 在DIR中创建临时文件
  • –compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
  • -P 等同于 --partial
  • –progress 显示备份过程
  • -z, --compress 对备份的文件在传输时进行压缩处理
  • –exclude=PATTERN 指定排除不需要传输的文件模式
  • –include=PATTERN 指定不排除而需要传输的文件模式
  • –exclude-from=FILE 排除FILE中指定模式的文件
  • –include-from=FILE 不排除FILE指定模式匹配的文件
  • –version 打印版本信息
  • –address 绑定到特定的地址
  • –config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
  • –port=PORT 指定其他的rsync服务端口
  • –blocking-io 对远程shell使用阻塞IO
  • -stats 给出某些文件的传输状态
  • –progress 在传输时显示传输过程
  • –log-format=formAT 指定日志文件格式
  • –password-file=FILE 从FILE中得到密码
  • –bwlimit=KBPS 限制I/O带宽,KBytes per second
  • -h, --help 显示帮助信息

6.rsync服务搭建

  • 实验环境
    • VMware Workstation
    • centos7(master),IP地址:192.168.73.200
    • centos7(slave),IP地址:192.168.73.201
  • 实验拓扑图

在这里插入图片描述

  • 修改IP地址
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static	'//改为static'
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=0f49a612-24ff-4410-8185-c13a60922cdc
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.73.200	'//添加下面三个IP地址'
NETMASK=255.255.255.0
GATEWAY=192.168.73.2
DNS1=8.8.8.8
[root@localhost ~]# systemctl restart network
'//另一台IP地址修改为192.168.73.201'
  • 关闭防火墙和安全功能
[root@localhost ~]# systemctl stop firewalld	'//关闭防火墙'
[root@localhost ~]# systemctl disable firewalld	'//禁止防火墙开机自启'
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0	'//关闭核心防护'
[root@localhost ~]# vi /etc/sysconfig/selinux 	'//禁止核心防护开启自启'
SELINUX=disabled
  • 修改主机名和主机映射文件
[root@localhost ~]# hostnamectl set-hostname slave
[root@localhost ~]# su
[root@slave ~]# vi /etc/hosts
192.168.73.201 slave
192.168.73.200 master

[root@slave ~]# ping master
'//master主机操作相同,不在赘述'
  • 配置本地yum源
[root@slave ~]# cd /etc/yum.repos.d/
[root@slave yum.repos.d]# mkdir bak
[root@slave yum.repos.d]# mv * bak	'//备份原有yum文件'
mv: 无法将目录"bak" 移动至自身的子目录"bak/bak" 下
[root@slave yum.repos.d]# vi local.repo	'//创建本地yum文件'
[mnt]
name=mnt
baseurl=file:///mnt
gpgcheck=0
enbaled=1
[root@slave yum.repos.d]# mount /dev/sr0 /mnt	'//手动挂载光盘'
mount: /dev/sr0 写保护,将以只读方式挂载
[root@slave yum.repos.d]# vi /etc/fstab	'//设置自动挂载'
/dev/sr0 /mnt   iso9660 defaults        0 0
[root@slave yum.repos.d]# yum clean all	'//清理缓存'
[root@slave yum.repos.d]# yum makecache	'//创建缓存'
  • 配置rsync源服务器
[root@master yum.repos.d]# yum install httpd rsync -y
[root@master yum.repos.d]# vi /etc/rsyncd.conf 
 uid = nobody	
 gid = nobody	
 use chroot = yes                           '//禁锢在源目录'
 address = 192.168.73.200                   '//监听地址'
 port 873                                   '//监听端口号'
 log file = /var/log/rsyncd.log            '//日志文件位置'
 pid file = /var/run/rsyncd.pid           '//存放进程ID的文件位置'
 hosts allow = 192.168.73.201            '//允许访问的客户机地址'
[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                '//存放账户信息的数据文件'
[root@master yum.repos.d]# vi /etc/rsyncd_users.db	'//创建存放账户信息的数据文件'
lisi:lisi123	'//采用“用户名:密码”的记录格式,每行一个用户记录独立的账号数据,不依赖于系统账号'
[root@master yum.repos.d]# chmod 600 /etc/rsyncd_users.db '//给数据文件设置权限'
[root@master yum.repos.d]# ll -ld /var/www/html/	'//查看下源目录的文件权限'
drwxr-xr-x. 2 root root 6 8月   4 2017 /var/www/html/
  • 启动rsync服务
[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.73.200:873     0.0.0.0:*               LISTEN      4371/rsync    
  • 在/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
    '//创建完成后,我们稍后到客户机上操作,进行验证'
  • 客户端配置
[root@slave yum.repos.d]# yum install -y rsync
命令格式:rsync [选项] 原始位置 目标位置
[root@slave yum.repos.d]# cd /opt
[root@slave opt]# ls
rh
[root@slave opt]# rsync /etc/fstab /opt	'//将本机的/etc/fstab文件同步到本机/opt下'
[root@slave opt]# ls
fstab  rh
[root@slave opt]# rsync -rl /boot/grub /opt	'//将本机的/boot/grub目录同步到本机/opt下'
[root@slave opt]# ls
fstab  grub  rh
[root@slave opt]# mkdir myweb
'//方法一'
[root@slave opt]# rsync -avzH --delete [email protected]::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://[email protected]/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

7.rsync源的免密交互处理

  • 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 [email protected]::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 [email protected]::wwwroot /opt/myweb/	'//每天晚上10点半对服务器网站目录更新一次'
[root@slave opt]# systemctl restart crond
[root@slave opt]# systemctl enable crond

8.rsync实时同步

  • 服务器配置
[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.73.200:873     0.0.0.0:*               LISTEN      88302/rsync         
[root@master html]# chmod 777 /var/www/html
  • 客户端配置
[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
  • 安装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:用于短期监控,任务完成后再出结果
  • 服务端编辑脚本并启动
[root@slave inotify-tools-3.14]# vim /opt/inotify.sh
[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 	'//执行脚本进行监控'
  • 重新打开终端,测试rsync上传同步
[root@slave myweb]# touch 111.html	'//客户机创建文件,删除文件也可以同步成功'
[root@master html]# ll	'//服务端查看'
总用量 0
-rw-r--r--. 1 root   root   0 3月  24 09:22 111.html	'//同步成功'
'//查看刚刚运行的脚本监控'
发布了129 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/double_happy111/article/details/105326098