rsync features
rsyncis a file transfer program for Unix systems. rsync uses the "rsyncalgorithm" which provides a very fast method for bringing remote filesinto sync. It does this by sending just the differences in the files across thelink, without requiring that both sets of files are present at one of the endsof the link beforehand.
Some features ofrsync include
can update whole directory trees and filesystems
optionally preserves symbolic links, hard links, file ownership, permissions, devices and times
requires no special privileges to install
internal pipelining reduces latency for multiple files
can use rsh, ssh or direct sockets as the transport
supportsanonymous rsyncwhich is ideal for mirroring
基于OpenSSH的模式:
使用基于SSH的服务方式时,服务端无需配置rsync,只需安装好OpenSSH-server设置并启动sshd服务即可。这种方式直接以Linux系统用户进行rsync验证,非常方便及灵活。
[root@SRV2 ~]#service sshd status
openssh-daemon(pid 3238) is running...
基于rsync的――daemon模式:
1、安装
[root@SRV1 ~]# yuminstall rsync –y
2、建立rsyncd.conf配置文件
[root@SRV1 ~]# vi/etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes
max connections =100
address =192.168.2.109
port 873
log file = /var/log/rsyncd.log
pid file =/var/run/rsyncd.pid
[webroot]
path = /var/www/html
comment = Web Root Directory of192.168.2.109
read only = yes
hosts allow = 192.168.2.104
dont compress = *.gz *.bz2 *.tgz *.zip*.rar *.z
auth users = relearn
secrets file = /etc/rsyncd.secrets
[backup]
path = /backup
comment = MySQL backup Directory of192.168.2.109
read only = yes
hosts allow = 192.168.2.0/255.255.255.0
dont compress = *.gz *.bz2 *.tgz *.zip*.rar *.z
auth users = backup
secrets file = /etc/rsyncd.secrets
[root@SRV1 ~]# vi/etc/rsyncd.secrets
relearn:srv@516
backup:pwd@123
[root@SRV1 ~]#chmod 600 /etc/rsyncd.secrets
3、启动Rsync服务(两种方式)
*)独立启动的守护进程
[root@SRV1 ~]#rsync --daemon
[root@SRV1 ~]#netstat -anpt | grep rsync
tcp 0 0 192.168.2.109:873 0.0.0.0:* LISTEN 9938/rsync
[root@SRV1 ~]#echo "/usr/bin/rsync --daemon &" >> /etc/rc.local
*)Xinetd管理的客户进程
[root@SRV1 ~]# vi/etc/xinetd.d/rsync
service rsync
{
disable = yes
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
[root@SRV1 ~]#chkconfig --level 235 rsync on
[root@SRV1 ~]#service xinetd restart
4、使用rsync文件同步工具:
Rsync [选项] 备份源备份目标
***将rsync服务器中webroot备份模块下的内容同步备份到本地***
(当连接rsync –daemon服务时,使用两个冒号“:”分隔(或者使用斜杠“/”分隔,同时在主机地址前加“rsync://”前缀)。目录名对应远程主机发布的备份模块名,以远程主机指定的rsyncd.secrets文件中的用户进行验证(允许匿名))
[root@SRV2 ~]# rsync -avz [email protected]::webroot /var/www/html/
Password:
receivingincremental file list
./
anaconda-ks.cfg
install.log
sent 101bytes received 8812 bytes 1371.23 bytes/sec
total size is31856 speedup is 3.57
或者:
[root@SRV2 ~]#rsync -avz rsync://[email protected]/webroot /var/www/html/
***将本地目录中的内容同步备份到远程的rsync服务器***
(上传同步文件时需要用户对该目录有可写权限)
(当连接openssh-server服务时,使用一个冒号“:”分隔。目录名对应远程主机的绝对路经,以远程主机的系统用户进行验证。)
[root@SRV2 ~]# rsync -avz /var/www/html/[email protected]:/var/www/html/
[email protected]'spassword:
Error1: (用户名或密码认证失败)
@ERROR: authfailed on module webroot
rsync error: errorstarting client-server protocol (code 5) at main.c(1530) [receiver=3.0.6]
(这个问题是因为/etc/rsyncd.conf文件内指定的uid、gid,你同步文件要写的目录,他的属主和属组要是et/rsyncd.conf文件内指定的uid、gid)
sendingincremental file list
./
rsync:failed to set times on "/." (in webroot): Operation not permitted (1)
deletingindex.html
install.log
sent 7982bytes received 30 bytes 1456.73 bytes/sec
total size is30632 speedup is 3.82
rsync error: somefiles/attrs were not transferred (see previous errors) (code 23) atmain.c(1039) [sender=3.0.6]
*查看rsync服务器可用的备份模块列表:
[root@SRV2 ~]# rsync rsync://192.168.2.109
webroot Web Root Directory of 192.168.2.109
backup MySQL backup Directory of192.168.2.109
*查看rsync服务器中webroot备份模块下的目录及文件:
[root@SRV2 ~]# rsync rsync://[email protected]/webroot
Password:
drwxrwxrwx 4096 2013/07/26 03:37:33 .
-rw-r--r-- 1224 2013/07/27 00:52:03anaconda-ks.cfg
-rw-r--r-- 30632 2013/07/27 00:52:03 install.log
-rw-r--r-- 4492 2013/07/26 03:37:33install.log.syslog
Rsync比较常用的命令选项及其含义:
-a使用归档(archive)模式,保留文件原有的权限、属性、属主等信息,等同于使用“-rlptgoD”等多个选项的组合
-l 符号(软)连接文件仍然复制为符号连接
-H保留硬连接文件
-r 递归模式,包含目录及子目录中所有文件
-v 显示同步过程的详细(verbose)信息
-z 在传输文件时进行压缩(compress)
-o 保留文件的属主标记(仅超级用户使用)
-g 保留文件的属组标记(仅超级用户使用)
-t 保留文件的时间标记
-p 保留文件的权限标记
-D 保留设备文件及其他特殊文件
--delete 删除目标文件夹有而源文件夹中没有的文件
--checksum 根据校验和来决定是否跳过文件(而不是根据文件大小、修改时间)
Rsync+inotify-tools实现数据的实时同步:
实时同步通常适用于有一定实时性要求的场合,如网站镜像、开发数据备份等。可以结合Linux内核的inotify机制,根据备份源目录的变化情况,安排触发更新式的rsync同步任务。
Linux内核自2.6.13版本以后提供了inotify API编程接口,用于监控文件系统事件,如文件存取、删除、移动、修改等。在RHEL5系统中,默认已经编入了inotify机制(可以检查是否存在/proc/sys/fs/inotify/目录).
Inotify-tools是在shell环境中使用inotify功能的一套辅助工具(需要另行下载)。使用inotify-tools提供的inotifywait、inotifywatch工具,编写合适的shell脚本程序,可以完成许多触发式的系统管理任务。
通过监控本地源目录中的文件修改、删除、新建…… 等变化,可以实时触发rsync命令,与远程的目标主机保持同步(基于安全性考虑,上传同步建议只在内部网络使用)。
SRV1 |
192.168.2.109 |
/var/www/html/ |
SRV2 |
192.168.2.106 |
/webdata/ |
1、***安装inotify工具inotify-tools:
[root@SRV2 ~]# uname -r
2.6.18-164.el5
[root@SRV2 ~]# ll/proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Aug 1 13:59 max_queued_events
-rw-r--r-- 1 root root 0 Aug 1 13:59 max_user_instances
-rw-r--r-- 1 root root 0 Aug 1 13:59 max_user_watches
上面三项的输出表示系统已经默认支持inotify,接着就可以开始安装inotify-tools了
[root@SRV2 ~]# wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
[root@SRV2 ~]# tar zxvfinotify-tools-3.13.tar.gz
[root@SRV2 ~]# cd inotify-tools-3.13
[root@SRV2 inotify-tools-3.13]#./configure && make && make install
[root@SRV2 inotify-tools-3.13]# ls/usr/local/bin/inotifywa*
/usr/local/bin/inotifywait /usr/local/bin/inotifywatch
2、***编写inotify监控及触发同步脚本
在脚本中使用inotifywait命令,监控/webdata/目录下的文件修改、创建、移动、删除事件,当出现监控的事件时立即触发rsync命令执行增量更新到192.168.2.109(SRV1)下的/var/www/html/(webroot).
#!/bin/bash
USER=relearn
HOST=192.168.2.109
SRC=/webdata/
DST=webroot
/usr/local/bin/inotifywait -mrq--timefmt '%y/%m/%d %H:%M' --format '%T %w%f%e' -e modify,create,delete,move$SRC | while read files
do
/usr/bin/rsync -avz --delete --password-file=/etc/secrets.txt $SRC$USER@$HOST::$DST
echo "${files}" >> /tmp/rsync.log 2>&1
done
3、测试rsync+inotify实时同步功能
在SRV2中,对/webdata/目录下进行增加、删除文件/目录、修改文件内容等操作,查看SRV1中/var/www/html目录的相应变化。
[root@SRV2 webdata]# echo "HelloRELEARN" >> index.html
[root@SRV2 webdata]# sendingincremental file list
index.html
sent 105 bytes received 33 bytes 276.00 bytes/sec
total size is 16 speedup is 0.12
[root@SRV1 html]# cat index.html
Hello RELEARN