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