0
点赞
收藏
分享

微信扫一扫

数据同步工具Rsync+Inotify

Rsync

可以镜像保存整个目录树和文件系统

可以很容易做到保持原来文件的权限、时间、软硬链接等等

无须特殊权限即可安装

快速:第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件。rsync在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽

安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接支持匿名传输,以方便进行网站镜象

常用选项

-a, --archive       //归档
•    -v, --verbose       //详细模式
•    -q, --quiet         //静默模式
•    -r, --recursive     //递归
•    -p, --perms         //保持原有的权限属性
•    -z, --compress     //在传输时压缩,节省带宽,加快传输速度
•    --delete           //在源服务器上做的删除操作也会在目标服务器上同步

环境

机器

ip

软件

目录

master

192.168.50.60

rsync,inotify-tooks,脚本

/web1/wwwroot

Slave

192.168.50.61

rsync

/web1/wwwroot

安装使用

slave

yum -y install rsync

vim /etc/rsync.conf

pid file = /var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
[web1]
path = /web1/wwwroot
comment = web1 file
ignore errrors
read only=no
write only=no
hosts allow=*
hosts deny=192.168.60.10
list=false
uid=root
gid=root
auth users=web1user
secrets file=/etc/web1.pass

创建密码文件

(文件格式:user:pass)

/etc/web1.pass

web1user:www123
chmod 600 /etc/web1.pass

启动和自启

systemctl start rsyncd
systemctl enable rsyncd

master (发布节点)

安装

yum install rsync gcc -y
wget http://github.com/downloads/rvoicilas/inotify-tools/
tar xf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make && make install

密码文件

和节点服务器密码一致

vim /etc/server.pass
www123
chmod 600 /etc/server.pass

脚本编辑

#!/bin/bash
host1=192.168.50.61
src=/web/wwwroot/
dst1=web1
user1=web1user
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src  
| while read files
do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$host1::$dst1 > /dev/null 2>&1
    echo "${files} was rsynced." >> /tmp/rsync.log 2>&1
done

脚本放入后台执行  

在master上面的/web/wwwroot 添加 删除 修改文件

slave 上面的 /web1/wwwroot 会同步变化

inotifywait 单独分析

/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib /data/

执行上面命令,是让inotifywait监听/data/目录,当监听到有发生modify,create,delete,attrib等事件发生时,按%Xe %w%f的格式输出。

在/data/目录touch几个文件

touch /data/{1..5}

观看inotify输出

ATTRIB /data/1           -- 表示发生了ATTRIB事件 路径为/data/1
ATTRIB /data/2
ATTRIB /data/3
ATTRIB /data/4
ATTRIB /data/5

知道上面的输出效果之后 我们应该想得到,可以用rsync获取inotifywait监控到的文件列表来做指定的文件同步,而不是每次都由rsync做全目录扫描来判断文件是否存在差异。

inotify+rsync分析

#!/bin/bash 
/usr/bin/inotifywait -mrq --format '%w%f'-e create,close_write,delete /backup |while read file
do 
    cd /backup && rsync -az --delete /backup/ rsync_backup@192.168.24.101::backup/--password-file=/etc/rsync.password 
done

的rsync 每次都是全量的同步,而且 file列表是循环形式触发rsync ,等于有10个文件发生更改,就触发10次rsync全量同步),这样做 并不友善

这种方式不仅耗CPU还耗时,根本不可以做到实时同步。

改良方法

要做到实时,就必须要减少rsync对目录的递归扫描判断,尽可能的做到只同步inotify监控到已发生更改的文件。结合rsync的特性,所以这里要分开判断来实现一个目录的增删改查对应的操作。

脚本如下

#!/bin/bash
src=/data/                           # 需要同步的源路径
des=data                             # 目标服务器上 r
rsync_passwd_file=/etc/rsyncd.passwd            # rsync验证的密码文件
ip1=192.168.0.18                 # 目标服务器1
ip2=192.168.0.19                 # 目标服务器2
user=root                          
cd ${src}                             
/usr/local/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
do
        INO_EVENT=$(echo $file | awk '{print $1}')      
        INO_FILE=$(echo $file | awk '{print $2}')       
        echo "-------------------------------$(date)------------------------------------"
        echo $file
    
        if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]        
        then
                echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
                rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
                rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
        fi
       
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
        then
                echo 'DELETE or MOVED_FROM'
                rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
                rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
        fi
     
        if [[ $INO_EVENT =~ 'ATTRIB' ]]
        then
                echo 'ATTRIB'
                if [ ! -d "$INO_FILE" ]
                then
                        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&          
                        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                fi
        fi
done

每两小时做1次全量同步

因为inotify只在启动时会监控目录,他没有启动期间的文件发生更改,他是不知道的,所以这里每2个小时做1次全量同步,防止各种意外遗漏,保证目录一致。

crontab -e
* */2 * * * rsync -avz --password-file=/etc/rsync-client.pass /data/ root@192.168.0.18::data && rsync -avz --password-file=/etc/rsync-client.pass /data/ root@192.168.0.19::data

改良后百万级别的小文件也可以实现同步

inotify的参数说明

inotify介绍-- 是一种强大的、细颗粒的、异步的文件系统监控机制,内核从2.6.13起,加入Inotify可以监控文件系统中添加、删除、修改移动等各种事件,利用这个内核接口,就可以监控文件系统下文件的各种变化情况。

inotifywait 参数说明

参数名称

参数说明

-m,–monitor

始终保持事件监听状态

-r,–recursive

递归查询目录

-q,–quiet

只打印监控事件的信息

–excludei

排除文件或目录时,不区分大小写

-t,–timeout

超时时间

–timefmt

指定时间输出格式

–format

指定时间输出格式

-e,–event

后面指定删、增、改等事件

inotifywait events事件说明

事件名称

事件说明

access

读取文件或目录内容

modify

修改文件或目录内容

attrib

文件或目录的属性改变

close_write

修改真实文件内容

close_nowrite


close


open

文件或目录被打开

moved_to

文件或目录移动到

moved_from

文件或目录从移动

move

移动文件或目录移动到监视目录

create

在监视目录下创建文件或目录

delete

删除监视目录下的文件或目录

delete_self


unmount

卸载文件系统

优化 Inotify

在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制

[root@web ~]# ll /proc/sys/fs/inotify/
总用量0
-rw-r--r--1 root root 09月923:36 max_queued_events
-rw-r--r--1 root root 09月923:36 max_user_instances
-rw-r--r--1 root root 09月923:36 max_user_watches

max_user_watches #设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)

max_user_instances #设置每个用户可以运行的inotifywait或inotifywatch命令的进程数

max_queued_events #设置inotify实例事件(event)队列可容纳的事件数量

[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_user_watches -- 把他加入/etc/rc.local就可以实现每次重启都生效
[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_queued_events

附录:

Rsync的命令格式可以为以下六种:

1 rsync [OPTION]... SRC DEST
2 rsync [OPTION]... SRC [USER@]HOST:DEST
3 rsync [OPTION]... [USER@]HOST:SRC DEST
4 rsync [OPTION]... [USER@]HOST::SRC DEST
5 rsync [OPTION]... SRC [USER@]HOST::DEST
6 rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

对应于以上六种命令格式,rsync有六种不同的工作模式:

  1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。如:rsync -a /data /backup

  2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号”:”分隔符时启动该模式。如:rsync -avz *.c foo:src

  3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。如:rsync -avz foo:src/bar /data

  4)从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。如:rsync -av root@192.168.0.10::www /databack

  5)从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。如:rsync -av /databack root@192.168.0.10::www

  6)列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://192.168.0.10/www

举报

相关推荐

0 条评论