centos7下rsync+crontab定期同步备份

最近需求想定期备份内部重要的服务器数据到存储里面,顺便做个笔记

以前整过一个win下的cwrsync(客户端)+rsync(服务端:存储)的bat脚本

这次整一个Linux下的脚本sh,执行定期自动备份数据

  • 客户端:192.168.0.100(rsync-Linux)

  • 服务端:192.168.0.252(存储)

rsync简介

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

1.服务端配置

rsync的服务端主要是群辉的存储,所以直接有界面式的配置,所以这边就不详细讲解,如下图:

未分类

2.客户端配置

创建密码文件,/etc/rsyncd/rsyncd.pass,并修改为 600 权限

[root@localhost ~]# mkdir rsyncd
[root@localhost ~]# vim /rsyncd/rsyncd.pass
[root@localhost ~]# chmod 600 /rsyncd/rsyncd.pass

▲说明:/rsyncd/rsyncd.pass其内密码需要和服务端内/etc/rsyncd/rsyncd.pass或存储rsync指定用户的密码保持一致

客户端向服务端传输文件,如果是 873 端口,可以把 –port 去掉

rsync -arvz --progress /data rsync@192.168.0.252::log --password-file=/rsyncd/rsyncd.pass

若有需要也可以从服务端拉取文件,需要把服务器的 /etc/rsyncd/rsyncd.conf 中的 write only = yes 给去掉

#拉取整个目录
rsync -arvz --progress --password-file=/rsyncd/rsyncd.pass --port=873 rsync@192.168.0.252::log /var/log
#拉取单个文件
rsync -arvz --progress --password-file=/rsyncd/rsyncd.pass --port=873 rsync@192.168.0.252::log/a.log /var/log

rsync服务端配置参数:

全局参数

在文件中[module]之前的所有参数都是全局参数,当然也可以在全局参数部分定义模块参数,这时候该参数的值就是所有模块的默认值。

port
指定后台程序使用的端口号,默认为873。

motd file
"motd file"参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有motd文件的。

log file
"log file"指定rsync的日志文件,而不将日志发送给syslog。比如可指定为“/var/log/rsyncd.log”。

pid file
指定rsync的pid文件,通常指定为“/var/run/rsyncd.pid”。

syslog facility
指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。

模块参数
主要是定义服务器哪个目录要被同步。其格式必须为“[module]”形式,这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。我们可以根据自己的需要,来指定多个模块,模块中可以定义以下参数:

comment
给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。

path
指定该模块的供备份的目录树路径,该参数是必须指定的。

use chroot
如 果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺 点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true。

uid
该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是"nobody"。

gid
该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为"nobody"。

max connections
指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。

list
该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true。

read only
该选项设定是否允许客户上载文件。如果为true那么任何上载请求都会失败,如果为false并且服务器目录读写权限允许那么上载是允许的。默认值为true。

exclude
用来指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,一个 模块只能指定一个exclude选项。但是需要注意的一点是该选项有一定的安全性问题,客户很有可能绕过exclude列表,如果希望确保特定的文件不能 被访问,那就最好结合uid/gid选项一起使用。

exclude from
指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exclude列表定义。

include
用来指定不排除符合要求的文件或目录。这等同于在客户端命令中使用--include来指定模式,结合include和exclude可以定义复杂的exclude/include规则。

include from
指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。

auth users
该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。

secrets file
该选项指定一个包含定义用户名:密码对的文件。只有在"auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的 secures file名,需要限式指定一个(例如:/etc/rsyncd.passwd)。注意:该文件的权限一定要是600,否则客户端将不能连接服务器。

strict modes
该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true。

hosts allow
该选项指定哪些IP的客户允许连接该模块。客户模式定义可以是以下形式:
单个IP地址,例如:192.167.0.1
整个网段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
多个IP或网段需要用空格隔开,“*”则表示所有,默认是允许所有主机连接。

hosts deny
指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。

ignore errors
指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IO错误,一般来说rsync在出现IO错误时将将跳过--delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题。

ignore nonreadable
指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。

lock file
指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock。

transfer logging
使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。

log format
通过该选项用户在使用transfer logging可以自己定制日志文件的字段。其格式是一个包含格式定义符的字符串,可以使用的格式定义符如下所示:
%h 远程主机名
%a 远程IP地址
%l 文件长度字符数
%p 该次rsync会话的进程id
%o 操作类型:"send"或"recv"
%f 文件名
%P 模块路径
%m 模块名
%t 当前时间
%u 认证的用户名(匿名时是null)
%b 实际传输的字节数
%c 当发送文件时,该字段记录该文件的校验码
默认log格式为:"%o %h [%a] %m (%u) %f %l",一般来说,在每行的头上会添加"%t [%p] "。在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。

timeout
通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。

refuse options
通过该选项可以定义一些不允许客户对该模块使用的命令参数列表。这里必须使用命令全名,而不能是简称。但发生拒绝某个命令的情况时服务器将报告错误信息然后退出。如果要防止使用压缩,应该是:"dont compress = *"。

dont compress
用来指定那些不进行压缩处理再传输的文件,默认值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

rsync常用命令:

-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 显示帮助信息

crontab简介

crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux下的任务调度分为两类:系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab文件包括下面几行:

[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/

# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

crontab文件的含义

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute   hour   day   month   week   command

其中:

  • minute: 表示分钟,可以是从0到59之间的任何整数。

  • hour:表示小时,可以是从0到23之间的任何整数。

  • day:表示日期,可以是从1到31之间的任何整数。

  • month:表示月份,可以是从1到12之间的任何整数。

  • week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

  • command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

未分类

在以上各个字段中,还可以使用以下特殊字符:

  • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

crontab常用命令

1.列出crontab文件

为了列出crontab文件,可以用:

[root@localhost ~]# crontab -l
0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty

你将会看到和上面类似的内容。可以使用这种方法在$HOME目录中对crontab文件做一备份:

[root@localhost ~]# crontab -l > $HOME/mycron

这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。

2.编辑crontab文件

如果希望添加、删除或编辑crontab文件中的条目,而编辑环境变量又设置为v i,那么就可以用vi来编辑crontab文件,相应的命令为:

[root@localhost ~]# crontab -e

可以像使用vi编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。

我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month(注释说明)

 30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} ;

现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。

现在让我们使用前面讲过的crontab -l命令列出它的全部信息:

[root@localhost ~]# crontab -l 
 # (crondave installed on Tue May 4 13:07:43 1999)
 # DT:ech the date to the console every 30 minites
 0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1
 # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
 30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} ;

3.删除crontab文件

要删除crontab文件,可以用:

[root@localhost ~]# crontab -r

crontab使用实例

实例1:每1分钟执行一次command

命令:

* * * * * command

实例2:每星期日的晚上00 : 00执行rsync-sh脚本

命令:

[root@localhost ~]# crontab -e
# DT:Execute rsync-sh script every Sunday at 00: 00(注释说明)
0 0 * * 7 sh /root/rsyncd/rsync-gitbak.sh

rsync客户端自动与rsync服务器端同步

首先,我们来做一个shell脚本

[root@localhost rsyncd]# vim rsyncd.sh
#!/bin/bash
rsync -arvz --progress /data rsync@192.168.0.252::log --password-file=/rsyncd/rsyncd.pass

命令:crontab -e来编辑加入计划任务

[root@localhost ~]# crontab -e
# DT:Execute rsync-sh script every Sunday at 00: 00(注释说明)
0 0 * * 7 sh /root/rsyncd/rsyncd.sh

使用crontab -l查看加入的计划任务

[root@localhost ~]# crontab -l
0 0 * * 7 sh /root/rsyncd/rsyncd.sh

注意:

  1. 当程式在你所指定的时间执行后,系统会寄一封信给你,显示该程式执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可。

  2. %在crontab中被认为是newline,要用来escape才行。比如crontab执行行中,如果有”date +%Y%m%d”,必须替换为:”date +%Y%m%d”

遇到的问题和解决方法

在Windows上面编辑了sh脚本上传到Linux上面,执行报错:

bad interpreter:No such file or directory

vim rsyncd.sh用命令:set ff?查看是doc还是unix格式,如果是dos格式,用命令:set ff=unix转化为unix格式

Linux下rsync 数据镜像备份 client / server 模式

rsync特性:

  • 可以镜像保存整个目录树和文件系统
  • 可以增量同步数据,文件传输效率高,因而同步时间很短。
  • 可以保持原有文件的权限、时间等属性。
  • 加密传输数据,保证了数据的安全性

两种模式:

  • client / server
  • client / client

安装rsync

yum install rsync

查看rsync版本

rpm -qa rsync
rsync-3.1.2-4.el7.x86_64

查看rsync安装位置

rpm -ql rsync

未分类

在服务器端:

编辑rsync配置文件

vim /etc/rsyncd

内容如下

uid = nobody
gid = nobody
use chroot = no
max connections = 10
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

[rsync_module_1]
path = /rsync_data_1
comment = rsync_data for sharing to client server
ignore errors
read only = true
list = false
uid = root
gid = root
auth users = rsync_bak
secrets file = /etc/rsync_server.pass

未分类

按照配置文件内容,创建/etc/rsync_server.pass 文件,且权限为600
内容

rsync_bak:rsyncpwd
chmod 600 /etc/rsync_server.pass

未分类

根据配置文件创建相应的目录

mkdir -p /rsync_data_1

启动rsync服务和验证

/usr/bin/rsync --daemon
ps -ef | grep rsync
lsof -c rsync
netstat -antlp | grep rsync

未分类

未分类

客户端

确保安装了rsync组件

创建客户端rsync的密码文件,其密码和服务器端一致,且文件权限为600

vim /etc/rsync_client.pass
cat /etc/rsync_client.pass
rsyncpwd
chmod 600 /etc/rsync_client.pass

客户端指定/创建rsync的目录

mkdir -p /rsync_data

从服务器端拉取数据

/usr/bin/rsync -vzrtopg --delete --progress rsync_bak@192.168.199.185::rsync_module_1 /rsync_data --password-file=/etc/rsync_client.pass

验证是否成功从服务器端拉取到数据

ll /rsync_data/

未分类

rsync 工具备份服务端配置

在服务器端安装和配置rsync

1.安装rsync

如已默认安装,请卸载旧版本

$ sudo yum remove rsync -y

RPM 安装

RPM方式的好处,快速、方便、节时,具体安装如下:

$ yum -y install rsync

rsync文件:

/etc/rsyncd.conf
/etc/sysconfig/rsyncd
/etc/xinetd.d/rsync
/usr/bin/rsync
/usr/share/doc/rsync-3.1.2/COPYING
......

2.关于rsync认证方式

rsync有2种常用的认证方式,一种是rsync-daemon,另一种是SSH。

在生产环境中,通常使用rsync-daemon认证模式。

认证模式说明:

  • rsync-daemon认证:默认监听TCP的873端口。前提是双方都需要安装rsync,客户端可不启动rsync服务,但需要简单的配置。服务器端需要启动且需在服务器端配置rsync。

  • SSH认证:通过系统用户认证,即在rsync上通过SSH隧道进行传输,前提是需要服务器端与客户端建立无密码登录。

    • 无需服务器与客户端配置rsync,也无需启动rsync服务,只需双方都安装rsync即可。

3.配置服务端

3.1 设置rsync服务端密码文件 192.168.0.2

使用rsync-daemon认证方式。创建访问密码,格式为用户名:密码,一行一个,明文。
命令

$ sudo echo "renwole:renwolecom"  >>/etc/rsync.password
$ sudo chmod 600 /etc/rsync.password                    # 注意权限必须是 600 否则会报错

3.2 配置rsync服务端配置文件 192.168.0.2

配置文件所在目录: /etc/rsyncd.conf

$ sudo vim /etc/rsyncd.conf
uid = root               # 运行RSYNC守护进程的用户
gid = root               # 运行RSYNC守护进程的组
port = 873               # 默认端口
#address = 10.28.204.65  # 服务器IP地址
# pid file = /var/run/rsyncd.pid    # 进程启动后,进程号存放路径     centos 7 若不注释会报错
lock file = /var/run/rsync.lock   # 设置锁文件名称
log file = /var/log/rsyncd.log      # 指定rsync的日志文件
                                    # 这两个文件在配置过后系统会自己创建
use chroot = no             # 不使用chroot
read only = yes             # 只读,不让客户端上传文件到服务器
transfer logging = yes      # 将传输操作记录到传输日志文件

hosts allow=192.168.0.3             # 允许哪些主机访问(多个以空格隔开)
hosts deny=*                        # 拒绝哪些主机访问
max connections = 3                 # 最大连接数
# motd file = /etc/rsyncd.motd      # 登陆欢迎信息(生产环境不建议)

log format = %t %a %m %f %b        # 指定日志记录的格式
syslog facility = local3           # 消息级别
timeout = 600                      # 会话超时时间。

[BackupServer]              # 模块的名称,可以自定义    后续客户端进行同步的时候会使用到
path = /xxx/xxx             # 需要同步的目录
list=yes                    # 是否允许用户列出文件,默认为true
ignore errors               # 忽略错误信息
# exclude = myrenwole/      # 不同步的目录(多个以空格隔开)
comment = BackupServer      # 注释内容,任意
auth users = backup         # 那些用户才允许连接该模块,多个以,隔开     此用户是你上一步配置密码文件所设置的用户
secrets file = /etc/rsyncs.password    # 认证时所需的密码文件

注意:全局配置中的选项对所有模块有效;模块下定义的仅对当前模块有效;另外,模块中定义选项值优先于全局配置。

4.设置防火墙

$ sudo firewall-cmd --add-port=873/tcp --permanent
$ sudo firewall-cmd --add-port=873/udp --permanent
$ sudo firewall-cmd --reload

5.启动并加入开机自启动

$ sudo systemctl start rsyncd       # 开启
$ sudo systemctl enable rsyncd      # 开启守护进程
$ sudo systemctl list-unit-files    # 查看系统所有服务的状态

rsync的小坑

今天磁盘满了,打算将占磁盘大的文件给移走,再采用软连接的。同步的时候出现了一点小问题。

第一天:

先将要同步的文件给同步了一遍。

执行命令

rsync -auv /data/mysql/game /data1/mysql
rsync -auv /data/mysql/integral /data1/mysql
rsync -auv /data/mysql/interact /data1/mysql
rsync -auv /data/mysql/match /data1/mysql
rsync -auv /data/mysql/sns_admin /data1/mysql
rsync -auv /data/mysql/stock /data1/mysq

第二天:

又同步了一遍

rsync -auv /data/mysql/game /data1/mysql/game
rsync -auv /data/mysql/integral /data1/mysql/integral
rsync -auv /data/mysql/interact /data1/mysql/interact
rsync -auv /data/mysql/match /data1/mysql/match
rsync -auv /data/mysql/sns_admin /data1/mysql/sns_admin 
rsync -auv /data/mysql/stock /data1/mysql/stock

快要同步完的时候,检查文件大小,发现文件大了一倍。

原来第二步命令将/data/mysql/game文件 放在/data1/mysql/game文件下了。

这也不算是rsync的坑吧

应该这样这行

rsync -auv /data/mysql/game/ /data1/mysql/game/
rsync -auv /data/mysql/integral/ /data1/mysql/integral/
rsync -auv /data/mysql/interact/ /data1/mysql/interact/
rsync -auv /data/mysql/match/ /data1/mysql/match/
rsync -auv /data/mysql/sns_admin/ /data1/mysql/sns_admin/ 
rsync -auv /data/mysql/stock/ /data1/mysql/stock/

或者执行和昨天一样的命令

rsync -auv /data/mysql/game         /data1/mysql
rsync -auv /data/mysql/integral    /data1/mysql
rsync -auv /data/mysql/interact     /data1/mysql
rsync -auv /data/mysql/match        /data1/mysql
rsync -auv /data/mysql/sns_admin    /data1/mysql
rsync -auv /data/mysql/stock        /data1/mysq 

就可以了。

小结:

1、使用rsync同步,只要之前同步的内容和现在同步的内容有一点改变,就会重新全量同步,因此,同步的时候尽量找长时间没有变化的大文件
2、rsync不会追加文件

Linux下使用rsync同步文件

遇到的问题是几台游戏服务器,有一台新的服务器之前已经copy(Linux的scp命令)过文件上去,但在测试的过程中发现还是图片无法正常不显示出来,然后用httpwatch去分析请求的资源,发现有一个图片请求的地址是404(文件不存在),然后ssh登录上去,找到指定目录,发现确实是没有这个文件。。。

为了不至于再copy一次,就需要使用文件同步的管理软件了,同事推荐了linux下的rsync,小试了一下,还是很不错的。

假设有服务器A 和 服务器B,现在登录了服务器B,需要将服务器A上的文件同步到服务器B中,将A中有的B中没有的,或是A中文件比B中的文件要新就全部copy过来。

shell命令如下:

rsync -zvrtopg -progress -e 'ssh -p 端口号' root@192.xx.xx.xx:/文件目录/  本机的目录地址

语法rsync -参数 ‘源文件访问路径’目标路径

第一次用的时候,我在源服务器(即上面所指的服务器A)中的文件目录没有加/导致后来直接把那个目录copy过来了,而不是它目录下的所有文件

关于rsync 这个命令的一些参数,英文好点就自己直接使用rsync –help去查看了,这里从其它人写的博客中转载过来的。

参考了:

rsync参数详解 http://hi.baidu.com/webv/blog/item/7c787a06581dab7e0208819a.html

rsync 使用说明 http://wandering.blog.51cto.com/467932/105113

使用之前需要先安装rsync,这个直接自行搜索吧..

关于参数的说明:

-v, --verbose 详细模式输出   
-q, --quiet 精简输出模式    
-c, --checksum 打开校验开关,强制对文件传输进行校验    
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD    
-r, --recursive 对子目录以递归模式处理    
-R, --relative 使用相对路径信息    
rsync foo/bar/foo.c remote:/tmp/    

则在/tmp目录下创建foo.c文件,而如果使用-R参数:

rsync -R foo/bar/foo.c remote:/tmp/    

则会创建文件/tmp/foo/bar/foo.c,也就是会保持完全路径信息。

-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的shell程序    
--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 显示帮助信息

一般常用的:

-v 详细模式输出

-r 对子目录以递归模式处理

-t 保持文件的时间信息

-o 保持文件的属性信息

-g 保持文件属组的信息(不清楚这样翻译是否有问题)

-p 保持文件权限不变

-e, --rsh=COMMAND 指定替代rsh的shell程序

-z, --compress 对备份的文件在传输时进行压缩处理

--progress 显示备份过程

也就是:递归、保证文件一些基本属性不变(创建/修改时间 权限等)、传输文件时压缩以减少带宽消耗,当然还有一个就看需要了:是否删除源中没有,而目标中又有的文件

rsync远程同步的基本配置与使用

未分类

rsync是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份,镜像服务器等应用。

rsync的官方站点是http://rsync.samba.org/,目前最新版本是3.1.1,由Wanyne Davison进行维护。作为一种最常用的文件备份工具,rsync往往是Linux和UNIX系统默认安装的基本组件之一。

1、rsync:快速增量备份工具,实现远程同步,可使用ssh和rsync备份

rsync服务器:备份源,提供一个目录供客户端上传或下载

2、rsync的配置:

建立rsync的配置文件:/etc/rsyncd.conf

use  chroot=yes             禁锢在源地址

port  837                   默认端口号为873

pid  file                     进程号文件位置

hosts  allow                 允许访问客户机地址

[wwwroot]                   共享名

path=/路径                   真正的文件夹位置

comment=                  描述

read  only=yes|no              只读|读写

auth  users=用户名            认证的用户

secrets  file=文件名路径          验证文件

验证文件格式: 用户名:密码

权限必须设置为600

3、管理rsync服务:

启动:rsync –daemon

停止:kill 进程号

4、rsync的使用

格式:rsync 选项 原始位置 目标位置

选项:

  • -a:归档模式,等同于 -rlptgoD

  • -r:递归,包含目录

  • -p:权限(保留权限)

  • -t:时间

  • -z:压缩

  • -v:同步过程信息

  • –delete:删除目标位置有而原始位置没有的文件

5、备份源(服务器端)的表达方式:

1)用户名@服务器IP::共享名

例:benet@192.168.1.100::wwwroot

2)rsync://用户名@服务器IP/共享名

Rsync -avz benet@192.168.1.100::wwwroot /root

6、实现免交互模式:

1)创建密码文件并设置权限为600

2)同步时使用 --password-file=文件名 的方式指定文件位置

7、实时同步:有变化则备份,无变化不备份

通过inotify机制实现,实时监控本地文件系统目录的变化,并作出通知响应,适当调整监控文件数量

inotify-tools辅助工具,有两个命令:

inotifywait:持续监控,实时输出结果

inotifywatch:短期监控,完成后输出结果

格式:inotifywait -mrq -e 监控事件类型 /监控目标

-m:持续监控 -r:监控整个目录

-q:简化输出 -e:监控事件类型

类型有:modify(修改) create(创建) move(移动)

delete(删除) attrib(属性更改)

以上便是rsync的基本使用方法了,rsync远程同步实验案例请关注微信公众号 L宝宝聊IT 浏览“rsync远程同步示例”文章进行查阅。

rsync远程同步示例

未分类

实验要求:

(1)如图所示,搭建网络,配置地址。

(2)在1.10服务器上配置为服务端,修改rsync的配置文件/etc/rsyncd.conf,并启动rsync服务程序。

(3)在1.20上使用rsync命令验证是否能够从服务端(/var/www/html)下载文件到客户机端(/myweb)。

(4)修改rsync的配置文件/etc/rsyncd.conf,实现客户机端(/myweb)能上传文件到服务端的(/var/www/html)位置。在客户机端验证。

(5)在1.20上实现每天晚上22:00对服务器的网站目录(/var/www/html)做一次同步。

(6)在1.20上配置rsync+inotify实时同步。通过编写脚本来实现,客户机能够实时上传文件到服务端。注意:需要安装inotify软件。

步骤:

1、 按照要求配置IP地址,实现可以互相ping通。

未分类

2、为备份账户创建数据文件(vim /etc/rsyncd_users.db)并赋予权限。

未分类

未分类

3、修改1.10服务器端的rsync配置文件/etc/rsyncd.conf,并启动rsync服务程序。(启动rsync服务:rsync –daemon)

未分类

4、使用1.20客户机测试能够从服务器端下载文件到/myweb

1) 在1.10的/var/www/html目录下创建一个文件。

未分类

2)在1.20客户机端创建目录/myweb,并同步下载服务器端的文件

未分类

3) 在客户机/myweb目录下查看是否同步,

未分类

5、修改rsync的配置文件/etc/rsyncd.conf,实现客户机端(/myweb)能上传文件到服务端的(/var/www/html)位置。在客户机端验证。

1)进入/etc/rsyncd.conf配置文件并修改。

未分类

2)重启rsync服务,需要先杀死再启动

keill $(cat  /var/run/rsyncd.pid)

rsync --daemon

3)赋予/var/www/html目录相应的权限

未分类

4) 在客户机端/myweb目录下创建一个文件并验证是否能上传同步到服务器端。

未分类

未分类

5)到服务器端查看

未分类

6、在1.20上实现每天晚上22:00对服务器的网站目录(/var/www/html)做一次同步。

1) 创建一个zhangsan用户的密码文件/etc/server.pass,并赋予权限

未分类

未分类

2)创建计划任务,crontab -e ,并启动

00        22  *  *  *  /usr/bin/rsync  -az --delete  --password-file=/etc/server.pass  /myweb/  zhangsan@192.168.1.10::wwwroot

未分类

7、在1.20上配置rsync+inotify实时同步。通过编写脚本来实现,客户机能够实时上传文件到服务端。

1)配置/etc/sysctl.conf ,调整inotify内核参数

未分类

sysctl -p运行一下

未分类

3)安装inotify-tools

未分类

4)编写脚本vim /opt/test.sh

未分类

赋予脚本执行权限并执行

chmod +x  /opt/test.sh

未分类

5)在打开一个控制台在客户机端/myweb下创建一个文件并到服务器端/var/www/html查看是否自动同步

未分类

未分类

rsync远程同步及rsync+inotify实时同步

思维代入

正确、有效的备份方案是保障系统及数据安全的重要手段。在服务器中,通常会结合计划性任务、shell脚本来执行本地备份。但有时候为了提高备份的可靠性,异地备份也是非常有必要的。那下面就给大家介绍一种异地远程备份的方法:rsync远程备份。

rsync简介

rsync是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份、保持链接和权限,且采用优化的同步算法,在传输前执行压缩,因此非常适用于异地备份、镜像服务等应用。

rsync在同步过程中有两个部分组成:发起端、同步源。负责发起rsync同步操作的客户机称为发起端;负责响应来自客户机的rsync同步操作的服务器称为同步源。在同步过程中,同步源负责提供文档的原始位置;发起端对该位置具有读取权限。

rsync拓扑图

未分类

rsync源服务器的部署

rsync下载地址下载地址https://rsync.samba.org/download.html

CentOS7系统非常友好的默认安装了rsync服务,如果你的系统没有安装rsync服务,那么用上面的链接下载安装即可,因为我这边默认安装了rsync,直接进行修改配置文件,配置文件默认在/etc/rsyncd.conf

  • 修改配置文件
vim /etc/rsyncd.conf
 uid = nobody    
 gid = nobody
 use chroot = yes             //禁锢在源目录
 address = 172.16.10.133      //监听地址
 port 873                     //监听端口
 log file = /var/log/rsyncd.log         //日志文件位置
 pid file = /var/run/rsyncd.pid         //进程ID存放位置
 hosts allow = 172.16.10.0/24           //允许访问的客户机地址

[wwwroot]                     //共享模块的名称
 path=/var/www/html           //源目录的实际路径
 comment=www.yun.com          //注解内容,可不填写
 read only= yes               //是否为只读
 dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2    //同步时不再进行压缩的文件类型
 auth users = backuper         //授权账户
 secrets file = /etc/rsyncd_users.db     //存放账户信息的数据文件
rsync远程同步及rsync+inotify实时同步

未分类

#这边解释一下,对于rsync的同步源最好仅允许以只读方式做同步。同步时也可以采用匿名的方式,只要将上面的auth users和secrets file配置记录加#注释或者删除就可以了。

为备份账户创建数据文件

vim /etc/rsyncd_users.db
backuper:abc123 //创建账户记录,以冒号分割
chmod 600 /etc/rsyncd_users.db

这边由于账户信息采用明文存放,因此上面调整了文件权限,避免账户信息泄露。

备份用户backuper需要对源目录/var/www/html具有相应的读取权限

未分类

  • 开启rsync服务进程
rsync --daemon

未分类

关闭服务的时候,直接采用kill $(cat /var/run/rsyncd.pid) 就可以了

rsync备份工具的使用

  • rsync命令的基本用法

rsync和大多数的备份程序一样,需要指定原始位置和目标位置,命令格式:rsync 源目录位置 目标位置

rsync /etc/fatab /opt

例如这条,意义就是:备份/etc/fstab目录到/opt目录下

命令格式及常用的备份选项

-r:递归模式,包含目录及子目录中的所有文件。
-l:对于符号链接文件仍然复制为符号链接文件。
-v:显示同步过程的详细信息。
-a:归档文件,保留文件的权限、属性等信息。
-z:在传输文件时进行压缩。
-p: 保留文件的权限标记。
-t:保留文件的时间标记。
-g:保留文件的属性标记(仅超级用户使用)。
-o:保留文件的属主标记(仅超级用户使用)。
-H:保留硬连接文件。
-A:保留ACL属性信息。
-D:保留设备文件及其他特殊文件。
--delete:删除目标位置有而原始位置没有的文件。
--checksum:根据校验和(而不是文件大小、修改时间)来决定是否跳过文件。
  • 配置源的表示方法

配置源的表示方法 三种
将对方源目录的文件同步到本地的/opt目录下

格式一:

rsync -avz backuper@172.16.10.133::wwwroot /opt/ 
password:abc123

格式二:

rsync -avz rsync://backuper@172.16.10.133/wwwroot /opt/
password:abc123

格式三:免密码交互

vim /etc/server.pass
abc123
chmod 600 /etc/server.pass
rsync -az --delete --password-file=/etc/server.pass backuper@172.16.10.133::wwwroot /opt
  • rsync备份操作示例
rsync -avz backuper@172.16.10.133::wwwroot /opt/

未分类

配置部署rsync+inotify实时同步

  • 调整inotify内核参数
vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384     #监控事件队列
fs.inotify.max_user_instances = 1024     #最多监控实例
fs.inotify.max_user_watches = 1048576    #每个实例最多监控文件数

sysctl -p     //刷新使之立即生效
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
  • 安装inotify-tools

使用inotify机制需要安装inotify-tools,以便提供inotifywait和inotifywatch辅助工具程序,用来监控和汇总改动情况。

tar xf inotify-tools-3.14.tar.gz -C /opt/     //解压软件至/opt目录下
cd /opt/inotify-tools-3.14/
./configure                      //配置
make && make install          //编译安装

这里以监控网站目录/var/www/html为例,先执行inotifywait命令,然后在源服务器的终端上向/var/www/html目录下进行操作,这边发起端会监控输出结果。

inotifywait -mrp -e modify,create,move,delete /var/www/html

-e用来指定要监控的哪些事件,-m 表示持续监控,-r 表示递归整个目录, -q 简化输出信息。

未分类

  • 编写触发式同步脚本
vim /opt/inotify_rsync.sh

#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -vazH --delete --password-file=/etc/server.pass /var/www/html/ backuper@172.16.10.138::wwwroot/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
    if [ $(pgrep rsync | wc -l) -le 5 ] ; then
        $RSYNC_CMD
    fi
done

chmod +x /opt/inotify_rsync.sh 
#添加执行权限

然后我们来看一下脚本执行的效果

未分类

未分类

未分类

未分类

未分类

至此实验结束,试验成功,rsync远程同步及rsync+inotify实时同步就成功了!!!各位看官上手试试吧!!!

rsync基本用法

Top
NSD SERVICES DAY05

案例1:rsync基本用法
案例2:rsync+SSH同步
案例3:使用inotifywait工具
案例4:配置Web镜像同步

一、案例1:rsync基本用法

1.1 问题

本例要求掌握远程同步的基本操作,使用rsync命令完成下列任务:

将目录 /boot 同步到目录 /todir 下
将目录 /boot 下的文档同步到目录 /todir 下
在目录 /boot 下新增文件 a.txt,删除 /todir 下的子目录 grub2,再次同步使 /todir 与 /boot 一致
验证 -a、-n、-v、--delete 选项的含义

1.2 方案

本地同步操作:

rsync [选项...] 本地目录1 本地目录2
rsync [选项...] 本地目录1/ 本地目录2

rsync同步工具的常用选项:

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

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:rsync同步基本操作

1)将目录 /boot 同步到目录 /todir 下

[root@svr7 ~]# ls  -l  /todir                  //同步前
ls: 无法访问/todir: 没有那个文件或目录
[root@svr7 ~]# rsync  -a  /boot  /todir          //将目录1作为目录2的子目录
[root@svr7 ~]# ls  -l  /todir                  //检查同步结果
总用量 4
dr-xr-xr-x. 4 root root 4096 11月 30 18:50 boot

2)将目录 /boot 下的文档同步到目录 /todir 下

[root@svr7 ~]# rm  -rf  /todir                  //清理掉目录2
[root@svr7 ~]# rsync  -a  /boot/  /todir          //将目录1下的文档同步到目录2下
[root@svr7 ~]# ls  -l  /todir                  //检查同步结果
总用量 126708
-rw-r--r--. 1 root root   126426 10月 30 2015 config-3.10.0-327.el7.x86_64
drwxr-xr-x. 2 root root     4096 11月 30 18:50 extlinux
drwx------. 6 root root      104 12月  9 09:58 grub2
.. ..

3)同步效果测试

在目录/boot下新增文件a.txt,删除/todir下的子目录 grub2:

[root@svr7 ~]# touch  /boot/a.txt
[root@svr7 ~]# rm  -rf  /todir/grub2/ 

现在目录/boot和/todir目录下的内容已经不一致了:

[root@svr7 ~]# ls  -ld  /boot/a.txt  /todir/a.txt
ls: 无法访问/todir/a.txt: 没有那个文件或目录
-rw-r--r--. 1 root root 0 1月  11 21:09 /boot/a.txt
[root@svr7 ~]# ls  -ld  /boot/grub2  /todir/grub2
ls: 无法访问/todir/grub2: 没有那个文件或目录
drwx------. 6 root root 104 12月  9 09:58 /boot/grub2

再次同步使/todir与/boot一致:

[root@svr7 ~]# rsync  -a  /boot/  /todir/

确认同步结果:

[root@svr7 ~]# ls  -ld  /boot/a.txt  /todir/a.txt
-rw-r--r--. 1 root root 0 1月  11 21:09 /boot/a.txt
-rw-r--r--. 1 root root 0 1月  11 21:09 /todir/a.txt
[root@svr7 ~]# ls  -ld  /boot/grub2  /todir/grub2
drwx------. 6 root root 104 12月  9 09:58 /boot/grub2
drwx------. 6 root root 104 12月  9 09:58 /todir/grub2

步骤二:验证 -a、-v、-n、–delete 选项的含义

1)验证-a选项

当目录1包含文件夹时,若缺少-a或-r选项则文件夹会被忽略:

[root@svr7 ~]# rsync  /home  /testa
skipping directory home
[root@svr7 ~]# ls  -ld  /testa
ls: 无法访问/testa: 没有那个文件或目录

添加-a后才会执行同步:


[root@svr7 ~]# rsync -a /home/ /testa [root@svr7 ~]# ls -ld /testa drwxr-xr-x. 4 root root 31 1月 6 17:33 /testa

类似的情况,当目录1中的数据出现权限、归属、修改时间等变化时,若文件内容不变默认不会同步,若希望目录2也同步这些变化,也需要-a选项。

2)验证-v选项

创建测试目录及文档:

[root@svr7 ~]# mkdir  /fdir
[root@svr7 ~]# touch  /fdir/1.txt

添加-v选项时,可以看到操作细节信息,比如第一次同步时:

[root@svr7 ~]# rsync  -av  /fdir/  /tdir
sending incremental file list
created directory /tdir
./
1.txt                                 //传输文档列表
sent 82 bytes  received 34 bytes  232.00 bytes/sec
total size is 0  speedup is 0.00

在目录/fdir/添加文件2.txt,再次跟踪同步信息:

[root@svr7 ~]# touch  /fdir/2.txt
sending incremental file list
./
2.txt                                 //传输文档列表
sent 100 bytes  received 34 bytes  268.00 bytes/sec
total size is 0  speedup is 0.00

确认目录1和目录2的内容已经一致:

[root@svr7 ~]# ls  /fdir/  /tdir/
/fdir/:
1.txt  2.txt
/tdir/:
1.txt  2.txt

再次跟踪同步信息,已经无需传输文件:

[root@svr7 ~]# rsync  -av  /fdir/  /tdir
sending incremental file list
sent 58 bytes  received 12 bytes  140.00 bytes/sec
total size is 0  speedup is 0.00

3)验证-n选项

将-n、-v选项合用,可以模拟同步过程,显示需要做哪些操作(但并不真的同步)。

在目录/fdir下新建文件3.txt,测试同步操作:

[root@svr7 ~]# touch  /fdir/3.txt
[root@svr7 ~]# rsync  -avn  /fdir/  /tdir/
sending incremental file list
./
3.txt                                          //提示同步时会传输哪些文件
sent 78 bytes  received 18 bytes  192.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
[root@svr7 ~]# ls  -l  /tdir/3.txt                 //但实际并未真的同步
ls: 无法访问/tdir/3.txt: 没有那个文件或目录

去掉-n选项才会真正同步:

[root@svr7 ~]# rsync  -av  /fdir/  /tdir/
sending incremental file list
./
3.txt
sent 114 bytes  received 34 bytes  296.00 bytes/sec
total size is 0  speedup is 0.00
[root@svr7 ~]# ls  -l  /tdir/3.txt
-rw-r--r--. 1 root root 0 1月  11 21:46 /tdir/3.txt

4)验证–delete选项

rsync同步操作默认只是将目录1的数据同步到目录2,但如果目录2存在多余的文件却并不会去除,除非添加—delete选项。

在目录/fdir、/tdir已经完成同步后,删除/tdir/2.txt文件,再次同步:

[root@svr7 ~]# rm  -rf  /fdir/2.txt 
[root@svr7 ~]# rsync  -a  /fdir/  /tdir/

检查发现目标文件夹/tdir下的2.txt文件还在:

[root@svr7 ~]# ls  /fdir/  /tdir/
/fdir/:
1.txt  3.txt
/tdir/:
1.txt  2.txt  3.txt

这种情况下添加–delete选项再次执行同步,两个目录的内容就一致了:

[root@svr7 ~]# rsync  -a  --delete  /fdir/  /tdir/
[root@svr7 ~]# ls  /fdir/  /tdir/
/fdir/:
1.txt  3.txt
/tdir/:
1.txt  3.txt

二、案例2:rsync+SSH同步

2.1 问题

本例要求掌握rsync与远程SSH资源的同步操作,使用rsync命令访问远程主机svr7,完成下列任务:

查看远程主机的 / 目录下有哪些子目录
从远程主机下载 /etc/passwd 文件到当前目录
将远程主机的 /boot/ 目录同步为本地的 /fromssh
将本机的 /etc 目录同步到远程主机的 /opt/下

2.2 方案

列出 SSH 服务端资源

rsync user@host:远程目录/

rsync+SSH远程同步操作:

rsync [...] user@host:远程目录 本地目录
rsync [...] 本地目录 user@host:远程目录

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:列出远程主机的SSH资源

查看远程主机svr7的/目录下有哪些子目录:

[root@pc207 ~]# rsync  root@192.168.4.7:/
root@192.168.4.7's password:                           //验证对方的密码
dr-xr-xr-x        4096 2016/12/15 10:39:34 .
lrwxrwxrwx           7 2016/12/07 09:21:50 bin
lrwxrwxrwx           7 2016/12/07 09:21:50 lib
lrwxrwxrwx           9 2016/12/07 09:21:50 lib64
lrwxrwxrwx           8 2016/12/07 09:21:50 sbin
dr-xr-xr-x        4096 2016/12/07 11:25:29 boot
drwxr-xr-x           6 2016/12/07 09:21:14 data
drwxr-xr-x        3200 2016/12/15 10:46:15 dev
drwxr-xr-x        8192 2016/12/20 17:01:02 etc

步骤二:rsync+SSH同步操作

1)从远程主机svr7下载/etc/passwd文件到当前目录

[root@pc207 ~]# rsync  root@192.168.4.7:/etc/passwd  ./
root@192.168.4.7's password:                           //验证对方的密码
[root@pc207 ~]# cat  passwd                             //检查同步结果
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
.. ..

2)将远程主机svr7的/boot/目录同步为本地的/fromssh

[root@pc207 ~]# rsync  -a  root@192.168.4.7:/boot/  /fromssh
root@192.168.4.7's password:                           //验证对方的密码
[root@pc207 ~]# ls  /fromssh/                             //检查同步结果
config-3.10.0-327.el7.x86_64
extlinux
grub2
initramfs-0-rescue-a19921505cc7e19d20dfcd5cea7d8aa2.img
initramfs-3.10.0-327.el7.x86_64.img
initramfs-3.10.0-327.el7.x86_64kdump.img
.. ..

3)将本机的/etc目录同步到远程主机svr7的/opt/下

确认目录大小:

[root@pc207 ~]# du  -sh  /etc
35M    /etc

上行同步到远程主机svr7上:

[root@pc207 ~]# rsync  -a  /etc  root@192.168.4.7:/opt/
root@192.168.4.7's password:

在远程主机上检查同步结果:

[root@svr7 ~]# du  -sh  /opt/etc
35M    /opt/etc

三、案例3:使用inotifywait工具

3.1 问题

本例要求安装inotify-tools工具,并针对文件夹 /opt 启用 inotifywait 监控,完成下列任务:

当此目录下出现新建、修改、更改权限、删除文件等事件时能给出提示
验证上述监控事件的效果

3.2 方案

inotifywait监控操作:

inotifywait [选项] 目标文件夹

inotifywait常用命令选项:

-m,持续监控(捕获一个事件后不退出)
-r,递归监控、包括子目录及文件
-q,减少屏幕输出信息
-e,指定监视的 modify、move、create、delete、attrib 等事件类别

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:安装inotify-tools软件包

1)解包

[root@svr7 ~]# tar  xf  inotify-tools-3.13.tar.gz  -C  /usr/src/

2)配置

[root@svr7 ~]# cd  /usr/src/inotify-tools-3.13/
[root@svr7 inotify-tools-3.13]# ./configure

3)编译

[root@svr7 inotify-tools-3.13]# make

4)安装

[root@svr7 inotify-tools-3.13]# make

5)检查安装结果(inotifywait程序可用)

[root@svr7 ~]# inotifywait --help
inotifywait 3.13
Wait for a particular event on a file or set of files.
Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
Options:
    -h|--help         Show this help text.
.. ..

步骤二:测试inotifywait监控

1)开启监控任务,置入后台

[root@svr7 ~]# inotifywait  -mrq  -e  create,modify,move,attrib,delete /opt &
[1] 55564

2)测试/opt/目录下的新建、修改、改名、更改权限、删除文件等事件的响应消息

观察新建文件时的监控信息:

[root@svr7 ~]# touch  /opt/a.txt
/opt/ CREATE a.txt
/opt/ ATTRIB a.txt

观察修改文件内容时的监控信息:

[root@svr7 ~]# echo  Hello  >  /opt/a.txt
[root@svr7 ~]# /opt/ MODIFY a.txt
/opt/ MODIFY a.txt

观察将文件改名时的监控信息:

[root@svr7 ~]# mv  /opt/a.txt  /opt/b.txt
/opt/ MOVED_FROM a.txt
/opt/ MOVED_TO b.txt

观察修改文件权限时的监控信息:

[root@svr7 ~]# chmod  600  /opt/b.txt
/opt/ ATTRIB b.txt

观察删除文件时的监控信息:

[root@svr7 ~]# rm  -rf  /opt/b.txt 
/opt/ DELETE b.txt

3)停止监控任务

[root@svr7 ~]# kill  -9  %1
[1]+  已杀死          inotifywait -mr -e create,modify,move,attrib,delete /opt

四、案例4:配置Web镜像同步

4.1 问题

本例要求为两台Web服务器svr7、pc207的网页文档目录配置镜像同步,主要基于inotifywait监控技术实现实时触发操作,需要完成下列任务:

以 svr7 为发起方,原始目录为 /var/www/html/
以 pc207 为同步目标,基于SSH免密验证
编写 inotify+rsync 同步脚本,验证实时同步效果

4.2 方案

inotifywait与rsync的结合,主要思路:

while  inotifywait监控操作
do
        需要执行的rsync同步操作
done

4.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:为主机svr7、pc207部署同步目录

双方的目录均为/var/www/html/,如果安装了httpd,此目录会自动出现。

1)确认svr7的目录内容

[root@svr7 ~]# yum  -y  install  httpd
.. ..
[root@svr7 ~]# ls  /var/www/html/                     //向目录下提供一些测试文件
libreoffice

2)确认pc207的目录内容

[root@pc207 ~]# yum  -y  install  httpd
.. ..
[root@pc207 ~]# ls   /var/www/html                 //初始目录无数据
[root@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 /root/.ssh/id_rsa. 
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
00:a7:cb:2d:9d:b8:8a:df:f5:ff:5b:ed:bd:04:10:fe root@svr7
The key's randomart image is:
+--[ RSA 2048]----+
|    . .    .     |
|     +    . .    |
|    . .    o     |
|   . = o    o    |
|    = + S    E   |
|     o        .. |
|    . .       ...|
| . o . .     ....|
|..o .   ....o. .+|
+-----------------+

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

[root@svr7 ~]# ssh-copy-id  root@192.168.4.207
The authenticity of host '192.168.4.207 (192.168.4.207)' can't be established.
ECDSA key fingerprint is d3:16:2c:9a:9d:91:28:c8:74:9c:af:2d:04:82:c9:66.
Are you sure you want to continue connecting (yes/no)? yes         //首次连yes确认
root@192.168.4.207's password:                      //验证对方的密码
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh 'root@192.168.4.207'"
and check to make sure that only the key(s) you wanted were added.

3)验证免密码登录效果

[root@svr7 ~]# ssh  root@192.168.4.207
Last login: Fri Jan 13 09:52:08 2017 from 192.168.4.110
[root@pc207 ~]#                                      //确认已免密码连入远程主机
[root@pc207 ~]# exit                                  //退出SSH登录环境
登出
Connection to 192.168.4.207 closed.
[root@svr7 ~]#                                     //已反对原客户机

步骤三:编写镜像同步脚本并测试效果

1)编写脚本文件/root/isync.sh

[root@svr7 ~]# vim  /root/isync.sh
#!/bin/bash
FROM_DIR="/var/www/html/"      
RSYNC_CMD="rsync  -az  --delete  $FROM_DIR  root@192.168.4.207:/var/www/html" 
while  inotifywait  -rqq  -e  modify,move,create,delete,attrib  $FROM_DIR 
do
    $RSYNC_CMD
done  &
[root@svr7 ~]# chmod  +x  /root/isync.sh  

2)运行脚本

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

3)测试同步效果

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

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

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

[root@pc207 ~]# ls   /var/www/html
a.txt  libreoffice

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

[root@svr7 ~]# pkill  -9  inotify
[root@svr7 ~]# pgrep  -l  inotify                     //确认已没有监控任务
[root@svr7 ~]#

inotify+rsync实战演练

试验目的:

演练rsync结合inotify实现服务端目录内文件有变动(包括修改,删除,创建)时,自动立即同步到客户端

试验环境:

centos6.5 192.168.10.89 —–角色:文件同步服务器.原始文件服务器.rsync客户端,inotify服务器
centos 6.5 192.168.10.103—–角色:文件同步客户端,由文件服务器自动向客户端同步

关于rsync和inotify介绍和具体用法.请参考其他笔记内容

实战步骤

一.在inotify服务器安装inotify-tools工具

下载链接https://sourceforge.net/projects/inotify-tools/?source=typ_redirect

安装过程简单:

tar zxvf inotify-tools-3.13.tar.gz
cd inotify-tools-3.13
./configure --prefix=/usr/local/inotify
make && make install 

vim /etc/profile
在结尾处加上:
export PATH=$PATH:/usr/local/inotify/bin

应用profile文件:
source /etc/profile

二.演示inotify使用方法:

执行命令:

inotifywait -rm --format '%Xe %w%f' -e modify,create,delete,attrib /tmp/data

命令输出:

[root@oracle inotify-tools-3.13]# inotifywait -rm --format '%Xe %w%f' -e modify,create,delete,attrib /tmp/data
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

解析:

inotifywait : 持续监控文件的状态变化

-r : 递归监控目录下的所有文件,包括子目录.

Note:如果要监控的目录中文件数量巨大,则通常需要修改/proc/sys/fs/inotify/max_users_watchs内核参数,因为其默认值为8192.

-m: 实现持续监控

–format 显示格式.

  • %X—-事件以”X”分隔.
  • %e—-显示事件(比如CREATE,MODIFY等),
  • %w—-显示文件名
  • %f—–显示目录
  • -e: 表示检测哪些事件

/tmp/data——-监测的目录路径

再开启一个终端,然后在/tmp/data目录下新建一些文件:

[root@localhost data]# touch {x,y,z,u,v,w}.txt
inotify输出如下:

检测到了文件变化.第一列是事件类型.有CREATE,ATTRIB. 第二列是文件的完整路径

[root@oracle inotify-tools-3.13]# inotifywait -rm –format ‘%Xe %w%f’ -e modify,create,delete,attrib /tmp/data
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
CREATE /tmp/data/x.txt
ATTRIB /tmp/data/x.txt
CREATE /tmp/data/y.txt
ATTRIB /tmp/data/y.txt
CREATE /tmp/data/z.txt
ATTRIB /tmp/data/z.txt
CREATE /tmp/data/u.txt
ATTRIB /tmp/data/u.txt
CREATE /tmp/data/v.txt
ATTRIB /tmp/data/v.txt
CREATE /tmp/data/w.txt
ATTRIB /tmp/data/w.txt


再试着删除所有文件:

[root@localhost data]# rm -rf {x,y,z,u,v,w}.txt
inotify检测到DELETE事件:

DELETE /tmp/data/x.txt
DELETE /tmp/data/y.txt
DELETE /tmp/data/z.txt
DELETE /tmp/data/u.txt
DELETE /tmp/data/v.txt
DELETE /tmp/data/w.txt

试试创建和删除目录检测到CREATE和DELETE的目录事件:

CREATEXISDIR /tmp/data/test

试试修改文件内容

[root@localhost data]# echo "haha" > 1.txt

检测到MODIFY事件:

CREATE /tmp/data/1.txt
MODIFY /tmp/data/1.txt

基本用法就介绍到这里.下面实战演练inotify+rsync结合做目录文件同步

在inotify编写脚本文件:

以下是工作在相对路径下

[root@localhost ~]# vim inotify_rsync.sh
#!/bin/bash
src=/tmp/data
des="/" #由于工作在相对路径下,会同步目录名.所以目的路径为/根
ip=192.168.10.103
user=root
cd $src #切换进工作目录
#inotify监测目录下文件是否有改动.主要监测:文件名或者目录修改,创建,删除,移动,文件内容修改.(这里我没有监测文件权限属性发送变化).
#将监测到的文件重定向到while循环.
inotifywait -mr --format '%Xe %w%f' -e modify,create,delete,close_write,move $src | while read file;do
   #获取Inotify的监测事件.有CREATE,MODIFY,DELETE等
   ino_event=$(echo $file | awk '{print $1}')
   #获取inotify监测到的变化文件
   ino_file=$(echo $file | awk '{print $2}')
   echo $file
   #if的正则匹配.如果ino_event变量的内容匹配CREATE开头.那么就条件为true.其实就等于 $ino_event == "CREATE*"
   if [[ $ino_event =~ "CREATE" ]] || [[ $ino_event =~ "MODIFY" ]] || [[ $ino_event =~ "CLOSE_WRITE" ]] || [[ $ino_event =~ "MOVED_TO" ]];then
         echo "CREATE or MODIFY or CLOSE_WRITE or MOVED_TO"
         #如果是文件有变化,则利用rsync同步该文件的父目录到远程主机相关目录下.这里使用了ssh协议.需要提前复制本机公钥到目的主机
         echo $(dirname $ino_file)
         /usr/bin/rsync -avzR -e ssh $(dirname $ino_file) $user@$ip:$des
   elif [[ $ino_event =~ "DELETE" ]] || [[ $ino_event =~ "MOVED_FROM" ]];then
         echo "Delete or Moved_From"
        #如果是文件删除,或者移动到其他地方.则利用rsync删除远程主机上的该文件
        /usr/bin/rsync -avzR --delete $(dirname $ino_file) $user@$ip:$des
   fi
done
以下是工作在绝对路径下:

[root@localhost ~]# vim inotify_rsync.sh
#!/bin/bash
src=/tmp/data
des=/tmp  #由于会同步/tmp/data目录.所以目的路径只需要指定/tmp目录
ip=192.168.10.103
user=root
#inotify监测目录下文件是否有改动.主要监测:文件名或者目录修改,创建,删除,移动,文件内容修改.(这里我没有监测文件权限属性发送变化).
#将监测到的文件重定向到while循环.
inotifywait -mr --format '%Xe %w%f' -e modify,create,delete,close_write,move $src | while read file;do
   #获取Inotify的监测事件.有CREATE,MODIFY,DELETE等
   ino_event=$(echo $file | awk '{print $1}')
   #获取inotify监测到的变化文件
   ino_file=$(echo $file | awk '{print $2}')
   echo $file
   #if的正则匹配.如果ino_event变量的内容匹配CREATE开头.那么就条件为true.其实就等于 $ino_event == "CREATE*"
   if [[ $ino_event =~ "CREATE" ]] || [[ $ino_event =~ "MODIFY" ]] || [[ $ino_event =~ "CLOSE_WRITE" ]] || [[ $ino_event =~ "MOVED_TO" ]];then
         echo "CREATE or MODIFY or CLOSE_WRITE or MOVED_TO"
         #如果是文件有变化,则利用rsync同步该文件的父目录到远程主机相关目录下.这里使用了ssh协议.需要提前复制本机公钥到目的主机
         /usr/bin/rsync -avz -e ssh $ino_file $user@$ip:$des
   elif [[ $ino_event =~ "DELETE" ]] || [[ $ino_event =~ "MOVED_FROM" ]];then
         echo "Delete or Moved_From"
        #如果是文件删除,或者移动到其他地方.则利用rsync删除远程主机上的该文件
        /usr/bin/rsync -avz --delete $ino_file $user@$ip:$des
   fi
done

Note:此脚本中的rsync使用的是ssh协议传输.而不是守护模式.所以需要实现传输本地的公钥到远程主机相关用户下

运行脚本:

[root@localhost ~]# ./inotify_rsync.sh

在/tmp/data目录内创建文件:

[root@localhost data]# touch {1,2,3,4,5,6}.txt

脚本输出:

[root@oracle ~]# ./inotify_rsync.sh
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
CLOSE_WRITEXCLOSE /tmp/data/1.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list
/tmp/
/tmp/data/
/tmp/data/1.txt
/tmp/data/2.txt
/tmp/data/3.txt
/tmp/data/4.txt
/tmp/data/5.txt
/tmp/data/6.txt
/tmp/data/test/

sent 388 bytes  received 138 bytes  350.67 bytes/sec
total size is 5  speedup is 0.01
CREATE /tmp/data/2.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 154 bytes  received 15 bytes  338.00 bytes/sec
total size is 5  speedup is 0.03
CLOSE_WRITEXCLOSE /tmp/data/2.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 154 bytes  received 15 bytes  338.00 bytes/sec
total size is 5  speedup is 0.03
CREATE /tmp/data/3.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 154 bytes  received 15 bytes  112.67 bytes/sec
total size is 5  speedup is 0.03
CLOSE_WRITEXCLOSE /tmp/data/3.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 154 bytes  received 15 bytes  338.00 bytes/sec
total size is 5  speedup is 0.03
CREATE /tmp/data/4.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 154 bytes  received 15 bytes  112.67 bytes/sec
total size is 5  speedup is 0.03
CLOSE_WRITEXCLOSE /tmp/data/4.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 154 bytes  received 15 bytes  338.00 bytes/sec
total size is 5  speedup is 0.03
CREATE /tmp/data/5.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 154 bytes  received 15 bytes  338.00 bytes/sec
total size is 5  speedup is 0.03
CLOSE_WRITEXCLOSE /tmp/data/5.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 154 bytes  received 15 bytes  112.67 bytes/sec
total size is 5  speedup is 0.03
CREATE /tmp/data/6.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 154 bytes  received 15 bytes  338.00 bytes/sec
total size is 5  speedup is 0.03
CLOSE_WRITEXCLOSE /tmp/data/6.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 154 bytes  received 15 bytes  338.00 bytes/sec
total size is 5  speedup is 0.03

在172.16.1.120客户端的/tmp/data目录下查看文件: 文件已成功复制:

[root@www ~]$ll /tmp/data
total 8
-rw-r--r--. 1 root root    5 Jun 24 13:27 1.txt
-rw-r--r--. 1 root root    0 Jun 24 13:27 2.txt
-rw-r--r--. 1 root root    0 Jun 24 13:27 3.txt
-rw-r--r--. 1 root root    0 Jun 24 13:27 4.txt
-rw-r--r--. 1 root root    0 Jun 24 13:27 5.txt
-rw-r--r--. 1 root root    0 Jun 24 13:27 6.txt

演示在Inotify服务上删除刚创建的文件: 监测到文件删除

[root@oracle ~]# ./inotify_rsync.sh
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
DELETE /tmp/data/1.txt
Delete or Moved_From
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list
/tmp/data/
deleting tmp/data/6.txt
deleting tmp/data/5.txt
deleting tmp/data/4.txt
deleting tmp/data/3.txt
deleting tmp/data/2.txt
deleting tmp/data/1.txt

sent 87 bytes  received 18 bytes  70.00 bytes/sec
total size is 0  speedup is 0.00
DELETE /tmp/data/2.txt
Delete or Moved_From
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 84 bytes  received 15 bytes  198.00 bytes/sec
total size is 0  speedup is 0.00
DELETE /tmp/data/3.txt
Delete or Moved_From
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 84 bytes  received 15 bytes  66.00 bytes/sec
total size is 0  speedup is 0.00
DELETE /tmp/data/4.txt
Delete or Moved_From
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 84 bytes  received 15 bytes  198.00 bytes/sec
total size is 0  speedup is 0.00
DELETE /tmp/data/5.txt
Delete or Moved_From
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 84 bytes  received 15 bytes  198.00 bytes/sec
total size is 0  speedup is 0.00
DELETE /tmp/data/6.txt
Delete or Moved_From
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list

sent 84 bytes  received 15 bytes  66.00 bytes/sec
total size is 0  speedup is 0.00

在172.16.1.120服务器上查看/tmp/data目录.下面没有任何文件

[root@www ~]$ll /tmp/data
total 4
drwxr-xr-x. 2 root root 4096 Jun 24 13:17 test

演示:新建一个目录.且在该目录下创建内容 脚本输出:

CREATEXISDIR /tmp/data/haha
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
/tmp/data
Nasty PTR record "172.16.1.120" is set up for 172.16.1.120, ignoring
sending incremental file list
/tmp/data/
/tmp/data/haha/

sent 100 bytes  received 22 bytes  244.00 bytes/sec
total size is 0  speedup is 0.00

目录已经被同步

[root@www ~]$ll /tmp/data
total 8
drwxr-xr-x. 2 root root 4096 Jun 24 13:33 haha
drwxr-xr-x. 2 root root 4096 Jun 24 13:17 test

rsync实战演练

rsync是一个远程数据同步工具,可以快速同步多台主机的文件,且只同步有差异的部分.非常强大的工具

实战环境:

  • 服务端:192.168.10.89
  • 客户端:192.168.10.103

rsync不需要安装,默认就自带.

关于rsync的命令想法,可以参考其他笔记.

note: 以下教程都是讲述客户端从远程服务器同步数据到本地.类似于下载行为. 如果需要将本地的文件同步到远程服务器.有点类似于上传行为.则需要改变命令.

下列命令表示了上传和下载的使用区别.

note:在使用rsyn同步前必须要千万小心.因为如果命令搞反.可能会出现意外的严重后果.例如将对方的文件同步到本地数据目录

1.下列的命令将对方(192.168.10.89)的/var/www/abc目录同步到本地的/root/rsync目录下:

rsync -avz --progress -e ssh root@192.168.10.89:/var/www/abc /root/rsync

2.下列命令表示将本地的/tmp/backups目录同步到对方(192.168.10.89)的/var/www/abc目录下

rsync -avz --progress /tmp/backups -e ssh root@192.168.10.89:/var/www/abc

3.另外.如果远程服务器的ssh不是默认22端口.则需要改成:

rsync -avz --progress /root/rsync -e "ssh -p 端口 " root@192.168.10.89:/var/www/abc

Rync的使用方法介绍:

一、以服务端的方式启动rsync进程

1.编辑/etc/rsyncd.conf配置文件——-这个文件默认没有,需要自己写入

vim /etc/rsyncd.conf
#全局参数.所有模块生效配置#
uid = nobody
gid = nobody
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
#模块参数.一个模块代表一个路径#
[www]
path = /var/www/abc/   #路径目录,注意必须是一个/结尾的目录
ignore errors          #忽略错误信息
read only = yes       #服务端只读,客户端只能和服务端同步,不能上传文件
list = no          #是否允许客户端列出服务端此路径下的文件
hosts allow = 192.168.10.0/24  #允许哪个网络上的客户端同步
auth users = backup    #认证用户名
secrets file = /etc/rsync_server.pas #指定一个密码文件路径.此文件内容为username:password. 而且此文件必须和启动rsync的用户是同一个用户.且权限为600

2.编辑密码文件:

[root@localhost ~]# cat /etc/rsync_server.pas
backup:jesse
[root@localhost ~]# ll /etc/rsync_server.pas
-rw------- 1 root root 13 Dec 27 16:46 /etc/rsync_server.pas

Note:此文件必须为600权限.且和rsync进程的用户相同.比如如果是root启动的rsync服务.则此文件属主也必须是root

3.启动rsync服务,以daemon方式启动

rsync --daemon

rsync –daemon默认监控在873端口

默认监控在873端口:
[root@localhost ~]# netstat -tulnp | grep rsync
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      2034/rsync
tcp        0      0 :::873                      :::*                        LISTEN      2034/rsync

4.在/var/www/abc目录下写入一个测试文件夹

[root@localhost ~]# cat /var/www/abc/rsync.test
haha
this is for test rsync
the nginx02 is rsync server.the nginx 01 (ip:192.168.10.103) is a client
I am going to see whether this file will be sync to the client or not!

5.客户端同步文件 先定义密码.改成600权限

[root@localhost ~]# cat /etc/rsync_server.pas
jesse
[root@localhost ~]# ll /etc/rsync_server.pas
-rw------- 1 root root 6 Dec 27 16:47 /etc/rsync_server.pas

Note:我在这里踩到一个大坑.客户端的密码文件只需要包含密码.不能像服务端一样指定username:password.不然会提示验证失败

6.执行rsync命令

/usr/bin/rsync -avz  --progress backup@192.168.10.89::www /var/www/abc/ --password-file=/etc/rsync_server.pas

-a ----保持文件权限
-v ----详细显示
-z -----启用压缩
--progress --显示备份过程
backup@ ----表示用backup用户认证
::www  --------注意这里有2个冒号.表示同步服务器上的www模块
/var/www/abc ---表示同步到本地这个目录下
--password-file ---表示用这个文件内的密码去认证

可是遇到和上面一样的坑:

[root@localhost ~]# /usr/bin/rsync -avz  --progress backup@192.168.10.89::www /var/www/abc/ --password-file=/etc/rsync_server.pas
@ERROR: auth failed on module www

这个坑,至少坑了我5个小时.反复的确认selinux是否关闭,配置文件是否错误,密码文件和密码文件权限等最后才发现,原来配置文件的配置语句不能用注释

注释内容只能单独一行存在.修改配置文件:

[root@localhost ~]# vim /etc/rsyncd.conf
#全局参数.所有模块生效配置#
uid = nobody
gid = nobody
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
#模块参数.一个模块代表一个路径#
[www]
path = /var/www/abc/
ignore errors
read only = yes
list = no
hosts allow = 192.168.10.0/24
auth users = backup
secrets file = /etc/rsync.secrets

客户端重新执行命令:

[root@localhost ~]# /usr/bin/rsync -avz  --progress backup@192.168.10.89::www /var/www/abc/ --password-file=/etc/rsync_server.pas
receiving incremental file list
./
index.html
          91 100%   88.87kB/s    0:00:00 (xfer#1, to-check=2/4)
rsync.test
         173 100%  168.95kB/s    0:00:00 (xfer#2, to-check=1/4)
test.jpg
      185883 100%   25.32MB/s    0:00:00 (xfer#3, to-check=0/4)
sent 115 bytes  received 186303 bytes  372836.00 bytes/sec
total size is 186147  speedup is 1.00
[root@localhost ~]#
可以看到同步了rsync.test文件过来了.另外其他2个文件也一并同步过来

演示: 服务端文件名不修改.往文件内新增文件.观察rsync是否能实行增量同步

1.在rsync服务端内的/var/www/abc/index.html文件新增一行内容:

[root@rabbitmqnode0 abc]# vim index.html
hello.This is nginx server for www.abc.com
hello world!
add a new line to test rsync   #新增一行

2.客户端在原有同步后的基础上再次执行命令:可以看见.只同步了Index.html文件.其他文件并没有复制

[root@rabbitmqnode1 ~]# /usr/bin/rsync -avz  --progress backup@172.16.1.130::www /var/www/abc/ --password-file=/etc/rsync_server.pas
receiving incremental file list
./
index.html
          85 100%   83.01kB/s    0:00:00 (xfer#1, to-check=1/3)
sent 83 bytes  received 251 bytes  668.00 bytes/sec
total size is 106558  speedup is 319.04

查看文件:

[root@rabbitmqnode1 ~]# cat /var/www/abc/index.html
hello.This is nginx server for www.abc.com
hello world!
add a new line to test rsync

可见.即便文件名一致.只要文件内容有变化,仍然会同步到客户端.

二、以ssh方式同步文件

1.关掉服务端的rsync进程

ps -ef | grep rsync
root       2014      1  0 21:28 ?        00:00:00 rsync --daemon
root       6334   2588  0 22:37 pts/1    00:00:00 grep rsync
[root@localhost ~]# kill -9 2014
[root@localhost ~]# rm -rf /var/run/rsyncd.pid

2.客户端直接执行命令:

[root@localhost ~]# rsync -avz --progress -e ssh root@192.168.10.89:/var/www/abc /root
root@192.168.10.89's password:
receiving incremental file list
abc/
abc/index.html
          91 100%   88.87kB/s    0:00:00 (xfer#1, to-check=2/4)
abc/rsync.test
         173 100%  168.95kB/s    0:00:00 (xfer#2, to-check=1/4)
abc/test.jpg
      185883 100%   25.32MB/s    0:00:00 (xfer#3, to-check=0/4)
sent 72 bytes  received 186254 bytes  53236.00 bytes/sec
total size is 186147  speedup is 1.00
[root@localhost ~]#

-e 表示 使用ssh协议root@ 表示服务器的本地用户(注意,这里是服务器本地真实用户)..这里的用法和普通的scp命令一致

可以看到文件已经同步过来了.且权限保持一致

[root@localhost ~]# ll /root/abc
total 192
-rw-r--r-- 1 root root     91 Dec 26 19:21 index.html
-rw-r--r-- 1 root root    173 Dec 27 15:07 rsync.test
-rw-r--r-- 1 root root 185883 Dec 26 19:21 test.jpg

注意:ssh模式不能像rsync daemon模式那样指定一个密码文件.如果想不输入密码.只能复制本机的公钥到rsync服务端相关用户下.

Note:

1.一般在生产中 在客户端同步的时候还需要加入个 –delete参数.表示如果本机相关目录下有某个文件.而这个文件在服务端上没有.那么就删除.这是为了保持和服务端完全同步

2.一般需要写一个crontab定时任务,每5分钟同步一次

/5 * /usr/bin/rsync -avz –progress backup@192.168.10.89::www /var/www/abc/ –password-file=/etc/rsync_server.pas > /dev/null 2>&1