linux主从同步,目前广泛采用的方案是使用rsync+inotify的方式来实现文件的触发更新。原理是采用inotify来对文件进行监控,当监控到文件有文件发生改变的时候,就会调用rsync实现触发式实时同步。我采用的是金山的一个居于inotify+rsync进行二次开发实现文件同步的小工具sersync,能够很方便的实现文件触发式同步,所以本文采用的rsync+sersync.
下面的对于inotify的简介都引自 http://blog.chinaunix.net/uid-20639775-id-3011124.html
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)
备注:上面的文件也包括目录。
Rsync简介
rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。
rsync 包括如下的一些特性:
能更新整个目录和树和文件系统;
有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
对于安装来说,无任何特殊权限要求;
对于多个文件来说,内部流水线减少文件等待的延时;
能用rsh、ssh 或直接端口做为传输入端口;
支持匿名rsync 同步文件,是理想的镜像工具;
sersync简介
sersync利用inotify与rsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。由金山的周洋开发完成,是目前使用较多的文件同步工具之一。该工具和其他的工具相比有如下优点:
sersync是使用c++编写,由于只同步发生更改的文件,因此比其他同步工具更节约时间、带宽;
安装方便、配置简单;
使用多线程进行同步,能够保证多个服务器实时保持同步状态;
自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步;
自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次;
自带socket与http协议扩展,你可以方便的进行二次开发;
实现文件同步
环境:主机Aip: 42.62.25.34 从机Bip:42.62.25.198
主机目录: /opt/tongbu 从机目录:/backup/bookfm
要求:实时将文件从主机A的目录,同步到从机B目录
1.安装rsync
yum -y install rsync
主机和从机都要安装rsync
2.配置从机B的配置文件
如果是上述yum安装的话,那么默认安装目录是/usr/bin/rsync,但是默认的配置文件是不存在的,需要新建,一般新建目录/etc/rsyncd 用于存放配置文件
mkdir -p /etc/rsyncd
建立配置文件 rsyncd.conf 和 rsyncd.secret
touch rsyncd.conf
touch rsyncd.secret
rsyncd.conf
uid = root gid = root port = 873 <!--端口号--> max connections = 20000 use chroot = yes timeout = 200 log file = /var/log/rsyncd.log <!--打印的日志文件--> pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log format = %t %a %m %f %b auth users = root secrets file = /etc/rsyncd/rsyncd.secret [tongbu] <!--注意需要指定模块名称--> path = /backup/bookfm <!--同步文件存在于从机的位置--> comment = "test directory file" read only = no ignore errors = yes hosts allow = 42.62.25.34 <!--主机的ip--> auth users=vbuapp <!--允许的用户名称--> hosts deny = * [tongbu1] <!--需要实现多主一从的同步时,再添加一个模块即可--> path = /backup/bookfm1 comment = "test directory file" read only = no ignore errors = yes hosts allow = 42.62.25.47 auth users=vbuapp hosts deny = *
上面即为rsyncd.cnf的内容,其中允许的用户名称,即与密码文件 rsyncd.secret有关
rsyncd.secret
vbuapp:123456
内容很简单 , 用户:密码即可
3.对从机密码文件进行授权,启动
chmod 600 rsyncd.secret 一定要授权
启动从机
/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
查看启动状态
[root@BGP-BJ-F-3f5 rsyncd]# netstat -netlp|grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 0 90613866 651/rsync
(可以看到873端口已经启动,至此从机配置完毕,下面是主机配置)
4.主机安装sersync
此前,主机一定要先安装rsync,sersync与rsync的关系就像eclipse和jdk一样。
网盘地址:http://pan.baidu.com/s/1dDD1ibn
将sersync安装在/user/local文件夹中
mkdir /usr/local/sersync
cd /usr/local/sersync
tar -zxvf sersync_64bit_binary_stable_final.tar.gz
解压后,将看到文件夹GNU-Linux-x86,其中有confxml.xml 和rsyncd.secrets,到此,sersync安装完毕,下面开始配置。
5.配置主机A的配置文件
confxml.xml
<head version="2.5"> <host hostip="localhost" port="8008"></host> <!--端口号--> <debug start="false"/> <fileSystem xfs="false"/> <filter start="false"> <exclude expression="(.*)\.svn"></exclude> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> <exclude expression="^static/*"></exclude> </filter> <inotify> <delete start="true"/> <!--需要监控主机的哪些操作--> <createFolder start="true"/> <createFile start="false"/> <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="true"/> <modify start="true"/> </inotify> <sersync> <localpath watch="/opt/tongbu"> <!--主机需要同步的文件夹--> <remote ip="106.3.37.197" name="tongbu"/> <!--从机ip,模块名称--> <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> <commonParams params="-artuz"/> <auth start="true" users="vbuapp" passwordfile="/usr/local/sersync/GNU-Linux-x86/rsyncd.secrets"/> <!--从机中允许的用户,以及主机中配置的密码文件--> <userDefinedPort start="false" port="873"/><!-- port=874 --> <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> </rsync> <!-- 错误日志文件 每隔60分钟全部同步一次--> <failLog path="/var/rsync/rsync_error.log" timeToExecute="60"/><!--default every 60mins execute once--> <crontab start="false" schedule="600"><!--600mins--> <crontabfilter start="false"> <exclude expression="*.php"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab> <plugin start="false" name="command"/> </sersync> <plugin name="command"> <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--> <filter start="false"> <include expression="(.*)\.php"/> <include expression="(.*)\.sh"/> </filter> </plugin> <plugin name="socket"> <localpath watch="/opt/tongbu"> <deshost ip="192.168.138.20" port="8009"/> </localpath> </plugin> <plugin name="refreshCDN"> <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> <sendurl base="http://pic.xoyo.com/cms"/> <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> </localpath> </plugin> </head>
每次需要修改的部分都已经注释标出,当然也可以直接拷贝上面的内容进行修改,亲测有用。
上面注释中,指出了相应的密码文件,因此新建密码文件
touch rsyncd.secrets
rsyncd.secrets
123456 <!-- 只需要密码-->
配置完之后,对密码文件进行授权
chmod 600 rsyncd.secrets
6.测试从机rsync是否能联通
mkdir /usr/local/sersync/GNU-Linux-x86/test
cd /usr/local/sersync/GNU-Linux-x86/test
rsync -av [email protected]::emlfile . --password-file=../rsyncd.secrets
用户名 从机ip 模块名称 主机密码文件位置
7.启动主机
/usr/local/sersync/GNU-Linux-x86/sersync2 -d -r -o /usr/local/sersync/GNU-Linux-x86/confxml.xml
主机目录/opt/tongbu中添加文件,发现已经能够实时同步到从机/backup/bookfm
如果主机中有多个文件夹需要配置,则copy多个confxml.xml, 如confxml1.xml,修改相关配置,记得要修改端口号,再启动该守护进程,
/usr/local/sersync/GNU-Linux-x86/sersync2 -d -r -o /usr/local/sersync/GNU-Linux-x86/confxml1.xml
netstat -nelp|grep rsync 可以看到有两个不同端口号的rsync进程。