700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 使用sersync实现多台服务器实时同步文件

使用sersync实现多台服务器实时同步文件

时间:2021-01-28 03:27:55

相关推荐

使用sersync实现多台服务器实时同步文件

一、Sersync项目介绍

项目地址:/p/sersync/

我们常用到的是rsync+inotify来对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。

目前使用的比较多的同步程序版本是inotify-tools,另外一个是google开源项目Openduckbill(依赖于inotify-tools),这两个都是基于脚本语言编写的,其设计思路同样是采用inotify与rsync命令。 相比较上面两个项目,本项目优点是:

sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(详细见附录,这个过滤脚本程序没有实现),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。

相比较上面两个项目,sersync配置起来很简单,其中bin目录下已经有基本上静态编译的2进制文件,配合bin目录下的xml配置文件直接使用即可。

另外本项目相比较其他脚本开源项目,使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。

本项目有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步。

本项目自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能。

本项目socket与http插件扩展,满足您二次开发的需要。

二、基本架构

如上图所示,线程组线程是等待线程队列的守护线程,当队列中有数据的时候,线程组守护线程逐个唤醒,当队列中inotify事件较多的时候就会被全部唤醒一起工作。这样设计的目的是能够同时处理多个inotify事件,重发利用服务器的并发能力(核数*2+2)。

之所以称之为线程组线程,是因为每个线程在工作的时候,会根据服务器的数量建立子线程,子线程可以保证所有的文件与各个服务器同时同步,当要同步的文件较大的时候,这样设计可以保证各个远程服务器可以同时获得要同步的文件。

服务线程的作用有三个,首先是处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成rsync_fail_log.sh脚本,记录失败的事件。同时每隔10个小时执行脚本一次,同时清空脚本。服务线程的第三个作用是crontab功能,可以每隔一定时间,将所有路径整体同步一次。

由此图总结可见:

sersync支持多线程;支持队列过滤,节省网络带宽;失败后重传机制;具有socket,httpd等套接字,方便二次开发。

Sersync还具有一下机制:

能实现双向同步,只需要在两个机器上都配置就行了;

双向同步过程中,如果同事修改一个文件,则以时间为准

在在

三、Sersync安装和配置具体步骤

1.1.1.1 server

1.1.1.2 client

1 、Server端安装

#wget/files/sersync2.5_32bit_binary_stable_final.tar.gz#tarxfsersync2.5_32bit_binary_stable_final.tar.gz#cdGNU-Linux-x86/

通过以上简单三步,即可完成其安装!解压后里面就两个文件,一个sersync2和一个confxml.xml,其中第一个是一个二进制文件,也即是开户服务的文件,后面的是配置文件!

下面对配置文件进行解释

<?xmlversion="1.0"encoding="ISO-8859-1"?><headversion="2.5"><hosthostip="localhost"port="8008"></host> #针对插件保留的,默认配置即可<debugstart="false"/> #开户debug信息,会在sersync当前运行台,打印Debug信息<fileSystemxfs="false"/> #是否支持xfs文件系统<filterstart="false"> # 是否开户文件过滤,可以在下面添加过滤类型<excludeexpression="(.*)\.svn"></exclude><excludeexpression="(.*)\.gz"></exclude><excludeexpression="^info/*"></exclude><excludeexpression="^static/*"></exclude></filter><inotify> # inotify监控的事件<deletestart="false"/> #是否保持Sersync和同步端两端文件完全一致<createFolderstart="true"/>#创建目录的支持,如果不开户,不能监控子目录<createFilestart="false"/> #是否监控文件的创建<closeWritestart="true"/> #是否监控文件关闭,开户可保证文件的完整性<moveFromstart="true"/> <moveTostart="true"/> <attribstart="false"/><modifystart="false"/></inotify><sersync><localpathwatch="/data/mp3/">#这里定义要监控的本地目录,这个很重要<remoteip="1.1.1.100"name="mp3"/> #要同步到哪台服务器,Rsync标签是什么<!--<remoteip="192.168.8.39"name="tongbu"/>--><!--<remoteip="192.168.8.40"name="tongbu"/>--></localpath><rsync> #配置Rsync信息<commonParamsparams="-artuz"/> #rsync的参数<authstart="true"users="syncuser"passwordfile="/etc/rsyncd/rsyncd.pass"/><userDefinedPortstart="false"port="874"/><!--port=874--> # 定义rsync端口<timeoutstart="false"time="100"/><!--timeout=100--> #定义传输超时时间<sshstart="false"/> #Rsync的时候,是否使用ssh加密</rsync><failLogpath="/tmp/rsync_fail_log.sh"timeToExecute="60"/><!--defaultevery60minsexecuteonce--><crontabstart="false"schedule="600"><!--600mins--> #定义crontab定期完全同步两端文件<crontabfilterstart="false"> #crontab同步时候的过滤条件,上面的过滤部开头要开<excludeexpression="*.php"></exclude><excludeexpression="info/*"></exclude></crontabfilter></crontab><pluginstart="false"name="command"/> # 下面就是一些插件的设置了</sersync><pluginname="command"><paramprefix="/bin/sh"suffix=""ignoreError="true"/><!--prefix/opt/tongbu/mmm.shsuffix--><filterstart="false"><includeexpression="(.*)\.php"/><includeexpression="(.*)\.sh"/></filter></plugin><pluginname="socket"><localpathwatch="/opt/tongbu"><deshostip="192.168.138.20"port="8009"/></localpath></plugin><pluginname="refreshCDN"><localpathwatch="/data0/htdocs//site/"><cdninfodomainname=""port="80"username="xxxx"passwd="xxxx"/><sendurlbase="/cms"/><regexurlregex="false"match="/site([/a-zA-Z0-9]*)./p_w_picpaths"/></localpath></plugin></head>

因为这里rsync的时候,使用了认证用户和密码,所以要定义一下密码文件

#vim/etc/rsyncd/rsyncd.pass123456

然后权限改为600

#chmod600/etc/rsyncd/rsyncd.pass

上面对配置文件进行了简单的说明,下面详细的说一下!

<hosthostip="localhost"port="8008"></host>

hostip与port是针对插件的保留字段,对于同步功能没有任何作用,保留默认即可。

<filterstart="true"><excludeexpression="(.*)\.gz"></exclude><excludeexpression="^info/*"></exclude></filter>

将start设置为 true,在exclude标签中,填写正则表达式,默认给出两个例子分别是过滤以”.gz”结尾的文件与过滤监控目录下的info路径(监控路径/info /*),可以根据需要添加,但开启的时候,自己测试一下,正则表达式如果出现错误,控制台会有提示。相比较使用rsync 的exclude功能,被过滤的路径,不会加入监控,大大减少rsync的通讯量。

<inotify><deletestart="true"/><createFolderstart="true"/><createFilestart="true"/></inotify>

对于大多数应用,可以尝试把createFile(监控文件事件选项)设置为false来提高性能,减少 rsync通讯。因为拷贝文件到监控目录会产生create事件与close_write事件,所以如果关闭create事件,只监控文件拷贝结束时的事 件close_write,同样可以实现文件完整同步。

注意:强将createFolder保持为true,如果将createFolder设为false,则不会对产生的目录进行监控,该目录下的子文件与子目录也不会被监控。所以除非特殊需要,请开启。默认情况下对创建文件(目录)事件与删除文件(目录)事件都进行监控,如果项目中不需要删除远程目标服务器的文件(目录),则可以将delete 参数设置为false,则不对删除事件进行监控。

<debugstart="false"/>

设置为true,开启debug模式,会在sersync正在运行的控制台,打印inotify事件与rsync同步命令。

<fileSystemxfs="false"/>

对于xfs文件系统的用户,需要将这个选项开启,才能使sersync正常工作.

<localpathwatch="/opt/tongbu"><remoteip="192.168.0.104"name="tongbu1"/><!--<remoteip="192.168.8.39"name="tongbu"/>--><!--<remoteip="192.168.8.40"name="tongbu"/>--></localpath>

文件监控与远程同步设置,这里使用watch设定本地要监控的目录,使用remote设置远端的服务器IP,使用name设置无端rsync服务里面定义的标签

<rsync><commonParamsparams="-artuz"/><authstart="false"users="root"passwordfile="/etc/rsync.pas"/><userDefinedPortstart="false"port="874"/><!--port=874--><timeoutstart="false"time="100"/><!--timeout=100--><sshstart="false"/></rsync>

commonParams可以用户自定义rsync参数,默认是-artuz

auth start=”false” 设置为true的时候,使用rsync的认证模式传送,需要配置user与passwrodfile(–password-file=/etc/rsync.pas),来使用。userDefinedPort 当远程同步目标服务器的rsync端口不是默认端口的时候使用(–port=874)。timeout设置rsync的timeout时间(–timeout=100)。ssh 使用rsync -e ssh的方式进行传输。

<failLogpath="/tmp/rsync_fail_log.sh"timeToExecute="60"/>

对于失败的传输,会进行重新传送,再次失败就会写入rsync_fail_log,然后每隔一段时间(timeToExecute进行设置)执行该脚本再次重新传送,然后清空该脚本。可以通过path来设置日志路径。

<crontabstart="false"schedule="600"><!--600mins--><crontabfilterstart="false"><excludeexpression="*.gz"></exclude><excludeexpression="info/*"></exclude></crontabfilter></crontab>

crontab可以对监控路径与远程目标主机每隔一段时间进行一次整体同步,可能由于一些原因两次失败重传都失败了,这个时候如果开启了crontab功 能,还可以进一步保证各个服务器文件一致,如果文件量比较大,crontab的时间间隔要设的大一些,否则可能增加通讯开销。schedule这个参数是设置crontab的时间间隔,默认是600分钟

如果开启了filter文件过滤功能,那么crontab整体同步也需要设置过滤,否则虽然实时同步的时候文件被过滤了,但crontab整体同步的时候 如果不单独设置crontabfilter,还会将需过滤的文件同步到远程,crontab的过滤正则与filter过滤的不同,也给出了两个实例分别对 应与过滤文件与目录。总之如果同时开启了filter与crontab,则要开启crontab的crontabfilter,并按示例设置使其与filter的过滤一一对应。

2、client配置Rsync服务

首先安装rsync

#sudoapt-getinstallrsync

然后定义rsync的配置文件

#Section1:Globalsettingsport=873uid=rootgid=rootusechroot=yesreadonly=nomaxconnections=7pidfile=/var/run/rsyncd.pidlogfile=/var/log/rsyncd.loghostsallow=*transferlogging=yeslogformat=%t%a%m%f%bsyslogfacility=local3timeout=300#Section2:Directorytobesynced[mp3]path=/data/list=yesignoreerrors=yesauthusers=syncusersecretsfile=/etc/rsyncd/rsync.pass

定义一下密码文件

#vim/etc/rsyncd/rsync.passsyncuser:123456

然后就可以开户服务了

[root@node100~]#rsync--daemon--config=/etc/rsync.conf[root@node100~]#ps-ef|greprsyncroot31241017:26?00:00:00rsync--daemon--config=/etc/rsync.confroot31303085017:26pts/000:00:00greprsync

如果需要将sersync运行前,已经存在的所有文件或目录全部同步到远程,要以-r参数运行sersync,将本地与远程整体同步一次。

如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步。-r参数将会无效。

./sersync2-r

开户服务使用以下命令

./sersync2-d

对于sersync使用可执行文件目录下的默认配置文件confxml.xml,如果需要使用另一个配置文件,可以使用-o参数指定其它配置文件。

./sersync2-oXXXX.xml

指定默认的线程池的线程总数

./sersync2-nnum

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。