sersync+rsync实现文件自动同步

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主机的双向实时同步。

相关推荐
C++忠实粉丝23 分钟前
Linux环境基础开发工具使用(2)
linux·运维·服务器
康熙38bdc1 小时前
Linux 环境变量
linux·运维·服务器
存储服务专家StorageExpert1 小时前
DELL SC compellent存储的四种访问方式
运维·服务器·存储维护·emc存储
hakesashou2 小时前
python如何比较字符串
linux·开发语言·python
Ljubim.te2 小时前
Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】
linux·学习·centos
cooldream20092 小时前
Linux性能调优技巧
linux
大G哥2 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
醉颜凉2 小时前
银河麒麟桌面操作系统修改默认Shell为Bash
运维·服务器·开发语言·bash·kylin·国产化·银河麒麟操作系统
QMCY_jason3 小时前
Ubuntu 安装RUST
linux·ubuntu·rust
慕雪华年3 小时前
【WSL】wsl中ubuntu无法通过useradd添加用户
linux·ubuntu·elasticsearch