首页 > 代码库 > linux主从实时同步

linux主从实时同步

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,文件属性被修改,如 chmodchowntouch 

·         IN_CLOSE_WRITE,可写文件被 close

·         IN_CLOSE_NOWRITE,不可写文件被 close

·         IN_OPEN,文件被 open

·         IN_MOVED_FROM,文件被移走, mv

·         IN_MOVED_TO,文件被移来,如 mvcp

·         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简介

 rsyncremote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。rsync是用 “rsync 算法提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。

rsync 包括如下的一些特性:

  • 能更新整个目录和树和文件系统;

  • 有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;

  • 对于安装来说,无任何特殊权限要求;

  • 对于多个文件来说,内部流水线减少文件等待的延时;

  • 能用rshssh 或直接端口做为传输入端口;

  • 支持匿名rsync 同步文件,是理想的镜像工具;


  • sersync简介

sersync利用inotifyrsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。由金山的周洋开发完成,是目前使用较多的文件同步工具之一。该工具和其他的工具相比有如下优点:

  • sersync是使用c++编写,由于只同步发生更改的文件,因此比其他同步工具更节约时间、带宽;

  • 安装方便、配置简单;

  • 使用多线程进行同步,能够保证多个服务器实时保持同步状态;

  • 自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步;

  • 自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次;

  • 自带sockethttp协议扩展,你可以方便的进行二次开发;




  • 实现文件同步

  环境:主机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.con 

查看启动状态 

[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 vbuapp@42.62.25.198::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进程。






本文出自 “bulajunjun” 博客,请务必保留此出处http://5148737.blog.51cto.com/5138737/1569862

linux主从实时同步