Linux服务之inotify+rsync数据同步

一、inotify简介

   inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序。该机制由著名的桌面搜索引擎项目beagle引入用于替代此前具有类似功能但存在诸多缺陷的dnotify。


二、rsync简介

rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了――remote sync.

1、rsync有四种模式:常用的是第一种,第二种和第四种

   第一个是shell模式,也称为本地模式;

   第二个是远程shell模式,其利用SSH执行底层连接和传输;

   第三个是列表模式,其工作方式与ls相似,即列出源的内容;-nv

   第四个模式是服务器模式。rsync以守护进程方式运行,接收文件传输请求。在使用时,可以使用rsync命令把文件发送给守护进程,也可以向它请求文件。服务器模式非常适合创建中心备份服务器或项目存储库。

2、Rsync常用选项:

rsync有许多选项。如果担心指定的选项或者源或目标不正确,可以使用-n执行试运行。试运行 会预览对每个文件的操作,但是不会实际复制数据。当确认所有设置是正确的之后,删除-n选项,再次运行命令。

-n测试,不真正操作数据
  -v, --verbose 详细模式输出
  -q, --quiet 精简输出模式
  -c, --checksum 打开校验开关,强制对文件传输进行校验
  -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
  -r, --recursive 对子目录以递归模式处理
  -l, --links 保留符号链结
  -p, --perms 保留文件权限
  -t, --times 保留文件时间戳
      -g, --group 保留文件属组信息
  -o, --owner 保留文件属主信息
  -D, --devices 保留设备文件即特殊文件信息
  -e, --rsh=COMMAND 指定替代rsh的shell程序
  -z, --compress 对备份的文件在传输时进行压缩处理
  还可以使用两个选项监视传输的状态:--progress和--stats。
      --progress 显示进度条
      --stats 显示如何执行压缩和传输

注意:rsync命令使用中,如果源参数的末尾有斜杠,就会复制指定目录的内容,而不复制目录本身。目标参数末尾的斜杠没有作用。如下面的命令会把/mydata/data目录中的所有文件复制到/backups目录中。


三、环境介绍

环境描述,client上传数据到web1,软后通过inotify+rsync同步到web2,而且要求实时同步,这样就能保证两台web服务器的数据一致了。

同步目录:

源:web1:172.16.3.3:/www/htdocs

目标:web2:172.16.3.4:/www/htdocs


四、实现rsync手动同步

1、设定目标主机(Web2:172.16.3.4)

(1)安装相关软件

# yum -y install rsync xinetd

(2)为rsync提供配置文件/etc/rsyncd.conf,内容类似如下内容:

# Section 1: Global settings
uid = nobody
gid = nobody
use chroot = no
max connections = 3
strict modes = yes
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
# Section 2:Directory to be synced
[htdocs]
path = /www/htdocs
ignore errors = yes
read only = no
write only = no
hosts allow = 172.16.0.0/16
hosts deny = *
list = false
uid = root
gid = root
auth users = testuser
secrets file = /etc/rsync.passwd

(3)提供secrets file所指定的口令文件/etc/rsync.passwd,并设置访问权限

# vi /etc/rsync.passwd
testuser:P@ssw0rd
修改权限
# chmod 600  /etc/rsync.passwd

(4)配置服务可以开机启动:

# chkconfig rsync on
# chkconfig xinetd on
# service xinetd start

(5)查看873端口是否在监听,默认情况下,rsyncd监听的端口为873/TCP

# netstat -antp |grep 873
tcp        0      0 :::873                      :::*                        LISTEN      1667/xinetd

(6)创建同步测试目录

# mkdir -pv /www/htdocs

2、配置源主机

(1)安装rsync

yum -y install rsync

(2)为源主机的rsync提供通过htdocsuser用户同步文件至目标主机的口令文件

# echo 'P@ssw0rd' > /etc/rsync.passwd
# chmod 600 /etc/rsync.passwd

(3)手动同步测试

# rsync -avz --password-file /etc/rsync.passwd /etc/inittab [email protected]::htdocs
sending incremental file list
inittab
sent 533 bytes  received 27 bytes  1120.00 bytes/sec
total size is 884  speedup is 1.58

五、利用inotify自动同步

1、安装inotify-tools

软件下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

# tar xf inotify-tools-3.14.tar.gz
# cd inotify-tools-3.14
# ./configure
# make
# make install
# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
# ldconfig

2、创建测试目录

# mkdir -pv /www/htdocs

3、建立脚本/root/bin/htdocsync.sh,通过inotifywait监控目标文件上的相应事件,并在事件触发时启动同步过程:

#!/bin/bash
#
DESTHOST=172.16.3.4
DESTHOSTDIR=/www/htdocs/
SRCDIR=/www/htdocs/
inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e close_write,modify,delete,create,attrib $SRCDIR |  while read DATE TIME DIR FILE; do
       FILECHANGE=${DIR}${FILE}
       rsync -avz --password-file=/etc/rsync.passwd $SRCDIR htdocsuser@${DESTHOST}::htdocs &>/dev/null && \
       echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/websync.log
done

4、执行脚本

chmod +x /root/bin/htdocsync.sh
/root/bin/htdocsync.sh &

5、测试

在web1的/www/htdocs目录创建一个文件,立刻同步到web2


你可能感兴趣的:(rsync,inotify)