文件的同步镜像在很多地方都需要用到,因此rsync这款免费软件得到了广泛的应用,包括在Windows平台上,都已经有了支持rsync的“cwRsyncServer”。 但是,我们一般都是通过结合crontab计划任务来实现文件同步的,这样做的缺点是效率低,不能做到实时同步。 现在,在Linux平台下我们可以利用2.6内核的inotify监控文件系统机制,通过inotify-tools来实现实时同步了。
rsync是linux、UNIX系统下的文件同步数据传输工具,他采用rsync算法使一个客户机和远程文件服务器之间的文件同步。通过 rsync可以将同一个服务器的数据从一个分区备份到另一个分区,也可以将本地系统的数据通过网络传输方式备份到任何一个远程主机上;rsync可以在中 断之后恢复复制,rsync只传输源文件和目标文件不一致的部分,rsync可以执行完整备份或增量备份。
inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13版本起,加入了对inotify的支持。通过inotify可以监控 文件系统中添加、删除、修改、移动等各种细微事件,利用这个内核接口,第三方软件可以监控文件系统下文件的各种变化情况,inotify-tools就是 这样的一个第三方软件。
具体操作如下:
1.安装所需软件 目前各大Linux发行版本都已经具有了rsync与inotify-tools的软件包,推荐通过RPM,yum,apt-get等方式进行安装。 RHEL: [root@server1 ~]# rpm -ivh rsync-* [root@server1 ~]# rpm -ivh inotify-tools-*
CentOS: [root@server1 ~]# yum install rsync inotify-tools
Ubuntu: [root@server1 ~]# apt-get install rsync inotify-tools
采用源码方式安装的步骤如下: [root@server1 ~]# wget ftp://ftp.samba.org/pub/rsync/rsync-3.0.8.tar.gz [root@server1 ~]# tar xzvf rsync-3.0.8.tar.gz [root@server1 ~]# cd rsync-3.0.8 [root@server1 ~]# ./configure [root@server1 ~]# make [root@server1 ~]# make install
[root@server1 ~]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz [root@server1 ~]# tar xzvf inotify-tools-3.14.tar.gz [root@server1 ~]# cd inotify-tools-3.14 [root@server1 ~]# ./configure [root@server1 ~]# make [root@server1 ~]# make install
2.配置ssh key信任 建议通过普通用户进行操作,理由是通过root操作本身就危险,免密码登陆的root就更危险了。
在两台服务器上创建rsync用户 [root@server1 ~]# useradd -m rsync [root@server1 ~]# passwd rsync [root@server2 ~]# useradd -m rsync [root@server2 ~]# passwd rsync
[root@server1 ~]# su - rsync [rsync@server1 ~]$ ssh-keygen -t rsa 在提示保存私钥(key)和公钥(public key)的位置时,使用默认值; 在提示是否需要私钥密码(passphrase)时,直接敲回车,即不使用私钥密码。 之后,将生成一对密钥,id_rsa(私钥文件)和id_rsa.pub(公钥文件),保存在/home/rsync/.ssh/目录下。
将公钥添加到远程主机的 authorized_keys 文件中 将文件上传到远程主机(假设远程主机IP为192.168.10.4) [rsync@server1 ~]$ scp ~/.ssh/id_rsa.pub rsync@192.168.10.4:/home/rsync/
使用rsync用户SSH到登陆到远程主机,并将公钥添加到 authorized_keys 文件中 [rsync@server2 ~]$ mkdir .ssh [rsync@server2 ~]$ chmod 700 .ssh [rsync@server2 ~]$ mv ~/id_rsa.pub ~/.ssh/authorized_keys
重启SSH服务 [root@server1 ~]# /etc/init.d/sshd restart [root@server2 ~]# /etc/init.d/sshd restart
3.创建inotify_rsync.sh脚本 [root@server1 ~]# vim inotify_rsync.sh
1 |
#!/bin/sh |
2 |
SRC=/home/ rsync / test |
3 |
DST= rsync @192.168.10.4:/home/ rsync / test |
4 |
5 |
su - rsync |
6 |
inotifywait -mrq -e modify,delete,create,attrib ${src} | while read D E F |
7 |
do |
8 |
/usr/bin/ rsync -ahqzt --delete $SRC $DST |
9 |
done |
相关注解如下: /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src} -m 是保持一直监听 -r 是递归查看目录 -q 是打印出事件 -e create,move,delete,modify,attrib 是指 “监听 创建 移动 删除 写入 权限” 事件
/usr/bin/rsync -ahqzt --delete $SRC $DST -a 存档模式 -h 保存硬连接 -q 制止非错误信息 -z 压缩文件数据在传输 -t 维护修改时间 -delete 删除于多余文件
要排除同步某个目录时,为rsync添加--exculde=PATTERN参数,注意,路径是相对路径,具体查看man rsync。 要排除某个目录的事件监听的处理时,为inotifywait添加--exclude或--excludei参数,具体查看man inotifywait。
inotifywait 命令产生三个返回值,分别是“日期,时间,文件” 这3个返回值会做为参数传给read,因此脚本中的“while read D E F” 写法细化了返回值。
赋予脚本可执行权限 [root@server1 ~]# chmod +x inotify_rsync.sh 执行脚本 [root@server1 ~]# /root/inotify_rsync.sh & 设置脚本开机自启动 [root@server1 ~]# cat "/root/inotify_rsync.sh &" >> /etc/rc.local
4.测试 首先在server1服务器的/home/rsync/test目录下创建文件或目录,然后再到server2的/home/rsync/test目录下查看,如果看到就说明成功了。 [rsync@server1 ~]$ cd test [rsync@server1 test]$ touch a.txt 注意:第一次SSH连接的时候可能需要输入一次密码,之后就不需要输入了。
[rsync@server2 ~]$ cd test [rsync@server2 test]$ ls a.txt
看到了a.txt文件,说明文件同步已经成功!
题外话:关于安全方面,除了使用ssh之外,也可以采用只允许一个ip,其他ip禁止