rsync+sersync+inotify实现服务器间文件同步

步骤一:rsync安装配置

安装和使用rsync

2.1 rsync的安装

每个镜像服务器(需要同步的服务器)都需要安装rsync守护进程。

一般发行版都带有rsync,因此我这里直接使用yum安装。当然在很多发行版上默认已经安装了rsync。

 代码如下 复制代码

    [root@web1 ~]# yum install rsync

    [root@web1 ~]# rpm -ql rsync
    /etc/xinetd.d/rsync
    /usr/bin/rsync
    /usr/share/doc/rsync-3.0.6
    /usr/share/doc/rsync-3.0.6/COPYING
    /usr/share/doc/rsync-3.0.6/NEWS
    /usr/share/doc/rsync-3.0.6/OLDNEWS
    /usr/share/doc/rsync-3.0.6/README
    /usr/share/doc/rsync-3.0.6/support
    /usr/share/doc/rsync-3.0.6/support/Makefile
    /usr/share/doc/rsync-3.0.6/support/atomic-rsync
    /usr/share/doc/rsync-3.0.6/support/cvs2includes
    /usr/share/doc/rsync-3.0.6/support/deny-rsync
    /usr/share/doc/rsync-3.0.6/support/file-attr-restore
    /usr/share/doc/rsync-3.0.6/support/files-to-excludes
    /usr/share/doc/rsync-3.0.6/support/git-set-file-times
    /usr/share/doc/rsync-3.0.6/support/logfilter
    /usr/share/doc/rsync-3.0.6/support/lsh
    /usr/share/doc/rsync-3.0.6/support/mnt-excl
    /usr/share/doc/rsync-3.0.6/support/munge-symlinks
    /usr/share/doc/rsync-3.0.6/support/rrsync
    /usr/share/doc/rsync-3.0.6/support/rsyncstats
    /usr/share/doc/rsync-3.0.6/support/savetransfer.c
    /usr/share/doc/rsync-3.0.6/tech_report.tex
    /usr/share/man/man1/rsync.1.gz
    /usr/share/man/man5/rsyncd.conf.5.gz

rsync是由超级守护进程xinetd来启动的。因此需要启动xinetd服务。

2.2 配置rsync服务器

rsync服务器主要有三个配置文件:rsyncd.conf,rsyncd.secrets和rsyncd.motd,而rsync安装后并没有自动创建相关配置文件,因此我们还需手动创建:

 代码如下 复制代码

    [root@web1 ~]# mkdir /etc/rsyncd  ##创建配置目录
    [root@web1 ~]# touch /etc/rsyncd/rsyncd.conf  ##创建主配置文件
    [root@web1 ~]# touch /etc/rsyncd/rsyncd.secrets  ##创建用户密码文件
    [root@web1 ~]# chmod 600 /etc/rsyncd/rsyncd.secrets ##修改用户密码文件
    [root@web1 ~]# touch /etc/rsyncd/rsyncd.motd   ##创建定义服务器信息的文件

编辑主配置文件:

  

 代码如下 复制代码

  [root@web1 ~]# vi /etc/rsyncd/rsyncd.conf

    # Minimal configuration file for rsync daemon
    # See rsync(1) and rsyncd.conf(5) man pages for help

    # This line is required by the /etc/init.d/rsyncd script
    pid file = /var/run/rsyncd.pid
    port = 873   ##监听端口
    address = 192.168.204.129  ##监听地址
    #uid = nobody
    #gid = nobody 
    uid = root
    gid = root

    use chroot = yes   ##是否限制在指定目录,为了安装,一般需要启用
    read only = no

    #limit access to private LANs
    hosts allow=192.168.204.0/255.255.255.0   ##允许网段
    hosts deny=*

    max connections = 5
    motd file = /etc/rsyncd/rsyncd.motd

    #This will give you a separate log file
    #log file = /var/log/rsync.log

    #This will log every file transferred - up to 85,000+ per user, per sync
    #transfer logging = yes

    log format = %t %a %m %f %b
    syslog facility = local3
    timeout = 300

    ##定义一个同步目录

    [webhome]
    path = /var/www/html
    list=yes
    ignore errors
    auth users = apache
    secrets file = /etc/rsyncd/rsyncd.secrets  ##指定上述账号密码文件
    comment = web home

    exclude =   data/   ##排除目录

编辑/etc/rsyncd/rsyncd.secrets文件:

 代码如下 复制代码

    [root@web1 ~]# vi /etc/rsyncd/rsyncd.secrets

    apache:password123

    ##注意,这个账号是系统账号,但没有使用系统账号的密码,而是自定义密码

重启使rsync生效:

  

 代码如下 复制代码
  [root@web1 ~]# /usr/bin/rsync --daemon  --config=/etc/rsyncd/rsyncd.conf

设置为开机启动:

  

 代码如下 复制代码
  [root@web1 ~]# echo "/usr/bin/rsync --daemon  --config=/etc/rsyncd/rsyncd.conf" >> /etc/rc.d/rc.local

2.3 使用rsync客户端实现数据同步

客户端安装同上,额外只需配置一个密码文件,具体如下:

  

 代码如下 复制代码

  [root@web2 ~]# mkdir /etc/rsyncd  ##创建配置目录
    [root@web2 ~]# echo “passowd123”> /etc/rsyncd/rsyncd.password  ##创建密码文件,密码为服务器端rsyncd.secrets文件中的密码。

    [root@web2 ~]# chmod 600 /etc/rsyncd/rsyncd.password

同步:

 

 代码如下 复制代码

   [root@web2 ~]# rsync -avzP --delete  --password-file=/etc/rsyncd/rsyncd.password apache@web1::webhome /var/www/html/

    receiving incremental file list
    ./
    index.html
              22 100%   21.48kB/s    0:00:00 (xfer#1, to-check=1/3)
    newpage.html
              26 100%    0.63kB/s    0:00:00 (xfer#2, to-check=0/3)

    sent 100 bytes  received 264 bytes  728.00 bytes/sec
    total size is 48  speedup is 0.13

说明:

--delete:本地与服务器完全一样,如果本地存在不一样的,则删除,慎用

--password-file:指定密码文件,如果不指定,则需手动输入

-a :参数,相当于-rlptgoD,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
-z :传输时压缩;
-P :传输进度;
-v :传输时的进度等信息

apache@web1::webhome  用双冒号引用主配置文件中的定义资源,也可以使用单引号跟绝对路径

以后同步时,只会同步新增内容。

最后将上述命令加入计划任务定时同步即可。

可能存在的问题:

    防火墙端口开发问题:iptables -A INPUT -p tcp -m state --state NEW  -m tcp --dport 873 -j ACCEPT
    权限问题,需要写权限

步骤二:sersync+inotify实现同步

在使用sersync之前,我们必须安装配置好rsync服务器。这里我们需要注意的是,纯粹的使用rsync做单向同步时,rsync的守护进程是运行在文件推送的服务器上,而接收的服务器是运行rsync客户端。使用sersync做文件实时同步刚好相反,用于接收文件的服务器运行rsync守护进程。

一、安装sersync:

下载地址:https://code.google.com/p/sersync/downloads/list

但须注意,由于我们天朝伟大的防火墙,这个地址可能是打不开的,可能需要翻墙后才能打开。

可选下载包有免编译二进制包和编译安装源码。(www.111cn.Net)我这里以二进制为例,下载后包含一个配置文件和一个可执行文件。

 代码如下 复制代码

[root@web1 GNU-Linux-x86]# ll
总用量 1772
-rwxr-xr-x 1 root root    2214 10月 26 2011 confxml.xml
-rwxr-xr-x 1 root root 1810128 10月 26 2011 sersync2
为了方便使用,我们将其拷贝到如下目录:
[root@web1 GNU-Linux-x86]# mkdir /usr/local/sersync
[root@web1 GNU-Linux-x86]# mv * /usr/local/sersync
二、基本配置:
2.1 创建密码文件:
[root@web1 sersync]# pwd
/usr/local/sersync

[root@web1 sersync]# echo "password@123" > rsync.passwd
[root@web1 sersync]# chmod 600 rsync.passwd
2.2 编辑主配置文件:
以下红色部分为我修改的:

[root@web1 sersync]# vi confxml.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>
    <fileSystem xfs="false"/>

<!--监控事件的过程中过滤特定文件,和特定文件夹的文件 -->
    <filter start="true">
        <exclude expression="(.*).html"></exclude>
        <exclude expression="(.*).php"></exclude>

        <exclude expression="(.*).jpg"></exclude>

        <exclude expression="(.*).gif"></exclude>

        <exclude expression="(.*).png"></exclude>

        <exclude expression="(.*).css"></exclude>

        <exclude expression="(.*).js"></exclude>

        <exclude expression="^tmp/*"></exclude>
    </filter>

<!--设置要监控的事件 -->
    <inotify>
        <delete start="true"/>
        <createFolder start="true"/>
        <createFile start="true"/>
        <closeWrite start="true"/>
        <moveFrom start="true"/>
        <moveTo start="true"/>
        <attrib start="false"/>
        <modify start="true"/>
    </inotify>

    <sersync>

     <!--设定监控目录-->
        <localpath watch="/var/www/html">

            <!--指定远端rsync的地址和模块名-->

            <remote ip="192.168.204.129" name="webhome"/>
            <!--<remote ip="192.168.204.128" name="tongbu"/>-->
            <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        </localpath>

    <rsync>
        <commonParams params="-artuz"/>

       <!--是否启用验证,并指定密码存放文件 -->
        <auth start="true" users="apache" passwordfile="/usr/local/sersync/rsync.passwd" />
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
        <timeout start="false" time="100"/><!-- timeout=100 -->
        <ssh start="false"/>
    </rsync>
    <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once—>

    <!--是否启用执行完整rsync,并指定执行周期 -->    
    <crontab start="true" schedule="1200"><!--600mins-->
        <crontabfilter start="true">

        <exclude expression="(.*).html"></exclude>
        <exclude expression="(.*).php"></exclude>

        <exclude expression="(.*).jpg"></exclude>

        <exclude expression="(.*).gif"></exclude>

        <exclude expression="(.*).png"></exclude>

        <exclude expression="(.*).css"></exclude>

        <exclude expression="(.*).js"></exclude>

        <exclude expression="^tmp/*"></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>

三、启用同步功能:

再次强调,所有sersync客户端都需要安装rsync,并启动为服务。在上述配置文件中须将所有需要同步的客户端IP(即rsync服务器端)加入。

使用如下命令进行初始化同步,并监视指定目录变化情况:

 代码如下 复制代码
[root@web2 sersync2]# ./sersync2 -r
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -r     rsync all the local files to the remote servers before the sersync work
daemon thread num: 10
parse xml config file
host ip : localhost    host port: 8008
use rsync password-file :
user is    apache
passwordfile is     /etc/rsyncd/rsyncd.password
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /var/www/html && rsync -artuz -R --delete ./  --port=873 apache@192.168.204.129::webhome --password-file=/etc/rsyncd/rsyncd.password >/dev/null 2>&1
run the sersync:
watch path is: /var/www/html

可以用如下参数指定线程数,使其并发执行:

 代码如下 复制代码
./sersync -n num

其他参数:

参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
加入开机启动:

 代码如下 复制代码

[root@web2 sersync2]# echo "/usr/local/sersync2/sersync2 -d -o /usr/local/sersync2/confxml.xml" >>/etc/rc.d/rc.local

时间: 2024-11-24 07:06:19

rsync+sersync+inotify实现服务器间文件同步的相关文章

linux系统中rsync+inotify实现服务器之间文件实时同步_Linux

之前做了"ssh信任与scp自动传输脚本"的技术文档,此方案是作为公司里备份的方法,但在实际的运行中,由于主服务器在给备份服务器传输的时候,我们的主服务器需要备份的文件是实时.不停的产生的,造成不知道主服务器给备份服务器传输了多少文件,磁盘空间就那么大,做备份的原因:一个是为了保持文件,另外一个是解决主服务器的磁盘饱满问题,但由于不知道备份服务器到底接收了多少文件,所以主服务器里的文件不敢删除(如果没有备份的情况下删除,问题就严重了,我这个是政府的项目,服务器里的文件都是重要的,删错了

rsync与inotify集成实现数据实时同步更新

上篇文章我们介绍了如何使用rsync同步文件,这篇文章我们再来介绍下,如何把rsync与inotify集成实现数据的实时同步. 要达到这个目的,我们需要分以下几个步骤: 1.rsync的优点与不足 2.inotify是什么 3.检测OS是否支持inotify 4.inotify相关参数详解 5.inotify监控的文件事件类似 6.inotify-tools是什么 7.安装inotify-tools 8.inotifywait使用详解 9.inotifywatch使用详解 10.inotif-t

linux两个服务器中文件同步删除

问题描述 linux两个服务器中文件同步删除 有两台linux服务器A.B各自有个目录dirA.dirB,它们有共同的文件(修改日期和文件大小等完全相同),现在想把dirB中所有dirA中具有的文件删除掉,保留与dirA不同的部分(dirA不动).有没有好的工具或思路. 解决方案 试一下rsync吧,基本上可以实现你的需求.

java实现两台服务器间文件复制的方法_java

本文实例讲述了java实现两台服务器间文件复制的方法.分享给大家供大家参考.具体分析如下: 通常我们使用最多的文件复制功能就是同服务器之间的文件复制功能,这里介绍的是在普通文件复制上功能升级,可以实现两台服务器实现文件的复制,下面一起来看看代码. 1.服务器端 复制代码 代码如下: package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOut

一分钟了解阿里云产品:利用Rsync服务SLB下多台centos服务器网站文件同步更新

易淘帮使用了SLB负载均衡,为了保证SLB下两台服务器下面的网站文件同步,易淘帮采用了rsync服务进行同步,每三分钟进行同步一次.   简单介绍下reync,rsync-remote synchronize是类unix系统下的数据镜像备份工具,它的特性如下: 1.  可以镜像保存整个目录树和文件系统. 2.  可以很容易做到保持原来文件的权限.时间.软硬链接等等. 3.  无须特殊权限即可安装. 4.  快速:第一次同步rsync会复制全部内容,当在下一次只传输修改过的文件.Rsync在传输数

面试题 如何在多服务器间保证同步。

问题描述 今天面试时被问到这个问题,大家认为怎么做好? 解决方案 解决方案二:周六面试....解决方案三:其实说的有点不清楚,是说在多个服务器间访问数据时,如何保证事务的正确执行,我在题目中说保持同步,完全变成另外的事情了.解决方案四:题目我没说清楚,应该是在多个数据库服务器间访问时,如何保证所有的数据库操作要么全部执行,要么全部rollback.解决方案五:这已经不单单是代码层的问题了得考虑数据库之间的主从关系,热备问题解决方案六:现在大体需要一个说明,自己虽然没做过,但是总会遇到的所以想知道

php curl下载文件来处理服务器间文件手动同步

有一个需求,情况如下: 两台服务器,一台测试服务器[apache],一台生产服务器[nginx],产品编辑人员在测试服务器使用php upload批量上传产品,图片,经检查后, 可以同步其所上传的产品和图片[打包成zip文件]到生产服务器上,但生产服务器上不接受php upload上传文件的,那么就不能在测试服务器上直接post到正式 服务器了.   暂时想到几个方法: 1. 使用rsync手动同步过去,但需要配置,并且需要php执行shell命令,但我不想这样. 2. 可以使用socket来传

linux中rsync异步服务器实现文件同步与备份

  Rsync 非常适合在两台机器之间快速同步大型.复杂的目录,例如论坛的附件目录.再配合 ssh ,则安全性也有保证,且可以利用 ssh public key 和 cron 来进行自动定时同步. 说明:两台机器分别为 localhost 和 remotehost ;用户分别为 localuser 和 remoteuser. 环境:FreeBSD 4.9 和 FreeBSD 6.1  代码如下   设置 ssh public key 认证 $ssh-keygen -t dsa -b 2048 生

cwRsync实现windows服务器间的同步备份

cwrsync分客户端和服务端两部分,拿cwrsync 4.0.版来说,分别对应cwRsync_4.0.5_Installer.zip和cwRsyncServer_4.0.5_Installer.zip 1.cwRsync服务端的安装配置1)在域服务器上安装cwRsyncServer的服务器端(cwRsyncServer_4.0.5) 注:在安装过程中会出现如下所示,即cwRsync的默认用户名和密码:  必须修改为当前系统管理员的用户名和密码,用来启动cwRsync服务:  3)准备将域服务器