Rsync+inotify的优点:

使用rsync工具和inotify机制相结合,可以实现触发式部署(实时同步),只要原始(主)位置的文档发生变幻,则立即启用增量推送操作,否则处于静态等待状态,这样以来,就避免了分布式集群部署过程复杂的问题。

iontify缺点:

1.并发如果大于200个文件(10-100K),同步会有延迟

2.监控到事件后,调用rsync同步是单线程的(加&并发),sersync多进程同步

Rsync缺点:

sersync有重传机制(内置的定时任务),但是只重传一次,如果重传失败就会清空重传队列,即清空/tmp/rsync_fail_log.sh文件。这样就会造成sersync服务恢复正常后(即可以同步文件),数据同步的两个服务器数据不一致的现象因为,/tmp/rsync_fail_log.sh文件为空,而sersync只对发生变化的文件做实时同步。

架构图

rsync差异化传输_服务器

需要两台linux服务器:

Rsync-10 192.168.157.30 (数据接收方)

Rsync-20 192.168.157.40 (数据发送方)

注意先关闭防火墙和selinux

systemctl stop firewalld

setenforce 0

查看服务器的内核版本是否达到2.6

uname -r

检查是否有三个文件(如下):

ls /proc/sys/fs/inotify/

max_queued_events  max_user_instances  max_user_watches

配置数据接收方:

首先安装rsync:

yum install rsync

修改rsync的配置文件(配置如下):

Vim /etc/rsyncd.conf

uid = root

    gid = root

    use chroot = no

    max connections = 0

    ignore errors

    exclude = lost+found/

    log file = /var/log/rsyncd.log

    pid file = /var/run/rsyncd.pid

    lock file = /var/run/rsyncd.lock

    reverse lookup = no

    hosts allow = 192.168.157.0/24

[backup]

    path = /backup/

    comment = backup

    read only = no

    auth users = rsyncuser

secrets file = /etc/rsync.pass

创建一个共享的用户并且设置密码(注意我这边设置的密码为123):

useradd rsyncuser

passwd rsyncuser

生成验证文件,也就是把用户和密码加入到文件里面:

echo "rsyncuser:123" > /etc/rsync.pass

注意一定要给权限我这边给的是600:

chmod 600 /etc/rsync.pass

创建共享的目录(名字可以自定义,但是配置文件里path这块也需要改):

mkdir /backup

启动rsync服务:

rsync --daemon   #可加入/etc/rc.d/rc.local实现开机启动

systemctl start rsyncd

配置数据发送方:

将数据接收方创建用户的密码给写到文件里可以做到同步时不用再使用密码(注意也要给权限我这里给的600):

echo "123" > /etc/rsync.pass

chmod 600 /etc/rsync.pass

创建一个共享的目录:

mkdir /data/

测试是否可以同步到数据接收方:

先在阿里云里下载epel源:

网址:epel镜像_epel下载地址_epel安装教程-阿里巴巴开源镜像站 (aliyun.com)

先安装软件包:

yum -y install rsync inotify-tools

rsync -avz --password-file=/etc/rsync.pass /data/ rsyncuser@192.168.157.30::backup  #将本机的/data目录共享到192.168.157.30的backup的目录。

写脚本inotify_rsync.sh

vim inotify_rsync.sh

#!/bin/bash

SRC='/data/'

DEST='rsyncuser@192.168.157.30::backup'

inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do

FILEPATH=${DIR}${FILE}

rsync -az --delete --password-file=/etc/rsync.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log

done

inotifywait常见的命令选项及其说明:

rsync差异化传输_linux_02

--timefmt <fmt>时间格式

rsync差异化传输_rsync差异化传输_03

rsync差异化传输_linux_04

rsync差异化传输_数据_05