sersync+rsync实现文件自动同步

发布时间:2024年01月16日

1、rsync介绍

rsync是类unix系统下的数据备份工具。其首先通过对数据文件进行块划分(通常512字节为一个数据块),然后计算每一个数据块的校验码(有两个校验码:一强一弱,弱校验码用来证明不同,强校验码用来证明相同),远程主机记录每次同步后各数据块的校验码,在下次同步时进行校验码的比较,依此来实现真正的增量备份。rsync的增量同步算法原理可参考下面这篇博客,里边有很详细的介绍。

rsync算法原理和工作流程分析 - 骏马金龙 - 博客园?www.cnblogs.com/f-ck-need-u/p/7226781.html?编辑

rsync有多种工作模式:

1)借用ssh推送或拉取文件(和scp的用法差不多),示例如下:

# 将本机/opt/test/目录下的所有内容同步至远程主机的/opt/test/目录下,但是rsync只支持向下创建一层目录
# 如果/opt/目录存在,则会在远程主机向下创建test目录,如果/opt/目录不存在,则会直接报错
rsync  -av /opt/test/ root@192.168.10.1:/opt/test/

2)作为客户端,拉取远程rsync服务test模块监控目录下的文件到本机的/opt/backup/test目录下,实例如下:

/usr/bin/rsync --port=8100 -avz --delete --password-file=/opt/rsync.pass iparking@192.168.10.1::test /opt/backup/test/

3)作为服务端(服务的搭建见下文),接收远程主机推送其/opt/source/test目录下的文件至test模块监控的目录下,实例如下:

/usr/bin/rsync -avz --delete /opt/source/test/ --port=8100 iparking@192.168.10.1::test  --password-file=/opt/rsync.pass

2、sersync介绍

sersync是借用inotify对文件系统的操作监控和rsync工具,实现文件的远程实时同步。

先简单介绍一下inotify,它是一个Linux的内核特性,通过inode实现对文件系统的监控,常见的事件监听类型有:

  • access:读取文件或目录内容
  • modify:修改文件或目录内容
  • attrib:文件或目录的属性改变
  • close_write:修改真实文件内容
  • close_nowrite:文件或目录关闭,在只读模式打开之后关闭的
  • close:文件或目录关闭,不管读或是写模式
  • open:文件或目录被打开
  • moved_to:文件或目录移动到
  • moved_from:文件或目录从移动
  • move:移动文件或目录移动到监视目录
  • create:在监视目录下创建文件或目录
  • delete:删除监视目录下的文件或目录
  • delete_self:文件或目录被删除,目录本身被删除

检验Linux内核是否支持inotify,通过以下命令:

grep CONFIG_INOTIFY_USER /boot/config-xxx
# 如果返回【CONFIG_INOTIFY_USER=y】,则代表支持inotify

sersync就是通过inotify机制实现对指定目录的实时监控,然后借用rsync客户端推送文件到指定的rsync服务端,实现文件的自动同步。

安装包下载地址:https://code.google.com/archive/p/sersync/downloads

3、实践操作

假设有A(192.168.10.1)、B(192.168.10.2)两台主机,A作为源文件存储主机,B作为备份主机。需要在B主机启动一个rsync服务,在A主机配置sersync。下面开始配置(均用root):

主机B配置(备份目录为/opt/backup_data,rsync服务根目录为/opt/rsync):

# 0、进入服务根目录,没有就创建
cd /opt/rsync
# 1、将用户名和密码写入密码文件,该文件权限必须是600
echo abc:123456 > rsyncd.secrets
chmod 600 rsyncd.secrets
# 2、完善配置文件(可参考/etc/rsyncd.conf)
cat >rsyncd.conf<<EOF
#数据传输所使用的用户,普通用户启动时不用指定
uid = root
#数据传输所使用的用户组,普通用户启动时不用指定
gid = root
#若为yes,需要用root权限进行chroot设置,将根映射到path参数路径下
use chroot = no
#并发连接数
max connections = 4
#进程号保存文件
pid file = /opt/rsync/rsyncd.pid
#日志文件
log file = /opt/rsync/rsyncd.log
#监听端口
port = 8100
#IP地址
address = 192.168.10.2
#是否允许客户端上传数据,yes表示不允许
read only = no
#允许连接服务器的账户,即密码文件中的用户
auth users = abc
#密码验证文件,仅在设置auth users后有效
secrets file = /opt/rsync/rsyncd.secrets
#允许同步主机列表
hosts allow =  192.168.10.1
#拒绝列表
hosts deny =  *
[test]
# test模块所监控的目录
path = /opt/backup_data
EOF
# 3、启动服务,可以查看8100端口是否启用判断服务是否启动成功
/usr/bin/rsync --daemon --config=/opt/rsync/rsyncd.conf

主机A配置(待同步目录为/opt/source_data,sersync服务根目录为/opt/sersync):

# 0、进入根目录,没有则创建
cd /opt/sersync
# 1、将至前下载的安装包解压至该目录(安装包中两个文件:sersync2和confxml.xml)
# 2、创建B主机rsync服务的密码文件,权限同样必须是600
echo 123456 > rsync.pass
chmod 600 rsync.pass
# 3、修改配置文件confxml.xml,替换<sersync>标记内的内容如下
<sersync>
        <!--指定本地待同步目录及远程rsync服务地址及模块名-->
        <localpath watch="/opt/source_data">
            <remote ip="192.168.10.2" name="test"/>
        </localpath>
        <rsync>
            <commonParams params="-artuz"/>
            <!--指定密码文件及端口号-->
            <auth start="true" users="abc" passwordfile="/opt/sersync/rsync.pass"/>
            <userDefinedPort start="true" port="8100"/>
            <timeout start="false" time="100"/>
            <ssh start="false"/>
        </rsync>
        <!--同步失败后,日志存放文件,每60分钟重试一次-->
        <failLog path="/opt/sersync/rsync_fail_log.sh" timeToExecute="60"/>
        <crontab start="false" schedule="600">
            <crontabfilter start="false">
            <exclude expression="*.php"></exclude>
            <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
        <plugin start="false" name="command"/>
    </sersync>
# 4、启动服务
/opt/sersync/sersync2 -r -d -o /opt/sersync/confxml.xml

至此,就可以实现当A主机/opt/source_data目录下的文件发生变化时,实时将变化同步至B主机的/opt/backup_data目录下。

同样,也可以在A主机搭建rsync服务,在B主机启动sersync,实现A、B主机的双向实时同步。

文章来源:https://blog.csdn.net/GGB_GG/article/details/135516295
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。