在做网站或者文件服务集群时,通常会用rsync + inotify的方式实现各服务器间的文件同步,而使用脚本实现同步的效率较为低下,因此,这里我将使用sersync实现这一功能。
1.Inotify简介
Inotify 是基于inode级别的文件系统监控技术,是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能,内核要求2.6.13以上,inotify能监控非常多的文件系统事件,通过监控这些事件来监控文件是否发生变更,然后通过rsync来更新发生变更的文件,Inotify 可以监视的文件系统事件包括:
IN_ACCESS,即文件被访问
IN_MODIFY,文件被 write
IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
IN_CLOSE_WRITE,可写文件被 close
IN_CLOSE_NOWRITE,不可写文件被 close
IN_OPEN,文件被 open
IN_MOVED_FROM,文件被移走,如 mv
IN_MOVED_TO,文件被移来,如 mv、cp
IN_CREATE,创建新文件
IN_DELETE,文件被删除,如 rm
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
IN_UNMOUNT,宿主文件系统被 umount
IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)
备注:上面的文件也包括目录。
2.rsync简介
rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。
rsync 包括如下的一些特性:
能更新整个目录和树和文件系统;
有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
对于安装来说,无任何特殊权限要求;
对于多个文件来说,内部流水线减少文件等待的延时;
能用rsh、ssh 或直接端口做为传输入端口;
支持匿名rsync 同步文件,是理想的镜像工具;
3.sersync简介
sersync利用inotify与rsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。由金山的周洋开发完成,是目前使用较多的文件同步工具之一。该工具和其他的工具相比有如下优点:
sersync是使用c++编写,由于只同步发生更改的文件,因此比其他同步工具更节约时间、带宽;
安装方便、配置简单;
使用多线程进行同步,能够保证多个服务器实时保持同步状态;
自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步;
自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次;
自带socket与http协议扩展,你可以方便的进行二次开发;
4.使用sersync实现触发式文件同步实例:
实验环境:
主服务器:192.168.1.60
从服务器:192.168.1.66
操作系统版本:Redhat5.8-32bit
(1)从服务器配置:
(a)安装rsync服务
yum install rsync -y
(b)编辑/etc/rsyncd.conf文件,(配置文件通常需要手动创建)
# Rsync configuration fileuid = rootgid = rootport = 873max connections = 20000use chroot = yestimeout = 200log file = /var/log/rsyncd.logpid file = /var/run/rsyncd.pidlock file = /var/run/rsyncd.locklog format = %t %a %m %f %bauth users = rootsecrets file = /etc/rsyncd.secrets[webfile] #设置模板path = /web/test/ #同步文件的目录comment = "test directory file"list = yes #是否允许列出文件read only = noignore errors = yeshosts allow = 192.168.1.60/24 #访问权限hosts deny = *
(c)rsync密码文件创建
echo "root:redhat" > /etc/rsync.secretchmod 600 /etc/rsync.secret #更改密码文件的权限
(d)启动rsync服务
rsync --daemon --config=/etc/rsyncd.conf
(e)验证服务是否启动
[root@mail test]# netstat -lntup | grep rsynctcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7541/rsync tcp 0 0 :::873 :::* LISTEN 7541/rsync
(2)主服务器配置
(a)安装rsync
yum install -y rsync
(b)安装sersync
下载sersync
解压并移动至相应目录
tar xf sersync_32bit_binary_stable_final.tar.gz mv GNU-Linux-x86/ /usr/local/sersync/
(c)配置sersync
1 2 34 5 6 7 8 9 10 11 12 13 22 2314 15 16 17 18 19 20 21 24 43 4425 26 27 28 3429 30 31 32 33 35 36 37 38 39 40 41 42 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
(d)创建密码文件
echo "redhat" > /etc/rsync.secret
只需要密码即可,否则会报错
(e)启动sersync
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
在主服务器上进行文件更新,检测从服务器是否能够同步成功。
至此,基于sersync实现触发式文件同步的实验完成。
附:
为防止sersync意外关闭,可使用如下脚本
#!/bin/bash#Purpose: Check sersync whether it is aliveSERSYNC="/usr/local/sersync/sersync2"CONF_FILE="/usr/local/sersync/confxml.xml"STATUS=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)if [ $STATUS -eq 0 ]; then $SERSYNC -d -r -o $CONF_FILE &fi
添加至任务计划中
*/5 * * * * /root/script/check_sersync.sh &> /dev/null