rsync

rsync是lunix系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。

优点:

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

缺点:

1)同步数据,需要扫描所有文件进行对比,才进行差量传输。如果文件数量达到百万甚至千万级,扫描文件对比文件将非常耗时,降低了rsync效率。
2)rsync不能实时地区监测、同步数据。虽然可以通过守护进程方式触发同步,但两次动作间有时间差,导致数据不一致,无法应对出现故障时完全恢复数据。

rsync的4种工作模式

1) 拷贝本地文件 rsync -a /data /backup#
2)从远程rsync服务器中拷贝文件到本地机:rsync -av zroot@192.168.4.7:/databack /opt
3) 从本地机器拷贝文件到远程rsync服务器中 :rsync -av /opt root@192.168.4.7:/databack
4)列出远程机的文件列表:rsync -v root@192.168.4.7:/databack

rsync选项描述

-n:测试同步过程,不做实际修改
–delete:删除目标文件夹内多余的文档
-a:归档模式,相当于-rlptgoD
-v:显示详细操作信息
-z:传输过程中启用压缩/解压

inotify

inotify 是Linux 的一个内核特性,是一种强大的、细粒度的、异步的文件系统事件监控机制。它可以监控文件系统中的添加、删除、修改、移 动等各种细微事件,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。

rsync+inotify

rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了rsync同步数据的实时性问题。

inotifywait监控

– inotifywait [选项] 目标文件夹
• 常用命令选项
– -m,持续监控(捕获一个事件后不退出)
– -r,递归监控、包括子目录及文件
– -q,减少屏幕输出信息
– -e,指定监视的 modify、move、create、delete、attrib 等事件类别

本例要求为两台Web服务器svr7、pc207的网页文档目录配置镜像同步,主要基于inotifywait监控技术实现实时触发操作,需要完成下列任务:
---------以 svr7 为发起方,原始目录为 /var/www/html/
---------以 pc207 为同步目标,基于SSH免密验证
编写 inotify+rsync 同步脚本,验证实时同步效果

一 :为主机svr7、pc207部署同步目录
1 确认svr7的目录内容(向目录提供测试文件)

[root@svr7 ~]# yum  -y  install  httpd
[root@svr7 ~]# touch  /var/www/html/text
[root@svr7 ~]# ls /var/www/html
text

2 确认pc207的目录内容

[root@pc207 ~]# yum -y install httpd
[root@pc207 ~]# ls  /var/www/html     //pc207的此目录下为空

二 :为svr7配置到pc207的SSH密钥对验证,实现免密码交互
1 检查当前用户是否已经有可用的SSH密钥对文件

[root@svr7 ~]# ls  .ssh/id_*
/root/.ssh/id_rsa  /root/.ssh/id_rsa.pub

如果找不到id_rsa、id_rsa.pub密钥对文件,则需要执行下列操作创建

[root@svr7 ~]# ssh-keygen                      (# 生成公钥,私钥对)
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):    //按回车,确认存放位
Enter passphrase (empty for no passphrase):               //按回车,确认不要密码
Enter same passphrase again:                                      //再次按回车,确认
Your identification has been saved in yes.
Your public key has been saved in yes[root@svr7 ~]#.pub.
The key fingerprint is:
SHA256:Bfz6TOoAEJ0RPQf/YASomPasiJspRe/n5ytO92IhbhE root@svr7.example.com
The key's randomart image is:
+---[RSA 2048]----+
|  ..o*o+o        |
|   .+ ooo.       |
| o..   o+..      |
|o.o.  E. +.      |
|..o..  .S..      |
|  .o..o o .      |
|o... .oo.*       |
|++  ..=o=.o      |
|=.   =o*+o.      |
+----[SHA256]-----+

[root@pc207 ~]# ls  .ssh               // 查看PC207上的远程管理文件  
 known_hosts

2 将当前用户的SSH公钥部署到远程主机

[root@svr7 ~]# ssh-copy-id  root@192.168.4.207
[root@pc207 ~]# ls  .ssh   #当svr7将公钥传递给pc207后,/root/.ssh文件内多了公钥authorized_keys
authorized_keys  known_hosts

3 验证免密码登录效果

[root@svr7 ~]# ssh  root@192.168.4.207
Last login: Mon Oct  8 18:42:28 2018 from 192.168.4.254
[root@pc207 ~]#                          //确认已免密码连入远程主机
[root@pc207 ~]# exit                   //退出SSH登录环境
[root@svr7 ~]#                             //已返回客户机

三 在虚拟机sv7中安装inotify-tools工具,实现监控目录内容的变化
1 真机传递软件包到虚拟机svr7中

[root@room9pc01 ~]# scp /root/桌面/tools.tar.gz  root@192.168.4.7:/
root@192.168.4.7's password: 
tools.tar.gz                                  100%  766KB  20.0MB/s   00:00

2 在虚拟机svr7中解包tools.tar.gz,并安装源码包

[root@svr7 ~]# tar -xf /tools.tar.gz -C /root/
[root@svr7 ~]# ls
anaconda-ks.cfg       isync.sh  yes      模板  文档  桌面
initial-setup-ks.cfg  passwd    yes.pub  视频  下载
inotify-tools-3.13.tar.gz  tools     公共     图片  音乐                  
[root@svr7 ~]# tar -xf /root/tools/inotify-tools-3.13.tar.gz -C .    //解压缩到当前目录i
[root@svr7 ~]# ls 
anaconda-ks.cfg       isync.sh  yes      模板  文档  桌面
initial-setup-ks.cfg  passwd    yes.pub  视频  下载
inotify-tools-3.13    tools     公共     图片  音乐
[root@svr7 ~]# cd inotify-tools-3.13/                      //切换到此目录
[root@svr7 inotify-tools-3.13]# yum -y install gcc make    //安装编译工具
[root@svr7 inotify-tools-3.13]#  ./configure       //完成系统检测与配置,并指定默认安装路径
[root@svr7 inotify-tools-3.13]# make                //编译
[root@svr7 inotify-tools-3.13]# make install      //安装
[root@svr7  inotify-tools-3.13]# which inotifywait  #查询命令所对应的程序
/usr/local/bin/inotifywait
[root@svr7 inotify-tools-3.13]# ls /usr/local/bin/   
inotifywait  inotifywatch

四 编写镜像同步脚本并测试效果
1 编写脚本文件/root/isync.sh

[root@svr7 inotify-tools-3.13]# cd 
[root@svr7 ~]# vim  /root/isync.sh
#!/bin/bash
a="/var/www/html/"
b="rsync -az --delete $a root@192.168.4.207:/var/www/html/"
while inotifywait -rqq $a
do
      $b
done &

[root@svr7 ~]# chmod  +x  /root/isync.sh             //添加执行权限

2 运行脚本

[root@svr7 ~]# /root/isync.sh
[root@svr7 ~]#  pgrep  -l  inotify        //确认任务在运行
7318 inotifywait

3 测试同步效果,在svr7上向/var/www/html/目录下添加一个测试网页(触发同步):

[root@svr7 ~]# touch /var/www/html/a.txt
[root@svr7 ~]# ls /var/www/html/
a.txt  text

4 在pc207上检查/var/www/html/目录,内容应该已经与svr7上的同名目录一致:

[root@pc207 ~]# ls /var/www/html     
a.txt  text           
#  只要svr7的程序一直在运行,就能一直监控并同步pc207上Documentroot下的文件

5 结束测试后,在svr7上停止监控任务

[root@svr7 ~]# pkill  -9  inotify
[root@svr7 ~]# /root/isync.sh: 行 7:  7367 已杀死               inotifywait -rqq $a
[root@svr7 ~]# pgrep  -l  inotify                   //确认已没有监控任务