Linux下Rsync+sersync实现数据实时同步

本教程实现的是Linux服务器之间自动同步文件或目录的功能,网上有很多这方面的教程,大体有两种途径
(1)Rsync+inotify-tools
(2)Rsync+sersync
本教程采用第二种实现.下面先简单介绍几个项目中用到的软件或概念.

  • 软件或概念

Rsync

        Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

Rsync的基本特点如下:

  • 1.可以镜像保存整个目录树和文件系统;
  • 2.可以很容易做到保持原来文件的权限、时间、软硬链接等;
  • 3.无须特殊权限即可安装;
  • 4.优化的流程,文件传输效率高;
  • 5.可以使用rsh、ssh等方式来传输文件,当然也可以通过直接的socket连接;
  • 6.支持匿名传输。

Inotify

        Inotify是一种文件变化通知机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加,删除,修改,移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施这样监控的软件。
Inotify 的实现有几款软件(注意:大前提rsync daemon 服务配置成功,可以在rsync客户端推送拉取数据,然后才能配置inotify服务。)

  •  1.inotify-tools,
  •  2.sersync(金山周洋)
  •  3.lsyncd


Rsync+inotify组合的起源

        Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差异同步。我们可以想象一下,如果服务器的文件数量达到了百万甚至千万量级,那么文件对比将是非常耗时的。而且发生变化的往往是其中很少的一部分,这是非常低效的方式。inotify的出现,可以缓解rsync不足之处,取长补短。


为什么要用Rsync+sersync架构

Rsync+Inotify-tools
(1)Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
(2)rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。


Rsync+sersync
(1)sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;
(2)rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。

小结:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。
——————————————————————————————————


Xinetd

    extended internet daemon
    xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器,常用来管理多种轻量级Internet服务。
    xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。
    —xinetd的特色
    1) 强大的存取控制功能
    — 内置对恶意用户和善意用户的差别待遇设定。
    — 使用libwrap支持,其效能更甚于tcpd。
    — 可以限制连接的等级,基于主机的连接数和基于服务的连接数。
    — 设置特定的连接时间。
    — 将某个服务设置到特定的主机以提供服务。
    2) 有效防止DoS攻击
    — 可以限制连接的等级。
    — 可以限制一个主机的最大连接数,从而防止某个主机独占某个服务。
    — 可以限制日志文件的大小,防止磁盘空间被填满。
    3) 强大的日志功能
    — 可以为每一个服务就syslog设定日志等级。
    — 如果不使用syslog,也可以为每个服务建立日志文件。
    — 可以记录请求的起止时间以决定对方的访问时间。
    — 可以记录试图非法访问的请求。
    4) 转向功能
    可以将客户端的请求转发到另一台主机去处理。
    5) 支持IPv6
    xinetd自xinetd 2.1.8.8pre*起的版本就支持IPv6,可以通过在./configure脚本中使用with-inet6 capability选项来完成。
    注意,要使这个生效,核心和网络必须支持IPv6。IPv4仍然被支持。
    6) 与客户端的交互功能
    无论客户端请求是否成功,xinetd都会有提示告知连接状态。
    —xinetd使用场景
    原则上任何系统服务都可以使用xinetd,然而最适合的应该是那些常用的网络服务,同时,这个服务的请求数目和频繁程度不会太高。像DNS和Apache就不适合采用这种方式,而像FTP、Telnet、SSH等就适合使用xinetd模式。

  • 项目实战

服务器 系统版本 处理器位数 IP
源服务器 Ubuntu 17.04 64位 192.168.4.35
目标服务器 CentOS Linux 7 (Core) 64位 192.168.0.151

目标服务器配置

(1)关闭SELINUX

[root@localhost ~]# vi /etc/sysconfig/selinux

#SELINUX=enforcing    #注释掉
SELINUX=disabled       #增加

    重启系统

    或者

[root@localhost ~]# setenforce 0 #临时关闭(不用重启机器)立即生效

    注意:ubuntu下selinux路径与上述的centos7不同,需执行如下命令:

[root@localhost ~]# vi /etc/selinux/config

    将SELINUX=enforcing改为SELINUX=disabled 后重启机器即可

(2)开启防火墙tcp 873端口(Rsync默认端口)

[root@localhost ~]# vi /etc/sysconfig/iptables #编辑防火墙配置文件
[root@localhost ~] # /etc/init.d/iptables restart #最后重启防火墙使配置生效

    注意:我在centos 7下的/etc/sysconfig未找到iptables 只有ip6tables-config ,iptables-config .这是因为centos 7中iptables已不再是默认的防火墙了.可通过:

[root@localhost]# systemctl stop firewalld
[root@localhost]# systemctl disable firewalld

    关闭centos7的防火墙.至于centos 7如何配置端口过滤,请自行百度.本案例是虚拟机装的centos7,用于学习练手,不存在安全的考虑.所以,直接关闭了防火墙,不做配置.

(3)检查目标机是否安装rsync

[root@localhost sysconfig]# whereis rsync

    rsync: /usr/bin/rsync /usr/share/man/man1/rsync.1.gz #说明已经安装了
    若未安装执行一下命令安装:

[root@localhost ~] # yum install rsync

(4)编辑rsync配置文件

[root@localhost sysconfig]# vi /etc/rsyncd.conf #创建配置文件,添加以下代码
port=873
uid=root
gid=root
max connections=36000
use chroot=no
log file=/var/log/rsyncd.log
log format =  %t %a %m %f %b
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
motd file = /etc/rsyncd.motd
timeout = 600

[sync_sms]
path=/usr/local/tomcat-app/webapps/
list=yes
comment =sms sync
ignore errors = yes
read only = no
hosts allow = *
#hosts deny = *
auth users  = root
secrets file = /etc/rsyncd.password

    用户组最好设置为root,不然文件权限同步过去的时候会变化

  •  secrets file这个是配置同步的密码文件的。
  •  path是配置同步的目录。
  •  hosts allow是允许同步的主机。
  •  hosts deny:拒绝同步的主机。

(5)创建rsync传输过程中的认证文件 ,即在secrets file指定的用户密码文件

[root@localhost]# vim /etc/rsyncd.secrets 内容格式:用户名:密码

    添加如下内容:

root:coolgirl

    或者执行

[root@localhost]# echo user:password >> /etc/rsync.password

    把内容追加到rsync.passwd末尾,然后,更改文件的读写权限为600。

[root@localhost]# chmod 600 /etc/rsync.passwd

(6)创建同步目录,即上述rsyncd.conf中[sync_sms]模块下path指定的路径

[root@localhost]# mkdir -p /usr/local/tomcat-app/webapps/

(7)检查并安装xinetd(关于xinetd的介绍,请参照上文)

    检查系统是否已经安装xinetd

[root@localhost webapps]# whereis xinetd

    xinetd: /usr/sbin/xinetd /etc/xinetd.d /etc/xinetd.conf /usr/share/man/man8/xinetd.8.gz #说明已经安装,否则执行安装:

[root@localhost]# yum -y install xinetd

(8)配置rsync以xinetd方式运行

[root@localhost webapps]# vi /etc/xinetd.d/rsync

    添加如下内容:

service rsync
{
       disable         =no //使其随xinetd启动而启动
       wait            =no
       socket_type     =stream
       user            =root
       server          =/usr/bin/rsync
       server_args     = --daemon #设置成守护进程
       log_on_failure += USERID
}

注意:有的系统rsync是不存在的,可以执行上述命令创建并添加.xinetd的配置/etc/xinetd.conf 已配置包含了 /etc/xinetd.d/下的所有配置信息。

(9)启动rsync与xinetd服务

[root@localhost ~] # systemctl start xinetd #启动xinetd服务
[root@localhost ~] # systemctl enable xinetd #将xinetd服务加入开机项
[root@localhost ~] # rsync –daemon –config=/etc/rsyncd.conf #加载配置文件rsyncd.conf启动rsync服务

说明:–daemon 参数表示 启动rsync守护进程

(10)配置rsync开机自启动

[root@localhost]# echo rsync --daemon --config=/etc/rsyncd.conf >> /etc/rc.d/rc.local

----------------------------------截止目前,目标服务器已经配置完成了--------------------------------

源服务器配置

(1)先到sersync官网下载sersync,也可选择以下地址下载。

[root@localhost]# wget http://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@localhost]# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz

(2)安装sersync
    解压:

[root@localhost]# tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz

    GNU-Linux-x86 为解压后的内容

(3)创建sersync的家目录如下:

[root@localhost]# mkdir /usr/local/sersync
[root@localhost]# mkdir /usr/local/sersync/conf
[root@localhost]# mkdir /usr/local/sersync/bin
[root@localhost]# mkdir /usr/local/sersync/log

(4)进入sersync解压目录,将内容拷贝到新建的sersync家目录中如下:

[root@localhost]# cd GNU-Linux-x86/
[root@localhost]# cp confxml.xml /usr/local/sersync/conf
[root@localhost]# cp sersync2 /usr/local/sersync/bin

(5)创建密码文件

    密码需和目标服务器配置的一致,且不需要用户名.将该文件的权限也更改为600

[root@localhost]# echo coolgirl >> /etc/rsync.password
[root@localhost]# chmod 600 /etc/rsync.password

(6)配置刚刚拷贝过来的config.xml ,路径/usr/local/sersync/conf/config.xml

[root@localhost]# cp config.xml config.xml.bak #配置前提前备份一下

    配置详情介绍,可参照以下示例。

<?xml version="1.0" encoding="UTF-8"?>
<head version="2.5">
     <!--设置本地IP和端口-->
    <host hostip="localhost" port="8008"></host>
     <!--开启DUBUG模式-->
    <debug start="false"/>
     <!--开启xfs文件系统 -->
    <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="false"/>
    <createFolder start="true"/>
    <createFile start="false"/>
    <closeWrite start="true"/>
    <moveFrom start="true"/>
    <moveTo start="true"/>
    <attrib start="false"/>
    <modify start="true"/>
    </inotify>
    <!--本地同步的目录路径-->
    <sersync>
    <localpath watch="/home/jing/projects/svn">
        <!--远程IP和rsync模块名  -->
        <remote ip="192.168.0.151" name="sync_sms"/>
        <!--<remote ip="192.168.8.39" name="tongbu"/>-->
        <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    </localpath>
    <rsync>
        <!--rsync指令参数-->
        <commonParams params="-auvzP"/>
        <!-- rsync同步认证-->
        <auth start="true" users="root" passwordfile="/etc/rsync.passwd"/>
            <!--设置rsync远程服务端口,远程非默认端口则需打开自定义-->
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <!--设置超时时间-->
        <timeout start="true" time="100"/><!-- timeout=100 -->
        <!--设置rsync+ssh加密传输模式,默认关闭,开启需设置SSH加密证书-->
        <ssh start="false"/>
    </rsync>
    <!--sersync传输失败日志脚本路径,每隔60会重新执行该脚本,执行完毕会自动清空。-->
    <failLog path="/usr/local/sersync/log/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    <!--设置rsync+crontab定时传输,默认关闭-->
    <crontab start="false" schedule="600"><!--600mins-->
        <crontabfilter start="false">
        <exclude expression="*.php"></exclude>
        <exclude expression="info/*"></exclude>
        </crontabfilter>
    </crontab>
    <!-- 设置sersync传输后调用name指定的插件脚本,默认关闭-->
    <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>

(7)创建同步目录

[root@localhost]# mkdir /home/jing/projects/svn

(8)设置环境变量

[root@localhost]# echo export PATH=$PATH:/usr/local/sersync/bin/ >> /etc/profile
[root@localhost]# source /etc/profile

(9)启动sersync

[root@localhost]# sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml

注:选项-d 表示开启serync并守护进程,-o表示指定配置文件。

    重启操作:

[root@localhost]# killall sersync2 && sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml

(10)设置开机启动

[root@localhost]# echo sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml >> /etc/rc.local

    源服务器的配置再啰嗦几句:
    本人常用登录账号是非root账户,按照上述配置后,启动sersync2要么说是没有这个命令,要么就是日志报错。

set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
sh: 1: cannot create /proc/sys/fs/inotify/max_user_watches: Permission denied
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
sh: 1: cannot create /proc/sys/fs/inotify/max_queued_events: Permission denied

    提示Permission denied.纠结了很久终于找到了原因.因为我是按照root权限配置,非root账号没有权限访问600权限的配置文件或者密码文件,故报错.解决方案如下:用sudo给非root赋予超管权限,并将sersync2带全路径启动。

[root@localhost]# sudo /usr/local/sersync/bin/sersync2 -r -d -o /usr/local/sersync/conf/conf.xml

    以此命令启动后,发现日志文件不在提示Permission denied错误,在同步目录下,创建目录:

[root@localhost]# cd /home/jing/projects/svn && sudo mkdir -p data/www #注意这里创建时也必须用sudo获取超管身份来创建.

    发现目标主机实时的创建了相同结构的目录.
    此外,为了保险起见,将开机启动设置为如下:

[root@localhost]# echo sudo /usr/local/sersync/bin/sersync2 -r -d -o /usr/local/sersync/conf/conf.xml >> /etc/rc.local #超管权限全路径启动


-------------------------------------好,源服务器已经配置完成了-------------------------------------

        大家可以在刚才源服务器的同步目录 /home/jing/projects/svn下创建文件或目录,看看是否在目标服务器上已做同步.至于,同步的规则,即config.xml的配置详情,是增加,删除,还是定时,这里不做介绍,请自行百度学习,我觉的只要服务器搭好了,这些都是点小问题.


以下提供些参考学习的网站链接
sersyncXML配置:http://www.linuxidc.com/Linux/2012-02/53572p3.htm
http://www.cnblogs.com/sellsa/p/5345092.html
常见错误:http://blog.chinaunix.net/uid-13954085-id-158637.html


文章来源:角古静

猜你喜欢

转载自blog.csdn.net/u011132987/article/details/88843463